222

I'm building a simple C++ program and I want to temporarily substitute a system supplied shared library with a more recent version of it, for development and testing.

I tried setting the LD_LIBRARY_PATH variable but the linker (ld) failed with:

/usr/bin/ld: cannot find -lyaml-cpp

I expected that to work because according to the ld man page:

The linker uses the following search paths to locate required shared libraries: ... For a native linker, the contents of the environment variable "LD_LIBRARY_PATH"...

I then tried setting the LIBRARY_PATH, and that worked.

According to the GCC manual:

The value of LIBRARY_PATH is a colon-separated list of directories, much like PATH. When configured as a native compiler, GCC tries the directories thus specified when searching for special linker files, if it can't find them using GCC_EXEC_PREFIX. Linking using GCC also uses these directories when searching for ordinary libraries for the -l option (but directories specified with -L come first).

As the (GCC) manual suggests, LIBRARY_PATH works because I link with GCC.

But..

  • Since I link with gcc why ld is being called, as the error message suggests?
  • What's the point of having two variables serving the same purpose? Are there any other differences?
Guy Avraham
3,7583 gold badges43 silver badges55 bronze badges
asked Nov 22, 2010 at 22:02
1
  • N.B. the text you quoted about search the contents of the environment variable "LD_LIBRARY_PATH" was shown out of context. It's under the description of the -rpath-link option, which is related to finding shared libs that are dependencies of the shared libs you're linking to explicitly (to check that they satisfy any undefined refs in the ones you're linking to). The rpath-link dirs are not used to find the libs you're linking to explicitly, ld only uses the dirs named with the -L option for that (and GCC converts the contents of LIBRARY_PATH into -L options for ld). Commented Mar 6, 2024 at 11:14

4 Answers 4

295

LIBRARY_PATH is used by gcc before compilation to search directories containing static and shared libraries that need to be linked to your program.

LD_LIBRARY_PATH is used by your program to search directories containing shared libraries after it has been successfully compiled and linked.

EDIT: As pointed below, your libraries can be static or shared. If it is static then the code is copied over into your program and you don't need to search for the library after your program is compiled and linked. If your library is shared then it needs to be dynamically linked to your program and that's when LD_LIBRARY_PATH comes into play.

Guy Avraham
3,7583 gold badges43 silver badges55 bronze badges
answered Nov 22, 2010 at 22:09
Sign up to request clarification or add additional context in comments.

8 Comments

And of course LD_LIBRARY_PATH only makes sense with dynamic libraries
My point is that if I were to use ld for linking (directly), then, according to the ld manual, LD_LIBRARY_PATH would have been used to search for directories containing the libraries that need to be linked to my program. I must be missing something here..
unless you invoke ld yourself and combine the object files with the libraries, it will 'inherit' the path that gcc passes to it. You can override the standard gcc, with -Xlinker options.
Actually, LIBRARY_PATH is used for searching directories containing static AND dynamic libraries, instead of only static libraries.
Yeah this is wrong - the difference is that LIBRARY_PATH is searched for libraries (static or dynamic) at compile time and LD_LIBRARY_PATH is searched for dynamic libraries at run time. Of course at run time you don't need to search for static libraries.
|
65

LD_LIBRARY_PATH is searched when the program starts, LIBRARY_PATH is searched at link time.

caveat from comments:

Trevor Boyd Smith
19.5k37 gold badges132 silver badges193 bronze badges
answered Nov 27, 2010 at 20:13

4 Comments

Note: when linking libraries, ld by itself does not look for libraries in either LIBRARY_PATH or LD_LIBRARY_PATH. It's only when gcc invokes ld that LIBRARY_PATH becomes used. (Learned this the hard way.)
@Rufflewind Interesting, but would have been even more if you had given any reference.
This view makes a distinction in the moment the libraries are searched for (link time versus run time) while @Naveen makes a distinction of the type of libraries that are searched for (static v dynamic). Are there two views effectively identical (dynamic : run time = static : link time) or are there important situations when this correspondence does not hold? I would guess that some knowledge about the dynamic libraries is needed also at compile time.
@Rufflewind Hi Rufflewind. I read the manual for ld and it says ld only search LD_LIBRARY_PATH when searching for dependencies of a shared library. If you just run ld -lSOMETHING it won't search those paths in LD_LIBRARY_PATH, indeed.
17

Since I link with gcc why ld is being called, as the error message suggests?

gcc calls ld internally when it is in linking mode.

answered Dec 2, 2011 at 0:36

Comments

8

LIBRARY_PATH is used by linker (ld)

LD_LIBRARY_PATH is used by loader (ld.so)

Cristik
33.2k26 gold badges106 silver badges144 bronze badges
answered Nov 4, 2021 at 9:48

1 Comment

Your answer could be improved with additional supporting information. Please edit to add further details, such as citations or documentation, so that others can confirm that your answer is correct. You can find more information on how to write good answers in the help center.

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.