RCPP错误:包安装时未定义的符号:_ZTIN4Rcpp7RObjectE

时间:2013-06-14 21:32:26

标签: r zlib rcpp

通过Rcpp.package.skeleton使用默认的hello world程序我有时会在安装时遇到此错误。

dyn.load中的错误(文件,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: undefined symbol:_ZTIN4Rcpp7RObjectE。

有时候我的意思是,在大约10次尝试中只有一次它在第一次安装时得到了该错误,尽管最终经过一些调整后每个包最终都会出错,即使所有更改都从代码中删除了所有删除了.o,.so和tar文件,并且在R中卸载了库,该包将不再生成。

我的最终目标是使用-lz编译选项将一些zlib函数包含到某些代码中,所以当我对hello_world说'some tweaks'时,它们将是:
1.将-lz添加到Makevars的PKG_LIBS var中 2.将#include添加到.cpp文件中 3.创建一个const char * a
4.尝试使用a来调用gzopen(a,a)

我的流程是
1.在R中:Rcpp.package.skeleton(“testPackage”,属性= TRUE)
2.在终端:R CMD构建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函数包含或添加到代码中时弹出。

1 个答案:

答案 0 :(得分:3)

我的RcppCNPy包使用zlib。它使用

 PKG_LIBS = `$(R_HOME)/bin/Rscript -e "Rcpp:::LdFlags()"` -lz

并且代码为

cnpy::NpyArray cnpy::npy_gzload(std::string fname) {
    gzFile fp = gzopen(fname.c_str(), "rb");
    if(!fp) {
        Rf_error("npy_gzload: Error! Unable to open file %s!\n",fname.c_str());
    }
    NpyArray arr = gzload_the_npy_file(fp);
    gzclose(fp);
    return arr;
}

也许这可以作为你的榜样。