Моя конечная цель - вызвать некоторые функции C ++ изнутри R, вот MNWE, где я сталкиваюсь с препятствиями. Если я правильно читаю комнату, мне кажется, что при вызове моей функции с помощью .Call
у меня возникает ошибка, но когда я вызываю ее с .C
, все работает нормально.
Вот моя короткая функция C ++
// test.cpp
#include <iostream>
extern "C" void fnTest() {
std::cout << "Hello" << std::endl;
}
Который я затем скомпилировал с
R CMD SHLIB -o test.so test.cpp
, который дал следующий вывод:
g++ -std=gnu++11 -shared -L/usr/lib64/R/lib -Wl,-O1,--sort-common,--as-needed,-z,relro,-z,now -o te
st.so test.o -L/usr/lib64/R/lib -lR
Теперь внутри RI сделал
> dyn.load("test.so")
> .C("fnTest")
Hello
list()
> .Call("fnTest")
Hello
*** caught segfault ***
address 0x30, cause 'memory not mapped'
Possible actions:
1: abort (with core dump, if enabled)
2: normal R exit
3: exit R without saving workspace
4: exit R saving workspace
Selection:
Документация, которую я прочитал для этих двух функций, здесь и, похоже, не указывает на большую разницу в формате вызова этих двух функций. Я попробовал несколько других вариантов (например, я был в состоянии успешно передать аргументы .C
, но не .Call
) и не имел никакого успеха.
Как правильно .Call
функция C ++ изнутри R?
Некоторые замечания по моему возможному варианту использования, помимо этого минимального примера, надеюсь, это не проблема XY : у меня есть проект со многими сложными зависимостями, которые я знаю, как построить с CMake, но не напрямую из g ++. Я смог создать из этого проекта общую библиотеку, которую затем мог бы связать с общей библиотекой «R-совместимый» (R CMD SHLIB -o test.so test.cpp -L/path/to/my/lib/ -l my_lib_name
), которую я смог dyn.load()
добавить в свою среду R. В этот момент я столкнулся с проблемой .C
против .Call
.