LD_LIBRARY_PATH vs LIBRARY_PATH
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.
GCC and linking environment variables and flags
To begin with, all the variables you mentioned: CC
, CFLAGS
, CXX
, CXXFLAGS
, LDFLAGS
, LD_LIBRARY_PATH
, are originated from Unix OS family. These variables have nothing to do with GCC in the first place, that's why you see no trace of them in the manuals.
The only meaningful variable (which has no direct connection with GCC too) among these is LD_LIBRARY_PATH
. You'll probably find this variable to be defined out-of-the-box on any modern Unix-like OS. Here is the the LD.SO(8) man-page from Linux Programmer's Manual which mentions LD_LIBRARY_PATH
and its purpose. Here is one more extract:
The
LD_LIBRARY_PATH
environment variable contains a colon-separated list of directories that are searched by the dynamic linker when looking for a shared library to load.The directories are searched in the order they are mentioned in.
If not specified, the linker uses the default, which is
/lib:/usr/lib:/usr/local/lib
.
As you can see LD_LIBRARY_PATH
is nothing but an OS-specific environment variable for proper loading of shared libraries. Windows has similar environment variable in this regard: PATH
. Windows will scan directories listed in it when searching for dynamic-link library (DLL, a counterpart of SO on Linux) too.
Concerning the rest of the variables (CC
, CFLAGS
, CXX
, CXXFLAGS
, LDFLAGS
), you see them so often due to the historical reasons. Since the rise of Unix era, software projects were built using Make (scroll down and look at the examples of typical makefile
s) — one of the pioneering build tools. These variables were so extensively used in makefile
s that eventually they became sort of a convention (see Implicit Rules, for instance). That's why you can even see them defined out-of-the-box on, for example, Linux, and most likely pointing to GCC (as it is considered to be the native toolchain for Linux).
To conclude, the point is: don't scratch your head over CC
, CFLAGS
, CXX
, CXXFLAGS
, LDFLAGS
, and friends, as they are just a blast from the past. ;)
BONUS
Using plain old Make directly to build complex software today quickly becomes tedious and error-prone. As a result, numerous sophisticated build system generators like GNU Automake or CMake have been developed. In brief, their goal is to provide (arguably) more readable, easy-to-maintain, and high-level syntax to define an arbitrarily complex build system for an arbitrary software project to be built. Typically, before actually building the project, one has to generate a native build system (which could also be represented by plain old makefile
s, for example, for portability reasons, but not necessarily) out of this high-level definition using the corresponding set of tools. Finally, one has to build the project with the tool(s) corresponding to the generated (native) build system (for example, Make in case of plain old makefile
s, but not necessarily).
Since you are asking these questions, I suspect that you are about to dive into native software development with C or C++. If so, I would strongly recommend you to pick a modern build system (CMake would be my personal recommendation) in the first place, play with it, and learn it well.
How do I instruct CMake to look for libraries installed by MacPorts?
I added a toolchain file for "Darwin" which adds the necessary include and library paths. I was hoping for something a little more automatic but at least it solves the problem.
darwin.cmake:
SET(CMAKE_SYSTEM_NAME Darwin)
# Add MacPorts
INCLUDE_DIRECTORIES(/opt/local/include)
LINK_DIRECTORIES(/opt/local/lib)
Related Topics
Bash: No Such File or Directory
How to Tell If Running in a Linux Console Versus an Ssh Session
How to Add an User and Re Set the Root User in Yocto
Shell Script for Process Monitoring
Difference Between --Cap-Add=Net_Admin and Add Capabilities in .Yml
Bash Alias Create File with Current Timestamp in Filename
Get a Spectrum of Frequencies from Wav/Riff Using Linux Command Line
How to Produce Stand Alone Haskell Executable
Passing Environment Variables Not Working with Docker
How to Create a Zip File Without Entire Directory Structure
Sshpass: Command Not Found Error
Installing Gcc on Linux Without C Compiler
Why Do We Need to Call Poll_Wait in Poll
How to Display the Output of a Linux Command on Stdout and Also Pipe It to Another Command