How to modify a LD_LIBRARY_PATH environment variable?
You can add it to your ~/.bashrc:
echo "export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/your/custom/path/" >> ~/.bashrc
simple quest about LD_LIBRARY_PATH and new entries
Read about how ${LD_LIBRARY_PATH} is used like this:
$ man ld.so
You already know that ${PATH} is a list of directories that are polled when just an application name is given:
$ foo
and ${LD_LIBRARY_PATH} works exactly the same for the ld.so(1) dynamic library linker.
The tricky bit is that ld.so(1) uses a cache of the shared libraries found the last time the ${LD_LIBRARY_PATH} was used. This speeds up the program starting, just as any cache is supposed to do. Lots of examples show just mentioning a single directory to pick up an application-specific library:
$ export LD_LIBRARY_PATH=/my/wonderful/library
$ foo
but that is depending that the existing cache already any other needed library because the ld.so(1) will know to search only that "/my/wonderful/library/" location.
A better solution is to add the new directory like this:
$ export LD_LIBRARY_PATH=/my/wonderful/library:${LD_LIBRARY_PATH}
$ foo
which will work even if the ld.so(1) cache gets deleted out from under you and ldconfig(1) has to rebuild that cache.
This idiom that exports the ${LD_LIBRARY_PATH} permanently is a bad, bad idea:
$ export LD_LIBRARY_PATH=/my/wonderful/library:${LD_LIBRARY_PATH}
$ foo
because the custom ${LD_LIBRARY_PATH} will be used for the "foo" application plus any child program in this process tree. Instead, always limit the setting to process tree here instead of anything run from this shell ever again. Keep control of where the path is set like this:
$ LD_LIBRARY_PATH=/my/wonderful/library:${LD_LIBRARY_PATH} foo
limits visibility of the ${LD_LIBRARY_PATH} to only "foo" and any process it spawns.
What is LD_LIBRARY_PATH and how to use it?
Typically you must set java.library.path
on the JVM's command line:
java -Djava.library.path=/path/to/my/dll -cp /my/classpath/goes/here MainClass
how to set LD_LIBRARY_PATH in ubuntu 11.04
The simplest way to do it is on the same command line of your program:
LD_LIBRARY_PATH="/my/special/path:$LD_LIBRARY_PATH" myprogram
You can also export
that variable to make it persist through commands in the current terminal:
export LD_LIBRARY_PATH="/my/special/path:$LD_LIBRARY_PATH"
myprogram1
myprogram2
In this case, both programs will see the new library path.
Change current process environment's LD_LIBRARY_PATH
The reason
os.environ["LD_LIBRARY_PATH"] = ...
doesn't work is simple: this environment variable controls behavior of the dynamic loader (ld-linux.so.2
on Linux, ld.so.1
on Solaris), but the loader only looks at LD_LIBRARY_PATH
once at process startup. Changing the value of LD_LIBRARY_PATH
in the current process after that point has no effect (just as the answer to this question says).
You do have some options:
A. If you know that you are going to need xyz.so
from /some/path
, and control the execution of python script from the start, then simply set LD_LIBRARY_PATH
to your liking (after checking that it is not already so set), and re-execute yourself. This is what Java
does.
B. You can import /some/path/xyz.so
via its absolute path before importing x.so
. When you then import x.so
, the loader will discover that it has already loaded xyz.so
, and will use the already loaded module instead of searching for it again.
C. If you build x.so
yourself, you can add -Wl,-rpath=/some/path
to its link line, and then importing x.so
will cause the loader to look for dependent modules in /some/path
.
Setting LD_LIBRARY_PATH environment variable for loading a shared library at runtime (g++)
To answer the second question first:
source
executes the script inside the current shell, ./install.sh
opens and executes it in a different shell.
http://www.unix.com/unix-dummies-questions-answers/537-difference-between-source-exec-script.html
Now for your first question:
LD_LIBRARY_PATH=$LD_LIBRARY_PATH ./test
sets the LD_LIBRARY_PATH variable before just one command (the ./test
command). For the same reason above, I believe this isn't getting transferred to whatever shell ./test
creates. To make it persist, you may need to put the export LD_LIBRARY_PATH=...
in your ~/.bashrc
Related Topics
Defining a Variable With or Without Export
What's the Magic of "-" (A Dash) in Command-Line Parameters
How to Debug the Linux Kernel With Gdb and Qemu
How to Access Physical Addresses from User Space in Linux
Linux: Copy and Create Destination Dir If It Does Not Exist
How to Obtain the Number of Cpus/Cores in Linux from the Command Line
[ :Unexpected Operator in Shell Programming
Getting a Unique Id from a Unix-Like System
Execute Command After Every Command in Bash
How to Manage Perl Modules When Using a Package Manager
What Is Double Dot(..) and Single Dot(.) in Linux
How to Print a Number in Assembly Nasm
Shell Script: Run Function from Script Over Ssh