dyn.load 使用 Rcpp 链接包时出错
dyn.load error linking a package with 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)
有人知道如何解决这个问题吗?
有点担心
PKG_LIBS=-lc++ -L/lib
您是说 /lib
吗?如果是您的图书馆,更常见的位置是 /usr/local/lib
,默认情况下也是搜索。
但是,这是一个很大的问题,但是,您还需要了解您需要为 ldconfig
做些什么才能正确设置 libfoo.so
、libfoo.so.$MAJOR
等等。许多个月前,我从 Linux HOWTO 中自学了这一点。
如果设置正确,您可以 link 通过 Rcpp 将其发送到 R。否则可能会坚持使用系统库或包本地静态库。这种方法还将使您的包更便携。
问题是我正在使用外部库,我必须先编译它并执行 ldconfig
,然后再编译我的 R 库。
我用 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)
有人知道如何解决这个问题吗?
有点担心
PKG_LIBS=-lc++ -L/lib
您是说 /lib
吗?如果是您的图书馆,更常见的位置是 /usr/local/lib
,默认情况下也是搜索。
但是,这是一个很大的问题,但是,您还需要了解您需要为 ldconfig
做些什么才能正确设置 libfoo.so
、libfoo.so.$MAJOR
等等。许多个月前,我从 Linux HOWTO 中自学了这一点。
如果设置正确,您可以 link 通过 Rcpp 将其发送到 R。否则可能会坚持使用系统库或包本地静态库。这种方法还将使您的包更便携。
问题是我正在使用外部库,我必须先编译它并执行 ldconfig
,然后再编译我的 R 库。