Как установить связь со статическими библиотеками при создании R-пакета

StackOverflow https://stackoverflow.com/questions/937346

Вопрос

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

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

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

Это код на 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 ++.

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

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

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

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

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

Это было полезно?

Решение

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top