当 R 尝试加载共享对象文件时,该错误发生在该过程的最后阶段。这意味着在您设置的环境变量的帮助下编译和链接可以正常工作。但在最后一步运行时链接器不知道在哪里libaf.so.3
位于。这是通常在操作系统级别进行的配置,例如在我的系统上
ralf@barra:~$ /sbin/ldconfig -p | grep libaf
libafopencl.so.3 (libc6,x86-64) => /lib/libafopencl.so.3
libafopencl.so (libc6,x86-64) => /lib/libafopencl.so
libafcpu.so.3 (libc6,x86-64) => /lib/libafcpu.so.3
libafcpu.so (libc6,x86-64) => /lib/libafcpu.so
libaf.so.3 (libc6,x86-64) => /lib/libaf.so.3
libaf.so (libc6,x86-64) => /lib/libaf.so
如果我尝试你的示例,它可以正常使用链接到的共享对象文件libaf
:
ralf@barra:~$ ldd /tmp/RtmpcjY9dN/sourceCpp-x86_64-pc-linux-gnu-1.0.2/sourcecpp_13d33790279c/sourceCpp_7.so | grep libaf
libaf.so.3 => /lib/libaf.so.3 (0x00007f21037ed000)
我希望在您的情况下,第一个命令不会提供任何结果,第二个(调整后的)命令将导致“文件未找到”(?)错误。
有几种方法可以告诉运行时链接器库的位置:
- Edit
/etc/ld.so.conf
或者(更好)将文件放入/etc/ld.so.conf.d/
, c.f. http://arrayfire.org/docs/installing.htm#Linux http://arrayfire.org/docs/installing.htm#Linux.
- Set
LD_LIBRARY_PATH
.
- Add
-Wl,-rpath,/opt/arrayfire/lib64/
to PKG_LIBS
- 将 ArrayFire 安装到链接器默认搜索的目录中。这就是我正在做的事情,因为我从源代码编译并使用生成的 DEB 包 https://github.com/arrayfire/arrayfire/wiki/Build-Instructions-for-Linux#packaging.
As for Rcpp::sourceCpp
不尊重Makevars
file: 问题是你写的C++文件不能直接使用。相反,Rcpp 属性必须创建额外的包装函数,这是在临时目录中完成的。现在原则上可以复制Makevars
文件也进入该目录。然而,人们通常在以下命令的帮助下设置这些变量:Rcpp::plugins
and Rcpp::depends
属性。例如,C++11 上的切换是使用// [[Rcpp::plugins(cpp11)]]
。对于其他变量,您可以编写自己的插件或使用我提供的插件RcppArrayFire https://www.daqana.org/rcpparrayfire/.
但是,如果这是您的目标,我建议您从一个包开始。Rcpp::sourceCpp
对于很多事情来说都很棒,但是在没有 R 包帮助的情况下与系统安装的库进行交互并不是其中之一。