【发布时间】:2013-06-14 21:32:26
【问题描述】:
通过 Rcpp.package.skeleton 使用默认的 hello world 程序,我“有时”会在安装时收到此错误。
dyn.load(file, DLLpath = DLLpath, ...) 中的错误: 无法加载共享对象'/home/usrname/R/x86_64-pc-linux-gnu-library/3.0/helloWorld/libs/helloWorld.so':/home/usrname/R/x86_64-pc-linux-gnu-library /3.0/helloWorld/libs/helloWorld.so:未定义符号:_ZTIN4Rcpp7RObjectE。
有时我的意思是,在大约 10 次尝试中,只有一次在第一次安装时出现了该错误,尽管最后经过一些调整,每个包最终都会出现错误,即使所有更改都已从代码中删除,并且所有.o,.so 和 tar 文件被删除,库在 R 中被卸载,包将不会再次构建。
我的最终目标是使用 -lz 编译选项将一些 zlib 函数包含到一些代码中,所以当我对 hello_world 说“一些调整”时,它们会是:
1. 将 -lz 添加到 Makevars 中的 PKG_LIBS 变量
2.在.cpp文件中添加#include
3. 创建一个 const char* a
4.尝试用a调用gzopen(a,a)
我的流程是
1. 在 R 中:Rcpp.package.skeleton("testPackage", attributes = TRUE)
2.在终端:R CMD build testPackage
3.在终端:R CMD INSTALL testPackage
上次只是为了测试一个,我编译好了,我添加了 -lz 并没有问题,然后我添加了#include,我得到了错误。我将其删除,但仍然出现错误。
所以:
1.有谁知道是什么导致了这个错误?
2. 有没有办法修复它以便重新安装恢复的代码?
3.如果没有,有没有另一种方法可以将zlib构建到代码中(sourceCpp似乎可以正常工作)。
我使用的是 Ubuntu 12.04.2 LTS
R 版本 3.01
rcpp_0.10.3
更新解决方案:
在编辑 Makevars 时,我无意中在变量周围添加了一组额外的引号:
PKG_LIBS = "$/usr/bin/Rscript -e "Rcpp:::LdFlags()" -lz"
包含 zlib 的正确方法是将 -lz 附加到该行:
PKG_LIBS = $/usr/bin/Rscript -e "Rcpp:::LdFlags()" -lz
如果您尝试将 Makevars 恢复为正确的格式,那么一旦您收到错误仍然是正确的,您将继续在安装时收到错误。而且有时(我的测试运行中的 2/6)它仍然会安装错误,只是稍后在将 zlib 函数包含或添加到代码中时才会弹出。
【问题讨论】: