【问题标题】:dyn.load error linking a package with Rcpp将包与 Rcpp 链接的 dyn.load 错误
【发布时间】:2016-04-30 08:22:23
【问题描述】:

我用 Rcpp 制作了一个 R 包,以使用我用 C++ 编写的库的方法。

我在最后一个版本上运行了 R:

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)

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

【问题讨论】:

  • 确保DESCRIPTION 中有LinkingTo: Rcpp,并且在NAMESPACE 中至少从Rcpp 导入一个对象,以确保加载Rcpp。
  • @Jeroen 是的,我有 LinkingTo: Rcpp 行,我加载了 Rcpp,我已经添加了我的 NAMESPACE 文件的内容。

标签: c++ r ubuntu rcpp


【解决方案1】:

有点担心

PKG_LIBS=-lc++ -L/lib

你真的是指/lib吗?如果是你的图书馆,更常见的地方是/usr/local/lib,默认也是搜索。

但是,这是一个很大的问题,但您还需要了解您需要为 ldconfig 做什么,以正确设置 libfoo.solibfoo.so.$MAJOR 等。很多个月前,我从 Linux HOWTO 中自学了。

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

【讨论】:

  • 谢谢!!我确信这是我的问题,我是 Ubuntu 的新手,我正在从这些错误中学习。在寻找有关如何设置我的库的信息时,我阅读了有关创建符号链接的内容,但我不知道此操作的目标目录,或者我是否需要修改配置文件......之后我将拥有我的 .所以用 MAJOR 编号归档?你能给我一个线索来解决它吗?我有点迷茫,你看起来像是这些问题的专家。
  • 这比我在这里解释的要复杂。寻找有关创建动态库的教程。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 2017-03-12
    • 2018-04-04
    相关资源
    最近更新 更多