在Windows上创建包含C ++的R包
我的目标是使用C ++代码在R中创建一个包:所以我的问题是如何?
我正在学习关于创建包含C ++代码的R包的教程http://www.stat.columbia.edu/~gelman/stuff_for_blog/AlanRPackageTutorial.pdf。 试图编译和打包的特定代码与教程中描述的完全相同。
R CMD SHLIB似乎正在创建.dll文件。 我可以使用dyn.load()加载R并在模拟数据上测试它(如教程中所述)
R CMD INSTALL是问题开始的地方。 我做了两件事,遇到了两种不同的错误:
1)教程说NAMESPACE文件应该包含代码:
useDynLib(XDemo)
export(XDemoAutoC)
当它确实R CMD INSTALL失败导致错误:
错误inDL(x,as.logical(local),as.logical(now),...):无法加载共享对象'C:/.../ libs / i386 / XDemo.dll':Loadlibrary失败: 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
我在Windows 64位上运行版本R2.15.2并使用R64位。
我阅读了以下类似问题的帖子:http://r.789695.n4.nabble.com/Include-C-DLL-error-in-C-symbol-name-not-in-load-table-td3464021。 HTML
除了他们没有提到NAMESPACE的问题。
我也读过这篇文章:使用dyn.load在R x64中加载编译后的c代码的问题
所以我在想:基于我能够在Rx64中使用dyn.load()的事实意味着我已经成功创建了x64 .dll。 假设NAMESPACE文件应该保留在教程中 - 希望将>>不加载到加载表<<错误 - 这意味着我应该重点解决问题一。 这个问题似乎是由与32位相关的事情引起的。 我在.dll文件上使用了Dependency Walker,但我不确定如何解释结果
对于如何解决这个问题,我真的没有任何想法,所以任何关于做什么的建议都会受到欢迎?
我认为你做错了。 两个快速建议:
阅读Writing R Extensions手册来解释这一点:编写包含编译代码的R扩展
看看使R和C ++扩展的Rcpp,包括构建软件包变得更容易。 或者我们认为。 编写一个包就像调用Rcpp.package.skeleton()
一样简单。 1)中的文档仍然有帮助。
也就是说,如果R CMD INSTALL
失败,那么您的$PATH
可能会有一些混淆。 永远不要混合MinGW和Cygwin。 确保在构建或调用R时没有找到Cygwin DLL。路径顺序非常重要。 详情请参阅手册。