将包与Rcpp链接的dyn.load错误

时间:2016-04-30 08:22:24

标签: c++ r ubuntu rcpp

我用Rcpp创建了一个R包,使用我用c ++编写的库的方法。

我已经在最后一个版本上运行了

R version 3.2.5 (2016-04-14)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 16.04 LTS

我正在执行以下说明来安装我的软件包:

> install.packages("mypackage", repos = NULL)

包编译得很好,我有源代码的.o文件,但是在链接阶段我得到了错误:

* installing *source* package ‘rbdd’ ...
** libs
make: No se hace nada para 'all'.
installing to /home/sergio/R/x86_64-pc-linux-gnu-library/3.2/mypackage/libs
** R
** preparing package for lazy loading
** help
Warning: /home/sergio/R/mypackage/man/mypackage-package.Rd:27: All text must be in a section
Warning: /home/sergio/R/mypackage/man/mypackage-package.Rd:28: All text must be in a section
*** 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/sergio/R/x86_64-pc-linux-gnu-library/3.2/mypackage/libs/mypackage.so':
/home/sergio/R/x86_64-pc-linux-gnu-library/3.2/mypackage/libs/mypackage.so: undefined symbol: _ZN4cudd12defaultErrorENSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEE
Error: loading failed
Ejecución interrumpida
ERROR: loading failed

mypackge.so是在我的包的src文件夹中创建的。

我有一个Makevars文件(也在src中),其中包含以下内容:

PKG_CPPFLAGS=-I./buddy-2.5/src -I./cudd-3.0.0/cudd -I./cudd-3.0.0/mtr -I./cudd-3.0.0/cplusplus -I./cudd-3.0.0/dddmp -I./cudd-3.0.0/util -I./cudd-3.0.0 -isystem /usr/include/c++/v1 -std=c++11
PKG_LIBS=-lc++ -L/lib

我的NAMESPACE文件包含以下行:

useDynLib(mypackage)
exportPattern("^[[:alpha:]]+")
importFrom(Rcpp, evalCpp)

有人知道如何解决这个问题吗?

2 个答案:

答案 0 :(得分:2)

我有点担心

PKG_LIBS=-lc++ -L/lib

你的意思是/lib吗?如果它是您的图书馆,则更常见的地方是/usr/local/lib,默认情况下也会搜索。

但是,这是一个很大但是,您还需要了解ldconfig需要做些什么来正确设置libfoo.solibfoo.so.$MAJOR等等。我从Linux HOWTO开始自学了很多个月。

如果设置正确,您可以通过Rcpp将其链接到R.否则可能会坚持使用系统库或包本地静态库。这种方法也将使您的包更具便携性。

答案 1 :(得分:1)

问题是我正在消耗外部库,我必须编译它并在编译我的R库之前执行ldconfig