Skip to content
Prev 1681 / 12125 Next

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

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