在MacOS上链接R-extension的运行时

时间:2018-02-09 12:07:38

标签: r macos macos-high-sierra arrayfire

我已经使用MacOS的二进制安装程序安装了ArrayFire library,它将库放入/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)”和suggested“clang版本4.0.0”。
  • LD_LIBRARY_PATHDYLD_LIBRARY_PATH设置为/usr/local/lib无效。
  • 我在Linux上没有这样的问题。

0 个答案:

没有答案