Создание пакета R, содержащего C ++ в Windows

Моя цель состоит в том, чтобы создать пакет на 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, но я не уверен, как интерпретировать результаты введите описание изображения здесь

У меня действительно нет никаких идей о том, как решить эту проблему, поэтому любые предложения о том, что делать, будут приветствоваться?

2

Решение

Я думаю, что вы делаете это неправильно. Два быстрых предложения:

  1. Прочитайте Написание расширений R Руководство написано, чтобы объяснить только это: написание R расширений в том числе с скомпилированным кодом

  2. Посмотри на Rcpp который делает расширения R и C ++, включая сборку пакетов намного проще. Или так мы думаем. Написать пакет так же просто, как позвонить Rcpp.package.skeleton(), Документация в 1) еще поможет.

Тем не менее, если R CMD INSTALL терпит неудачу у вас может быть некоторая путаница $PATH, Никогда не смешивайте MinGW и Cygwin. Убедитесь, что библиотеки Cygwin DLL не найдены при сборке или вызове R. Порядок путей имеет значение значительно. Смотрите руководство для деталей.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]