Hi all, I am trying to port RcppArrayFire (https://github.com/RInstitute/rcpparrayfire) to Mac OS, but I am having some troubles with resolving linked libraries. I have tried to reduce the issue as much as possible, i.e. no Rcpp and no package structure. It seems to be MacOS specific since the same code works on Linux (as does RcppArrayFire). I also asked this on stackoverflow (https://stackoverflow.com/questions/48705490/runtime-linking-r-extension-on-macos), but that did not draw a lot of attention. Maybe someone on this list can shed some light on this:
When I install ArrayFire (http://arrayfire.com/) on MacOS using the binary installer, the libraries are installed in /usr/local/lib with an install name starting with @rpath: $ otool -L /usr/local/lib/libaf.dylib /usr/local/lib/libaf.dylib: @rpath/libaf.3.dylib (compatibility version 3.0.0, current version 3.5.1) /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 120.1.0) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1226.10.1) I can compile, link and run simple examples, e.g. #include <arrayfire.h> #include <stdio.h> int main() { unsigned int count; at_get_backend_count(&count); printf("backends: %d\n", count); return 0; } gives $ /usr/local/clang4/bin/clang -laf -o minimal minimal.c $ otool -L minimal minimal: @rpath/libaf.3.dylib (compatibility version 3.0.0, current version 3.5.1) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1252.0.0) $ ./minimal backends: 2 To do the same from R I use #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; } And compile it with $ 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 $ otool -L minimal.so minimal.so: minimal.so (compatibility version 0.0.0, current version 0.0.0) @rpath/libaf.3.dylib (compatibility version 3.0.0, current version 3.5.1) /Library/Frameworks/R.framework/Versions/3.4/Resources/lib/libR.dylib (compatibility version 3.4.0, current version 3.4.3) /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 1451.0.0) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1252.0.0) If I then try to load the resulting library, I get this error message: R> 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 Execution halted Both the binary and the R-extension library refer to the external library using the same install name, but for the R-extension this reference cannot be resolved. Why is this the case? Thanks Ralf PS: Used versions: * Mac OS High Siearra * R 3.4.3 * clang 4.0.0 from https://cran.r-project.org/bin/macosx/tools/ -- Ralf Stubner Senior Software Engineer / Trainer R Institute GmbH Dortustraße 48 14467 Potsdam T: +49 331 23 70 81 66 F: +49 331 23 70 81 67 M: +49 162 20 91 196 Mail: ralf.stub...@r-institute.com Sitz: Potsdam Register: AG Potsdam HRB 27966 P Ust.-IdNr.: DE300072622 Geschäftsführer: Prof. Dr. Dr. Karl-Kuno Kunze
smime.p7s
Description: S/MIME Cryptographic Signature
_______________________________________________ R-SIG-Mac mailing list R-SIG-Mac@r-project.org https://stat.ethz.ch/mailman/listinfo/r-sig-mac