[R-pkg-devel] Linking external libraries in non-standard locations
i.ucar86 at gmail.com
Sun Jun 18 10:40:24 CEST 2017
2017-06-17 18:00 GMT+02:00 Dirk Eddelbuettel <edd at debian.org>:
> On 17 June 2017 at 17:30, Iñaki Úcar wrote:
> | Hi all,
> | After googling around for a while, I found that this is a common
> | problem, but still it is not clear to me how I should handle this.
> | I have a package A, with C++ code via Rcpp, that needs an external C++
> | library libB. I have a configure script that sets
> | PKG_CPPFLAGS=-I/path/to/B/include
> | PKG_LIBS=-L/path/to/B/lib -lB
> | in src/Makevars. Compilation and linking seem to go just fine. But then,
> | ** testing if installed package can be loaded
> | Error in dyn.load(file, DLLpath = DLLpath, ...) :
> | unable to load shared object
> | '/home/xxx/R/x86_64-redhat-linux-gnu-library/3.3/A/libs/A.so':
> | libB.so: cannot open shared object file: No such file or directory
> | If I set LD_LIBRARY_PATH=/path/to/B/lib, the error above is solved and
> | the package is installed. But then I try to load the package with
> | library(A), with LD_LIBRARY_PATH still set, and the same error
> | reappears.
> | So what is the proper and more portable way of linking a external
> | library in a non-standard location?
> In short, I fear there is none.
> The _dynamic_ linker needs to know where the library is. There are defaults,
> and there are ways to extend this (i.e. /etc/ld.so.conf.d/*conf on the OS I
> use, or LD_LIBRARY_PATH as you used) but _none of those means are accessible
> to an R package_. This is system dependent.
> A static library you can control for yourself in your package.
> http://dirk.eddelbuettel.com | @eddelbuettel | edd at debian.org
Thanks, Dirk, as I had feared. However, I was wondering whether,
instead of relying on the OS, it would be possible to save this
non-standard location of the library at installation time and then to
call dyn.load() before loading the package.
More information about the R-package-devel