我已经使用 MacOS 的二进制安装程序安装了ArrayFire 库,它将库放入/usr/local/lib
. 我可以编译和运行简单的例子,例如
#include <arrayfire.h>
#include <stdio.h>
int main() {
unsigned int count;
af_get_backend_count(&count);
printf("backends: %d\n", count);
return 0;
}
给
$ /usr/local/clang4/bin/clang -laf -o minimal minimal.c
$ ./minimal
backends: 2
现在我想在 R 中做同样的事情。我有
#include <arrayfire.h>
#include <Rinternals.h>
SEXP count_backends() {
unsigned int count;
af_get_backend_count(&count);
Rprintf("backends: %d\n", count);
return R_NilValue;
}
我编译的
$ PKG_LIBS=-laf R CMD SHLIB minimal.c
/usr/local/clang4/bin/clang -I/Library/Frameworks/R.framework/Resources/include -DNDEBUG -I/usr/local/include -fPIC -Wall -g -O2 -c minimal.c -o minimal.o
/usr/local/clang4/bin/clang -dynamiclib -Wl,-headerpad_max_install_names -undefined dynamic_lookup -single_module -multiply_defined suppress -L/Library/Frameworks/R.framework/Resources/lib -L/usr/local/clang4/lib -o minimal.so minimal.o -laf -F/Library/Frameworks/R.framework/.. -framework R -Wl,-framework -Wl,CoreFoundation
但是,我无法加载生成的库。错误信息:
> dyn.load("minimal.so")
Error in dyn.load("minimal.so") :
unable to load shared object '/Users/ralf/Documents/af-simple/minimalR/minimal.so':
dlopen(/Users/ralf/Documents/af-simple/minimalR/minimal.so, 6): Library not loaded: @rpath/libaf.3.dylib
Referenced from: /Users/ralf/Documents/af-simple/minimalR/minimal.so
Reason: image not found
为什么libaf
在构建二进制文件时没有这样的问题却找不到?我该怎么做才能加载库?
笔记:
- 我通过显式添加
-rpath /usr/local/lib
到PKG_LIBS
. 如果这是唯一的解决方案,我将对由此产生的问题提出后续问题。 - 我在 MacOS High Sierra 上使用“R 版本 3.4.3 (2017-11-30)”和建议的“clang 版本 4.0.0”。
- 设置
LD_LIBRARY_PATH
or没有帮助DYLD_LIBRARY_PATH
。/usr/local/lib
- 我在 Linux 上没有这样的问题。