运行时链接到不在LD_LIBRARY_PATH上的动态库

joa*_*dre 2 c++ linker compilation g++ shared-libraries

我正在尝试将我的项目链接到放置在项目基本目录[proj_dir] / lib上的一组特定的自定义编译库,而不是系统的任何/ lib,/ usr / lib或/ usr / local / lib-避免与已安装的相同库的版本冲突。

我可以通过传递带有-L标志的库路径来编译项目,但是error while loading shared libraries libXXX.so: cannot open shared object file: No such file or directory当我运行已编译的二进制文件时,我得到了提示,并ldd告诉我它找不到那些特定的库。

另一方面,如果传递LD_LIBRARY_PATH=[proj_dir]/lib给可执行文件,则可以运行它而不会出现问题。还有,是否有一种隐式链接这些库的方法,而不必LD_LIBRARY_PATH在运行时手动设置?

and*_*eee 5

你可以

  1. 编写一个包装脚本,以LD_LIBRARY_PATH在调用实际程序之前始终包含该脚本(更灵活)。
  2. 添加-Wl,-rpath=<directory>到链接器选项可将目录添加到运行时库搜索路径。所以,假设你有一个libfoo.so和你的程序和DSO应位于同一目录下,你的编译命令可能看起来像这样:gcc -o myprogam main.c -L. -lfoo -Wl,-rpath='$ORIGIN'

更新:如Maxim所正确指出的那样,设置-rpath=. 很危险,应避免使用

对于-Wl,,请参阅GCC手册页-rpath看到的LD手册页