Как установить связь со статическими библиотеками при создании R-пакета
-
06-09-2019 - |
Вопрос
Я создаю пакет, который будет использоваться 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, насколько я могу судить.