Моя цель - создать пакет в 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-файле, но я не уверен, как интерпретировать результаты.
У меня действительно нет никаких идей относительно того, как исправить эту проблему, поэтому любое предложение о том, что делать, приветствуется?
В какой архитектуре вы компилируете? В вашем вопросе упоминаются как 32-разрядные (i386), так и 64-разрядные (x64). –
Я нахожусь на этом без формальной подготовки по обработке компьютеров. Но я считаю, что оба они (предполагая, что i386 и x64 являются экземплярами архитектур). Поскольку созданный пакет содержит как папку i386, так и x64, я также могу загрузить созданную библиотеку в R32 и найти функцию в пакете. Но снова используя функцию, я получаю >> не в loadtable << ошибка. – user2055639
Использует ли R R CMD INSTALL использовать R32 или R64? Возможно, вам нужно выполнить эту команду дважды, один раз для каждого. Вы используете Visual C++ для создания модуля? Запустите 'dumpbin/headers' в DLL, чтобы увидеть, какая архитектура они на самом деле. –