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