Ошибка вызова функции C ++ из R - библиотека загружается, но функция отсутствует в таблице - PullRequest
0 голосов
/ 11 ноября 2018

Вот код C:

// a.cpp
void double_me(int* x) {
  // takes a numeric input and doubles it
  *x = *x + *x;
}

Я компилирую код с

>R CMD SHLIB a.cpp

После этого я запускаю R и набираю следующие команды:

 dinfo <- dyn.load("a.so")
 .C("double_me",x=2)

Это заканчивается ошибкой: "double_me" нет в списке.

Теперь вопрос: dyn.load работает отлично, dinfo содержит:

Имя DLL: имя файла: /Users/myusername/a.so Динамический поиск: TRUE

Но функции нет на столе:

is.loaded ( "double_me") [1] FALSE

Как это могло случиться? Это происходит в macOS.

1 Ответ

0 голосов
/ 11 ноября 2018

Это потому, что вы используете a.cpp; Имена функций C ++ "искажены" компилятором. Вы можете использовать тот же код с именем файла a.c, скомпилировав его так же, как вы это сделали, и получить от R следующее:

> dinfo <- dyn.load("a.so")
>  .C("double_me",x=2)
$x
[1] 2

Или, альтернативно, вы можете добавить эту строку в начало a.cpp:

extern "C" void double_me(int* x);

и получите от R следующее:

> dinfo <- dyn.load("a.so")
>  .C("double_me",x=2)
$x
[1] 2

Обновление: почему результат был выше 2?

Если вы не приведете аргумент к нужному типу, может быть сделана копия, так что ваше исходное значение не будет изменено; если мы приведем значение к целому числу, как и при использовании .C(), мы получим ожидаемый результат:

> dyn.load("a.so")
> .C("double_me", x = as.integer(2))
$x
[1] 4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...