创建R包时出错:dyn.load中出错(文件,DLLpath = DLLpath,...)

时间:2017-01-11 19:27:17

标签: r rcpp gmp roxygen2

我正在创建一个名为CVOC的R包。它包含C ++代码,并使用C库gmp中的高精度算法。

将通过以下步骤创建包:

1)使用Rcpp :: Rcpp.package.skeleton创建包骨架。

2)将所需文件(如DESCRIPTION,NAMESPACE,Makevars等)复制到正确的文件夹中

3)使用roxygen2 :: roxygenise()

创建.Rd文档文件

4)使用R CMD检查检查R-package

5)使用R CMD构建

构建R-package

当我运行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都可以在https://github.com/SchroederFabian/CVOC的github存储库中找到。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:4)

有些事情是对的,所以让我们检查一下。您可以提供指向src/Makevars的链接,这实际上表明您已经

CXXFLAGS= -lgmpxx -lgmp 

但是在您的问题中显示的日志中没有发生此类链接:

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

本质上你很困惑

  • 允许您“添加”现有规则的PKG_*变体 与普通的(即编译你想要PKG_CXXFLAGS)和

  • 您在需要PKG_CXXFLAGS时使用了PKG_LIBS

尝试添加

PKG_LIBS= -lgmpxx -lgmp 

然后再试一次。检查链接步骤发生了什么。您应该添加所需的库,不再受“未知符号”的影响。