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

时间:2014-09-05 17:54:20

标签: c++ bash mpi ld dynamic-linking

我一再遇到未找到的库的问题。

在我的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

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

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

./program

精细!

然后我从mpich开始使用mpiexec:

/mpich/intel/bin/mpiexec -np 2 ./solvertest1

精细!

但是我启动了gdb启动它:

/mpich/intel/bin/mpiexec -np 2 gdb ./solvertest1

问题,找不到库:

Starting program: /my/program
/my/program: error while loading shared libraries: libirng.so: cannot open shared object file: No such file or directory

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

2 个答案:

答案 0 :(得分:5)

链接

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

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

这样你就不需要弄乱LD_LIBRARY_PATH和shell初始化了。

答案 1 :(得分:2)

由于程序依赖于将正确的环境变量设置为运行,并且mpiexec没有给它所需的环境,请尝试使用mpiexec文档中的类似内容:

-x, - envall     将所有环境变量导出到所有进程。

-E, - env name value     使用内容值导出变量名称。