我的目标是用 C++ 代码在 R 中创建一个包:所以我的问题是如何?
我正在按照教程http://www.stat.columbia.edu/~gelman/stuff_for_blog/AlanRPackageTutorial.pdf创建包含 C++ 代码的 R 包。我试图编译和打包的具体代码与教程中描述的完全一样。
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”:加载库失败: 1% 不是有效的 Win32 程序
2) 删除 NAMESPACE 文件中的上述行将导致安装包。我可以在 R 中成功加载它,但是当我尝试使用对 C++ 编写函数进行 .C() 调用的 R 函数时,出现另一个错误:
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
除了他们没有提到命名空间问题。
我还阅读了这篇文章: Problem with loading compiled c code in R x64 using dyn.load
所以我在想:基于我能够在 Rx64 中使用 dyn.load() 的事实意味着我已经成功创建了 x64 .dll。假设 NAMESPACE 文件应该保留在教程中 - 希望修复 >>not in load table<< 错误 - 这意味着我应该专注于解决问题一。这个问题似乎是由与 32 位相关的东西引起的。我在 .dll 文件上使用了 Dependency Walker,但我不确定如何解释结果
我真的对如何解决这个问题没有任何想法,所以欢迎任何关于如何做的建议?