【问题标题】:Travis CI build error with my R package that uses C++, Rcpp and RcppArmadilloTravis CI 使用我的使用 C++、Rcpp 和 RcppArmadillo 的 R 包构建错误
【发布时间】:2020-01-02 10:43:53
【问题描述】:

这是我的R package 的 GitHub 代码库

我已经能够在 Windows、MacOS 和带有devtools::install_github("ntthung/ldsr") 的 Linux 集群上从源代码安装这个包

我正在尝试集成 Travis CI,并在构建时收到以下错误

错误:dyn.load(file, DLLpath = DLLpath, ...) 中“ldsr”的包或命名空间加载失败:无法加载共享对象“/tmp/RtmpK7z3X6/Rinst2ef05609c709/00LOCK-ldsr/00new/ldsr /libs/ldsr.so':/tmp/RtmpK7z3X6/Rinst2ef05609c709/00LOCK-ldsr/00new/ldsr/libs/ldsr.so:未定义符号:dpotrf_

我发现dpotrf_ 属于一个名为libflame 的库。所以我用te命令Sys.setenv("PKG-LIBS"="-llibflame")制作了文件Rload.R并将以下内容添加到.travis.yml

script:
    - Rscript Rload.R
    - R CMD build . --compact-vignettes=gs+qpdf
    - R CMD check *tar.gz --as-cran

但我仍然遇到同样的错误。

我的包使用 Rcpp 和 RcppArmadillo。

请帮忙!谢谢。

【问题讨论】:

    标签: r travis-ci rcpp rcpparmadillo


    【解决方案1】:

    这看起来像是没有正确的src/Makevars 的基本错误,因为例如 RcppArmadillo.package.skeleton() 和其他人会创建。

    因此,作为第一次基本修复尝试,从 RcppArmadillo 复制文件 inst/skeleton/Makevars,其中包含

    ## With R 3.1.0 or later, you can uncomment the following line to tell R to 
    ## enable compilation with C++11 (where available)
    ##
    ## Also, OpenMP support in Armadillo prefers C++11 support. However, for wider
    ## availability of the package we do not yet enforce this here.  It is however
    ## recommended for client packages to set it.
    ##
    ## And with R 3.4.0, and RcppArmadillo 0.7.960.*, we turn C++11 on as OpenMP
    ## support within Armadillo prefers / requires it
    CXX_STD = CXX11
    
    PKG_CXXFLAGS = $(SHLIB_OPENMP_CXXFLAGS) 
    PKG_LIBS = $(SHLIB_OPENMP_CXXFLAGS) $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS)
    

    你确实复制了 Windows 变体 Makevars.win 你只是忘记了主要的。

    dpotrf_ 是一个标准的 LAPACK 符号,因此对于更有经验的用户来说,这个错误是一个明显的错误(这个问题也可能是重复的)。此外,使用 RcppArmadillo 查看 600 多个其他 CRAN 包的来源通常也是一个好主意——它们都在 GitHub 上,用户为 cran

    【讨论】:

    • 非常感谢,德克!在 Linux 集群上安装软件包时,我遇到了类似的错误,但使用 dgels_,我能够使用 Sys.setenv("PKG-LIBS"="-llapack") 修复它,这要感谢另一个问题。但我无法在这里做类似的事情。我认为添加Makevars 从根本上解决了这个问题。我不知道为什么它没有与Makevars.win 一起被复制。再次感谢。
    • @Drumy:我很高兴这有帮助,但 它仍然是错误的。每个 RcppArmadillo 包都应该有上面的三行,只需复制 src/Makevars 即可自动获得它——无需手动 Sys.setenv()。我会重新考虑,和/或从新的RcppArmadillo.package.skeleton("quickTest") 开始测试。
    • 要跟进这一点,即使文件完全复制,我仍然会遇到同样的错误。不知道为什么会这样,但如果我想不通,可能会发帖。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多