Как связать со статическими библиотеками при сборке пакета R - PullRequest
3 голосов
/ 02 июня 2009

Я создаю пакет, который будет использоваться R (статистическая программа), я не эксперт, использующий это приложение, но мне удалось создать очень простой пакет, используя следующую логику, у меня есть некоторые классы в C ++, так как код должен быть скомпилирован с использованием компилятора R, и он допускает только код C, у меня есть код-обертка C, который вызывает методы C ++, а позже у меня есть скрипт R, который вызывает методы, предоставляемые C код, так что в основном это сообщение, как R <-> C <-> C ++.

Полный учебник, который я использовал для создания этого пакета, найден здесь , я добавляю его как ссылку.

Теперь моя проблема в том, что мне нужно добавить некоторые функциональные возможности в пакет, который я уже создал, что мне нужно сделать, это добавить код для позднего связывания с COM-объектом, который является другим продуктом, который я создал и который зарегистрирован с использованием инструмент для регазм.

Это код на C ++, который я использую для поздней привязки к объекту COM, я пытаюсь использовать IDispatch для этого:

{
...
CLSID clsid;    
HRESULT hr = CLSIDFromProgID((WCHAR*)"My Com object ProgId", &clsid);
if(FAILED(hr))                      
  return;   
...     
}

Я не вставил весь код, потому что только с этими строками компилятор доставляет мне проблемы, команда, которую я использую для компиляции, -

R CMD SHLIB Cclass.cc C++class.cc

Где "Cclass.cc" содержит код C, который вызывает методы c ++, а "C ++ class.cc" фактически код C ++.

Когда я компилирую эти классы, компилятор говорит:

<code>"undefined reference to `CLSIDFromProgID@8'collect2: ld returned 1 exit status"

Я уверен, что добавил все необходимые мне заголовочные файлы, поэтому я считаю, что моя проблема в том, что я не включаю ole32.lib и oleaut32.lib, которые являются статическими библиотеками.

Итак, мой вопрос: как я могу включить эти библиотеки, чтобы иметь возможность использовать методы для позднего связывания, такие как CLSIDFromProgID (...) или QueryInterface (...). Также, если кто-то считает, что моя проблема не в связывании этих библиотек, а в чем-то еще, было бы замечательно, если бы мне указали, в чем может заключаться моя проблема.

Также имейте в виду, что мне нужно связать эти статические библиотеки так, чтобы они могли без проблем компилироваться компилятором R, который, если я не ошибаюсь, является просто компилятором c.

1 Ответ

2 голосов
/ 02 июня 2009

Я не пытался делать это с C / C ++, а с Fortran. У меня была похожая проблема в том, что некоторые стандартные библиотеки ввода-вывода не были включены в библиотеку, которую я создал. В конце я просто включил их все и скомпилировал с использованием компилятора Фортрана. Я не использовал ни одну из утилит компилятора R, просто скомпилировал, как если бы я компилировал статическую библиотеку Fortran, обычно для использования с чем-либо еще. Это работало нормально.

Путь отладки может состоять в том, чтобы скомпилировать как статическую библиотеку, используя gcc (или что вы используете), затем попытаться включить и вызвать эту статическую библиотеку из другой программы на C, а затем, если это работает, попробуйте R.

Надеюсь, это полезно, писать эти пакеты R довольно сложно, если вы не используете vanilla C или Fortran, насколько я могу судить.

...