Моя цель состоит в том, чтобы создать пакет на R с кодом C ++: так что мои вопросы, как?
Я следую за учебником http://www.stat.columbia.edu/~gelman/stuff_for_blog/AlanRPackageTutorial.pdf на создание пакета R, содержащего код C ++. Конкретный код, который я пытаюсь скомпилировать и упаковать, в точности соответствует описанию в руководстве.
R CMD SHLIB, похоже, работает над созданием .dll-файла.
Я могу загрузить в R с помощью dyn.load () и проверить его на смоделированных данных (как описано в руководстве)
R CMD INSTALL — вот где начинается проблема. Я сделал две вещи, столкнувшись с двумя ошибками, предположительно связанными:
1) В учебнике говорится, что файл NAMESPACE должен содержать код:
useDynLib(XDemo)
export(XDemoAutoC)
Когда это происходит, сбой CMD INSTALL приводит к ошибке:
Ошибка в inDL (x, as.logical (local), as.logical (now), …): невозможно
загрузить общий объект ‘C: /…/ libs / i386 / XDemo.dll’: ошибка загрузки библиотеки:
1% не является действительной Win32-программой
2) Удаление вышеупомянутых строк в файле NAMESPACE приведет к установке пакета. Я могу успешно загрузить его в R, но когда я пытаюсь использовать функцию R, которая делает вызов .C () для функции, написанной на C ++, у меня возникает другая ошибка:
library(newpackage)
ls(package:newpackage)
[[1]] "XDemoAutoC"Warning message:
In ls(package:newpackage) :
‘package:newpackage’ converted to character string
XDemoAutoC(c(1,2,3,4))
Error in .C("DemoAutoCor", OutVec = as.double(vector("numeric", OutLength)), :
C symbol name "DemoAutoCor" not in load table
Я использую версию R2.15.2 в 64-битной Windows и использую бит R64.
Я прочитал следующий пост с похожей проблемой:
http://r.789695.n4.nabble.com/Include-C-DLL-error-in-C-symbol-name-not-in-load-table-td3464021.html
За исключением того, что они ничего не упоминают о материальном пространстве.
Также я читаю этот пост:
Проблема с загрузкой скомпилированного кода C в R x64 с использованием dyn.load
Поэтому я думаю: если я могу использовать dyn.load () в Rx64, это означает, что я успешно создал x64 .dll. Предполагая, что файл NAMESPACE должен быть оставлен как в учебнике — надеюсь, исправление >> not in load table<< ошибка — это будет означать, что я должен сосредоточиться на решении первой проблемы. Эта проблема, кажется, вызвана чем-то связанным с 32-битным. Я использовал Dependency Walker для файла .dll, но я не уверен, как интерпретировать результаты
У меня действительно нет никаких идей о том, как решить эту проблему, поэтому любые предложения о том, что делать, будут приветствоваться?
Я думаю, что вы делаете это неправильно. Два быстрых предложения:
Прочитайте Написание расширений R Руководство написано, чтобы объяснить только это: написание R расширений в том числе с скомпилированным кодом
Посмотри на Rcpp который делает расширения R и C ++, включая сборку пакетов намного проще. Или так мы думаем. Написать пакет так же просто, как позвонить Rcpp.package.skeleton()
, Документация в 1) еще поможет.
Тем не менее, если R CMD INSTALL
терпит неудачу у вас может быть некоторая путаница $PATH
, Никогда не смешивайте MinGW и Cygwin. Убедитесь, что библиотеки Cygwin DLL не найдены при сборке или вызове R. Порядок путей имеет значение значительно. Смотрите руководство для деталей.
Других решений пока нет …