2013-03-27 3 views
2

Моя цель - создать пакет в R с кодом на C++. Так мои вопросы: как?Создание пакета R, содержащего C++ в Windows

Я следую учебнику http://www.stat.columbia.edu/~gelman/stuff_for_blog/AlanRPackageTutorial.pdf о создании пакета R, содержащего код на C++. Конкретный код Im, пытающийся скомпилировать и упаковать, точно так же, как описано в учебнике.

R CMD SHLIB, похоже, работает с созданием DLL-файла. Я могу загрузить в R с помощью dyn.load() и протестировать его на смоделированных данных (как описано в учебнике)

R CMD INSTALL, где проблема начинается. Я сделал две вещи сталкиваетесь при двух различных ошибок, предположительно связанных:

1) В учебнике говорится в файле NAMESPACE должен содержать код:

useDynLib(XDemo) 
export(XDemoAutoC) 

Когда это R CMD INSTALL сбой приводит к ошибке:

Error in inDL(x,as.logical(local), as.logical(now),...): unable to load shared object 'C:/.../libs/i386/XDemo.dll': Loadlibrary failure: 1% is not a valid Win32-program

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 

Im работает версия R2.15.2 на окнах 64- бит и использование бит R64.

Я прочитал следующий пост с подобной проблемой: http://r.789695.n4.nabble.com/Include-C-DLL-error-in-C-symbol-name-not-in-load-table-td3464021.html

За исключением они не упоминают ничего о NAMESPACE материи.

Также я прочитал этот пост: Problem with loading compiled c code in R x64 using dyn.load

Так что я имею в виду: что на основании того, что я в состоянии использовать dyn.load() в Rx64 означает, что я успешно создали x64 .dll. Предполагая, что файл NAMESPACE должен быть оставлен как в учебнике - надеюсь, что исправление >> не в таблице загрузки < Ошибка < - это будет означать, что я должен сосредоточиться на решении проблемы один. Эта проблема, похоже, вызвана тем, что связано с 32-битным. Я использовал Dependency Walker в DLL-файле, но я не уверен, как интерпретировать результаты. enter image description here

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

+0

В какой архитектуре вы компилируете? В вашем вопросе упоминаются как 32-разрядные (i386), так и 64-разрядные (x64). –

+0

Я нахожусь на этом без формальной подготовки по обработке компьютеров. Но я считаю, что оба они (предполагая, что i386 и x64 являются экземплярами архитектур). Поскольку созданный пакет содержит как папку i386, так и x64, я также могу загрузить созданную библиотеку в R32 и найти функцию в пакете. Но снова используя функцию, я получаю >> не в loadtable << ошибка. – user2055639

+1

Использует ли R R CMD INSTALL использовать R32 или R64? Возможно, вам нужно выполнить эту команду дважды, один раз для каждого. Вы используете Visual C++ для создания модуля? Запустите 'dumpbin/headers' в DLL, чтобы увидеть, какая архитектура они на самом деле. –

ответ

2

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

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

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

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

+0

Я пробовал несколько указаний по пути, указанных в соответствии с требованиями, приведенными в Приложении D к [R Installation and Administration] (http://cran.r-project.org/doc/manuals/R-admin.html). Также я успешно установил >> mypackage <<, описанный в [Написание пакета, который использует Rcpp] (http://dirk.eddelbuettel.com/code/rcpp/Rcpp-package.pdf). – user2055639

+0

однако я согласен с вашим вторым моментом и поэтому буду в будущем тратить свое время на изучение Rcpp-пакета. – user2055639

Смежные вопросы