Невозможно загрузить общую библиотеку C в R

0

Я пытаюсь вызывать код C double_metaphone.c из R в окнах. Я знаком с R, но пока не пробовал C.

Я скомпилировал код и создал общую библиотеку следующим образом в окнах, используя Cygwin gcc включая файл заголовка double_metaphone.h

gcc -c double_metaphone.c
gcc -shared -o double_metaphone.dll double_metaphone.o

Я использовал dyn.load для загрузки DLL файла следующим образом

dyn.load("C:/R/double_metaphone.dll")

getLoadedDLLs() содержит список double_metaphone.dll, однако

is.loaded(double_metaphone.dll)

дает ошибку

Error in is.loaded(double_metaphone.dll) : 
  object 'double_metaphone.dll' not found

Когда я пытаюсь использовать .C() или .Call(), я получаю

Error in .C("double_metaphone") : 
  C symbol name "double_metaphone" not in load table

Я понимаю, что это проблема с кодом C++, как в Link1, Link, но почему я не могу получить доступ к общей библиотеке для вызова кода C из R? Где я иду не так?

Теги:
rcpp

2 ответа

1

Вам необходимо скомпилировать и связать с R для shared object использования shared object. например

$ gcc -I/YOUR_R_HOME_DIR/include -DNDEBUG -fpic -c double_metaphone.c -o double_metaphone.o

$ gcc -shared -o double_metaphone.dll double_metaphone.o -L/YOUR_R_HOME_DIR/lib -lR

Или просто

$ R CMD SHLIB double_metaphone.c

Как сказал Дирк, R-exts дает вам более подробную информацию.

И вы хотите рассмотреть Rcpp для написания скомпилированного кода в R, что приносит вам пользу в дальнейшем.

1

В соответствии с моим пониманием "is.loaded" проверяет загруженные символы. В соответствии с вашим заголовком вы можете попробовать:

is.loaded("DoubleMetaphone")

Вызов метода. пытаться:

.C("DoubleMetaphone", <your>, <arguments>)
  • 1
    Смотрите мой комментарий к вопросу ОП. Это сработало бы, если бы он правильно построил общую библиотеку, чего он не сделал.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню