Reputation: 33420
After reading this question, my first reaction was that the user is not seeing the error because he specifies the location of the library with -L
.
However, apparently, the -L
option only influences where the linker looks, and has no influence over where the loader looks when you try to run the compiled application.
My question then is what's the point of -L
? Since you won't be able to run your binary unless you have the proper directories in LD_LIBRARY_PATH
anyway, why not just put them there in the first place, and drop the -L
, since the linker looks in LD_LIBRARY_PATH
automatically?
Upvotes: 0
Views: 524
Reputation: 215517
The other answers are all good, but one nobody has mentioned yet is static libraries. Most of the time when you use -L
it's with a static library built locally in your build tree that you don't intent to install, and it has nothing to do with LD_LIBRARY_PATH
.
Upvotes: 3
Reputation: 74475
Compilers on Solaris support the -R /runtime/path/to/some/libs
that adds to the path where libraries are to be searched by the run-time linker. On Linux the same could be achieved with -Wl,-rpath,/runtime/path/to/some/libs
. It passes the -rpath /runtime/path/to/some/libs
option to ld
. GNU ld
also supports the -R /path/to/libs
for compatibility with other ELF linkers but this should be avoided as -R
is normally used to specify symbol files to GNU ld
.
Upvotes: 0
Reputation: 320709
Building the binary and running the binary are two completely independent and unrelated processes. You seem to suggest that the running environment should affect the building environment, i.e. you seem to be making an assumption that the code build in some setup (account, machine) will be later run in the same setup. I find this assumption rather strange. I'd even say that in most cases the building and the running are done in different environments. I would actually prefer my compilers not to derive any assumptions about future running environment from the environment these compilers are invoked in. Looking onto the LD_LIBRARY_PATH
of the building environment would be a major no-no.
Upvotes: 3
Reputation: 206861
Setting LD_LIBRARY_PATH
will affect all the commands you run to build your code (including the compiler itself).
That's not desirable in general (e.g. you might not want your compiler to run debug/instrumented libraries while it compiles - it might even go as far as breaking your compiles).
Use -L
to tell the compiler where to look, LD_LIBRARY_PATH
to influence runtime linking.
Upvotes: 3
Reputation: 7153
It might be the case that you are cross-compiling and the linker is targeting a system other than your own. For instance, MinGW can be used to compile Windows binaries on Linux. Here -L
will point to the DLLs needed for linking and LD_LIBRARY_PATH
will point to any libraries needed by linker to run. This allows compiling and linking of different architectures, OS ABIs, or processor types.
It's also helpful when trying to build special targets. I might be case that one links a static version of program against a different static library. This is the first step in Linux From Scratch, where one creates a separate mini-environment on the main system to become a chroot
jail.
Upvotes: 6