创建 R 包时出错:dyn.load(文件,DLLpath = DLLpath,...)中出错
Error creating R package: Error in dyn.load(file, DLLpath = DLLpath, ...)
我正在创建一个名为 CVOC 的 R 包。它包含 C++ 代码并使用来自 C 库 gmp 的高精度算法。
包将通过以下步骤创建:
1) 使用Rcpp::Rcpp.package.skeleton 创建包骨架。
2) 将所需文件(例如 DESCRIPTION、NAMESPACE、Makevars 等)复制到正确的文件夹中
3) 使用 roxygen2::roxygenise() 创建 .Rd 文档文件
4) 使用 R CMD 检查检查 R 包
5) 使用 R CMD 构建构建 R 包
当我 运行 R CMD 检查 "CVOC" 时出现以下错误消息:
* installing *source* package ‘CVOC’ ...
** libs
g++ -std=c++11 -I/usr/share/R/include -DNDEBUG -I"/home/fabian/R/x86_64-pc-linux-gnu-library/3.2/Rcpp/include" -I"/home/fabian/R/x86_64-pc-linux-gnu-library/3.2/RcppMP/include" -I"/home/fabian/R/x86_64-pc-linux-gnu-library/3.2/BH/include" -fpic -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -g -c RcppExports.cpp -o RcppExports.o
g++ -std=c++11 -I/usr/share/R/include -DNDEBUG -I"/home/fabian/R/x86_64-pc-linux-gnu-library/3.2/Rcpp/include" -I"/home/fabian/R/x86_64-pc-linux-gnu-library/3.2/RcppMP/include" -I"/home/fabian/R/x86_64-pc-linux-gnu-library/3.2/BH/include" -fpic -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -g -c etcND.cpp -o etcND.o
g++ -std=c++11 -shared -L/usr/lib/R/lib -Wl,-Bsymbolic-functions -Wl,-z,relro -o CVOC.so RcppExports.o etcND.o -L/usr/lib/R/lib -lR
installing to /home/fabian/Desktop/CVOCcreate/CVOC.Rcheck/CVOC/libs
** R
** preparing package for lazy loading
** help
*** installing help indices
** building package indices
** testing if installed package can be loaded
Error in dyn.load(file, DLLpath = DLLpath, ...) :
unable to load shared object '/home/fabian/Desktop/CVOCcreat/CVOC.Rcheck /CVOC/libs/CVOC.so':
/home/fabian/Desktop/CVOCcreate/CVOC.Rcheck/CVOC/libs/CVOC.so:
undefined symbol: __gmp_bits_per_limb
Error: loading failed
Execution halted
ERROR: loading failed
* removing ‘/home/fabian/Desktop/CVOCcreate/CVOC.Rcheck/CVOC’
包括 bash 脚本 createCVOC.sh 在内的所有必要文件都可以在 github 存储库中找到 https://github.com/SchroederFabian/CVOC。
非常感谢任何帮助。
有些地方不对,让我们检查一下。请向您的 src/Makevars
提供 link,这实际上表明您有
CXXFLAGS= -lgmpxx -lgmp
但是在您在问题中显示的日志中没有这样的 linking 发生:
g++ -std=c++11 -shared -L/usr/lib/R/lib -Wl,-Bsymbolic-functions \
-Wl,-z,relro -o CVOC.so RcppExports.o etcND.o -L/usr/lib/R/lib -lR
本质上你混淆了
允许您"add"现有规则的PKG_*
变体
与普通的(即编译你想要PKG_CXXFLAGS
)和
您在需要 PKG_LIBS
时使用了 PKG_CXXFLAGS
。
尝试添加
PKG_LIBS= -lgmpxx -lgmp
然后重试。检查发生了什么 linking 步骤。您应该添加了所需的库,并且不再受 'unknown symbol'.
的困扰
我正在创建一个名为 CVOC 的 R 包。它包含 C++ 代码并使用来自 C 库 gmp 的高精度算法。
包将通过以下步骤创建:
1) 使用Rcpp::Rcpp.package.skeleton 创建包骨架。
2) 将所需文件(例如 DESCRIPTION、NAMESPACE、Makevars 等)复制到正确的文件夹中
3) 使用 roxygen2::roxygenise() 创建 .Rd 文档文件
4) 使用 R CMD 检查检查 R 包
5) 使用 R CMD 构建构建 R 包
当我 运行 R CMD 检查 "CVOC" 时出现以下错误消息:
* installing *source* package ‘CVOC’ ...
** libs
g++ -std=c++11 -I/usr/share/R/include -DNDEBUG -I"/home/fabian/R/x86_64-pc-linux-gnu-library/3.2/Rcpp/include" -I"/home/fabian/R/x86_64-pc-linux-gnu-library/3.2/RcppMP/include" -I"/home/fabian/R/x86_64-pc-linux-gnu-library/3.2/BH/include" -fpic -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -g -c RcppExports.cpp -o RcppExports.o
g++ -std=c++11 -I/usr/share/R/include -DNDEBUG -I"/home/fabian/R/x86_64-pc-linux-gnu-library/3.2/Rcpp/include" -I"/home/fabian/R/x86_64-pc-linux-gnu-library/3.2/RcppMP/include" -I"/home/fabian/R/x86_64-pc-linux-gnu-library/3.2/BH/include" -fpic -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -g -c etcND.cpp -o etcND.o
g++ -std=c++11 -shared -L/usr/lib/R/lib -Wl,-Bsymbolic-functions -Wl,-z,relro -o CVOC.so RcppExports.o etcND.o -L/usr/lib/R/lib -lR
installing to /home/fabian/Desktop/CVOCcreate/CVOC.Rcheck/CVOC/libs
** R
** preparing package for lazy loading
** help
*** installing help indices
** building package indices
** testing if installed package can be loaded
Error in dyn.load(file, DLLpath = DLLpath, ...) :
unable to load shared object '/home/fabian/Desktop/CVOCcreat/CVOC.Rcheck /CVOC/libs/CVOC.so':
/home/fabian/Desktop/CVOCcreate/CVOC.Rcheck/CVOC/libs/CVOC.so:
undefined symbol: __gmp_bits_per_limb
Error: loading failed
Execution halted
ERROR: loading failed
* removing ‘/home/fabian/Desktop/CVOCcreate/CVOC.Rcheck/CVOC’
包括 bash 脚本 createCVOC.sh 在内的所有必要文件都可以在 github 存储库中找到 https://github.com/SchroederFabian/CVOC。
非常感谢任何帮助。
有些地方不对,让我们检查一下。请向您的 src/Makevars
提供 link,这实际上表明您有
CXXFLAGS= -lgmpxx -lgmp
但是在您在问题中显示的日志中没有这样的 linking 发生:
g++ -std=c++11 -shared -L/usr/lib/R/lib -Wl,-Bsymbolic-functions \
-Wl,-z,relro -o CVOC.so RcppExports.o etcND.o -L/usr/lib/R/lib -lR
本质上你混淆了
允许您"add"现有规则的
PKG_*
变体 与普通的(即编译你想要PKG_CXXFLAGS
)和您在需要
PKG_LIBS
时使用了PKG_CXXFLAGS
。
尝试添加
PKG_LIBS= -lgmpxx -lgmp
然后重试。检查发生了什么 linking 步骤。您应该添加了所需的库,并且不再受 'unknown symbol'.
的困扰