gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 11:17:16 25 4
gpt4 key购买 nike

我正在开发一个包,其中包含来自第三方库 (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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com