如何使用LD_LIBRARY_PATH和链接真的正确?

Mic*_*ael 1 c++ bash mpi dynamic-linking ld

我一再遇到没有找到的库的问题.

在我的bashrc中我有:

LD_LIBRARY_PATH=
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib1
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib2
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib3

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH
Run Code Online (Sandbox Code Playgroud)

这些路径包含所有文件夹,我使用-L/lib1 -l1a -L/lib2 -l2a -L/lib3 -l3a将库链接到我的程序.

现在我独立开始我的程序:

./program
Run Code Online (Sandbox Code Playgroud)

精细!

然后我从mpich的mpiexec开始吧:

/mpich/intel/bin/mpiexec -np 2 ./solvertest1
Run Code Online (Sandbox Code Playgroud)

精细!

然后我启动gdb启动它:

/mpich/intel/bin/mpiexec -np 2 gdb ./solvertest1
Run Code Online (Sandbox Code Playgroud)

问题,找不到库:

Starting program: /my/program
/my/program: error while loading shared libraries: libirng.so: cannot open shared object file: No such file or directory
Run Code Online (Sandbox Code Playgroud)

我怀疑LD_LIBRARY_PATH应该通过所有子进程传播并且那些脚本和程序产生的shell会出现问题...我需要做什么才能让每个子进程(以及其他任何将被启动的)知道这些库的位置?

Sam*_*ler 5

DT_RPATH链接时将库路径存储在可执行文件的标记中

-Wl,rpath=/lib1 -Wl,rpath=/lib2 -Wl,rpath=/lib3

那样你就不需要搞乱LD_LIBRARY_PATH和shell初始化了.