I’m having problems with LD_LIBRARY_PATH
at link time (this question has nothing to do with run time).
The link line looks like this when I run make (this is a Linux system using g++ version 4.1.x):
g++ a.o b.o c.o -o myapp -L/long/path/to/libs/ -L/another/long/path/ -labc -ldef -lghi
The -l
options reference shared libraries (e.g., libabc.so) which exist in the directories specified by the -L
options. Those directories also appear in LD_LIBRARY_PATH
. With that configuration, the link is successful, and I can run the application.
If I remove the directories from LD_LIBRARY_PATH
, then I get a single error line such as:
/usr/bin/ld: cannot find -labc
On the other hand, if I remove the directories from the list of -L
options, then I get many warnings such as:
/usr/bin/ld: warning: libabc.so, needed by /long/path/to/libs/libxyz.so, not found (try using -rpath or -rpath-link)
and then many more errors, such as:
/long/path/to/libs/libdef.so: undefined reference to `Foo::Bar<Baz>::junk(Fred*)'
Can someone explain the difference between LD_LIBRARY_PATH
and -L
? I would like to understand this stuff in depth, so references are greatly appreciated!
Also, what do I have to add to the link line to avoid using LD_LIBRARY_PATH
?
EDIT: When directories were missing from -L
, the compiler suggested to “try using -rpath or -rpath-link”. I don’t think I’ve ever seen those options in a makefile before. Have you? Not sure if that would help the LD_LIBRARY_PATH
problem though.
Advertisement
Answer
The settings of LD_LIBRARY_PATH
has the highest precedence, so when it is set, the set of directories mentioned by LD_LIBRARY_PATH
are searched first even before the standard set
of directories. So in your case setting of LD_LIBRARY_PATH
is influencing the lookup of
the libraries mentioned with -l
option. Without LD_LIBRARY_PATH
some of the dependencies
might have been resolved from the standard set of directories.
Though setting of LD_LIBRARY_PATH
help with debugging and to try out a newer version of
a library its usage in the general development environment setup and deployment is considered bad.
Also refer this HOWTO from Linux Documentation for more details on Shared Libraries