2

我的目标是用 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,但我不确定如何解释结果在此处输入图像描述

我真的对如何解决这个问题没有任何想法,所以欢迎任何关于如何做的建议?

4

1 回答 1

2

我认为你做错了。两个快速建议:

  1. 阅读编写 R 扩展手册来解释这一点:编写 R 扩展,包括那些带有编译代码的扩展

  2. 看看Rcpp,它使 R 和 C++ 扩展,包括包构建变得更加容易。或者我们认为。编写一个包就像调用Rcpp.package.skeleton(). 1) 中的文档仍然有帮助。

也就是说,如果R CMD INSTALL失败,您的$PATH. 永远不要混合 MinGW 和 Cygwin。确保在构建或调用 R 时没有找到 Cygwin DLL。路径顺序非常重要。有关详细信息,请参阅手册。

于 2013-03-28T01:50:07.013 回答