【问题标题】:How to get it REALLY right with LD_LIBRARY_PATH and linking?如何通过 LD_LIBRARY_PATH 和链接真正做到正确?
【发布时间】:2014-09-05 17:54:20
【问题描述】:

我经常遇到找不到库的问题。

在我的 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 传播时出现问题...我必须做些什么才能让每个子进程(以及将启动的任何其他进程)知道那些图书馆是?

【问题讨论】:

  • 如果你有root权限:不要使用LD_LIBRARY_PATH。将所有非系统库放入/usr/local/lib,将该路径添加到/etc/ld.so.conf,在有用时运行ldconfig
  • 您对export 的调用中的自分配是多余的; export LD_LIBRARY_PATH 就足够了。此外,由于export 命令只是将变量 name 标记为可导出(它不会将值推送到环境中),因此可以在创建其环境的进程之前的任何时间完成将由导出的变量组成。

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


【解决方案1】:

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

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

这样您就不需要搞乱LD_LIBRARY_PATH 和shell 初始化。

【讨论】:

    【解决方案2】:

    由于程序依赖于设置正确的环境变量来运行,而 mpiexec 没有为其提供所需的环境,因此请尝试 mpiexec 文档中的以下内容:

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

    -E , --env 名称值 导出带有内容值的变量名。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-26
      • 1970-01-01
      相关资源
      最近更新 更多