[R-pkg-devel] Linking external libraries in non-standard locations

Dirk Eddelbuettel edd at debian.org
Sun Jun 18 14:59:37 CEST 2017


On 18 June 2017 at 10:40, Iñaki Úcar wrote:
| 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.
| >
| > Dirk
| >
| > --
| > 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.

In theory, yes. In practice, no. You would haev to suspend the calling R
process and restart it for this to have effect.  The only other alternative
is "to become like R" and control your dlopen() but you probably don't want
to go there...

It's simply a difficult problem. "Just" become a FC/RH contributor and make
the library a system library :)

Dirk

-- 
http://dirk.eddelbuettel.com | @eddelbuettel | edd at debian.org



More information about the R-package-devel mailing list