【问题标题】:RCPP error: undefined symbol: _ZTIN4Rcpp7RObjectE on package installRCPP 错误:未定义的符号:安装包上的 _ZTIN4Rcpp7RObjectE
【发布时间】: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 函数包含或添加到代码中时才会弹出。

【问题讨论】:

    标签: r zlib rcpp


    【解决方案1】:

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

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

    【讨论】:

    • 我的变更列表中的第 1 项是修改包中的 Makevars 文件以包含 -lz,如您所提到的。前几次这是错误的触发因素。但至少有一次我添加它并编译它,然后在剩余的更改之一上出错。但是我可以假设将 -lz 添加到 PKG_LIBS 对某人允许使用 zlib 函数有效(我第一次使用该参数编译我的代码时,我看到了一个错误,从那时起,我看到了一个错误,类似于 'gzopen' undefined我什至在得到正常编译错误之前就得到了上述错误)
    • 我不知道你在这里想说什么。如果您可以通过可重现示例澄清您的帖子,我可能会提供帮助。
    • 我试图制作一个测试日志,但我发现了相当简单的答案并将更新帖子。可能仍然值得注意的是,由于我的错误,它“有时”会导致错误,有时在创建错误之前允许进行一些更改和重新安装。此外,我仍然有一个问题,即一旦创建错误,您就无法恢复并安装,但这可能是一个有争议的问题。
    猜你喜欢
    • 2012-05-16
    • 1970-01-01
    • 2014-07-12
    • 1970-01-01
    • 1970-01-01
    • 2019-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多