rcpp - 了解 `Makevars` 以链接到 R 包中的外部 C 库

标签 rcpp r-package

我正在开发一个包,其中包含来自第三方库 (SUNDIALS) 的 C 代码。该包编译和工作(即,能够解决测试 ODE)与以下 Makevars 文件执行静态链接

CXX=clang++

PKG_CPPFLAGS = -I../inst/include
PKG_LDFLAGS = /usr/local/lib
PKG_LIBS= $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS) $(PKG_LDFLAGS)/libsundials_cvode.a $(PKG_LDFLAGS)/libsundials_nvecserial.a

但是,稍微修改过的版本(基于 R-Exts 中的示例,即 - Makevars(下方)的 PKG_LIBS = -L$(XML_DIR)/lib -lxml2) 失败

CXX=clang++

PKG_CPPFLAGS = -I../inst/include
PKG_LDFLAGS = /usr/local/lib
PKG_LIBS= $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS) -L$(PKG_LDFLAGS) -lsundials_cvode -lsundials_nvecserial -lm

失败并显示以下错误消息。

Error: package or namespace load failed for ‘Rcppsbmod’ in dyn.load(file, DLLpath = DLLpath, ...):
 unable to load shared object '/Library/Frameworks/R.framework/Versions/3.4/Resources/library/Rcppsbmod/libs/Rcppsbmod.so':
  dlopen(/Library/Frameworks/R.framework/Versions/3.4/Resources/library/Rcppsbmod/libs/Rcppsbmod.so, 6): Library not loaded: libsundials_cvode.3.dylib
  Referenced from: /Library/Frameworks/R.framework/Versions/3.4/Resources/library/Rcppsbmod/libs/Rcppsbmod.so
  Reason: image not found
Error: loading failed
Execution halted
ERROR: loading failed
* removing ‘/Library/Frameworks/R.framework/Versions/3.4/Resources/library/Rcppsbmod’
* restoring previous ‘/Library/Frameworks/R.framework/Versions/3.4/Resources/library/Rcppsbmod’

Exited with status 1.

当我将 PKG_LDFLAGS 指定为 /usr/local/lib 时,我不确定为什么它在另一个位置寻找库。

顺便说一句,SUNDIALS 包使用以下命令编译并运行的测试示例

gcc -Wall cvRoberts_dns.c -o cvRoberts_dns.exe -I/usr/local/include -L/usr/local/lib/ -lsundials_cvode -lsundials_nvecserial -lm

因此,我知道该库已正确安装并且正确的文件(用于链接)位于 /usr/local/lib 位置。

完整的包源代码可以在 - https://github.com/sn248/Rcppsbmod 找到

任何帮助或指导将不胜感激!

最佳答案

系统范围的动态链接,如您的第二个用例失败,需要您系统上动态链接器的合作。

这意味着在构建库并将其复制到 /usr/local/lib 之后,您通常必须运行 sudo ldconfig 来更新链接器缓存。

您可以通过 ldconfig -p 的输出来检查这些库是否已知。在我的系统上,没有日晷:

edd@rob:~$ ldconfig -p | grep sundials
edd@rob:~$ 

相关地,您可以(本地)通过在中声明它们来使用不同的目录 /etc/ld.so.conf.d/somefile.conf——但这当然不可移植,并且不会帮助您使用指定用于 CRAN 的包。

在您的第一个示例中,使用您构建的作为包的一部分的静态 库将起作用,因为它不需要 需要任何系统帮助。只是每次构建库需要更长的时间。

关于rcpp - 了解 `Makevars` 以链接到 R 包中的外部 C 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49154506/

相关文章:

r - 导入的包不会自动安装

r - 多个 Linux 发行版中的共享 R 包

由于缺少 GSL,R 包在 Unix 机器上构建失败 - GNU 科学图书馆

c++ - 使用带有外部 C++ 库的 Rcpp 构建 R 包时 undefined reference

c++ - 调试 Armadillo 包的运行时错误

Rcpp:为什么我不能在我定义的包中运行该函数?

c++ - 将 Python 翻译成 Rcpp

r - CRAN提交-R CMD检查警告-使用的编译标志

c++ - Armadillo C++ : Sorting a vector in terms of two other vectors

r - 使用 RInside 析构函数