Travis CI 使用 C++、Rcpp 和 RcppArmadillo 的 R 包构建错误
Travis CI build error with my R package that uses C++, Rcpp and RcppArmadillo
这是我的 R package
的 GitHub 回购
我已经能够在 Windows、MacOS 和具有 devtools::install_github("ntthung/ldsr")
的 Linux 集群上从源代码安装此软件包
我正在尝试集成 Travis CI,但在构建时,我收到以下错误
Error: package or namespace load failed for ‘ldsr’ in dyn.load(file, DLLpath = DLLpath, ...): unable to load shared object '/tmp/RtmpK7z3X6/Rinst2ef05609c709/00LOCK-ldsr/00new/ldsr/libs/ldsr.so':/tmp/RtmpK7z3X6/Rinst2ef05609c709/00LOCK-ldsr/00new/ldsr/libs/ldsr.so: undefined symbol: 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。
请帮忙!谢谢。
这看起来像是没有正确的 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 软件包的来源通常也是一个好主意——它们都在用户 cran
.
下的 GitHub 上
这是我的 R package
的 GitHub 回购我已经能够在 Windows、MacOS 和具有 devtools::install_github("ntthung/ldsr")
我正在尝试集成 Travis CI,但在构建时,我收到以下错误
Error: package or namespace load failed for ‘ldsr’ in dyn.load(file, DLLpath = DLLpath, ...): unable to load shared object '/tmp/RtmpK7z3X6/Rinst2ef05609c709/00LOCK-ldsr/00new/ldsr/libs/ldsr.so':/tmp/RtmpK7z3X6/Rinst2ef05609c709/00LOCK-ldsr/00new/ldsr/libs/ldsr.so: undefined symbol: 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。
请帮忙!谢谢。
这看起来像是没有正确的 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 软件包的来源通常也是一个好主意——它们都在用户 cran
.