1

通过 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 var
2. 将 #include 添加到.cpp 文件
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 函数包含或添加到代码中时才会弹出。

4

1 回答 1

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;
}

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

于 2013-06-15T03:16:09.283 回答