共享库路径作为可执行目录

时间:2009-11-23 20:09:16

标签: c++ linux gcc linker shared-libraries

我有一个应用程序,它被分解为几个库,用于代码重用。在Windows上,我所要做的就是将.dll文件放在与可执行文件相同的路径中,它会自动找到它们。在Linux上(因为它硬编码事物的路径)我必须指定环境变量LD_LIBRARY_PATH或在可执行文件之前预加载库。

我已经看到了使用-Wl,-rpath=<PATH>的链接器选项嵌入路径的一些事情,我尝试使用.作为路径。但这只是查看当前的工作目录,而不是可执行文件的目录。

是否有一种方法可以在链接器中指定默认情况下查找共享库的可执行文件目录(如在Windows上)?

谢谢! 马特

2 个答案:

答案 0 :(得分:18)

你的RPATH需要$ ORIGIN,通过ld或其他Darwin工具的适当选项。请参阅thisthis

请记住$必须真正以路径结束,因此您需要在链接命令行中引用或转义它。

更新: 您可以使用

查看链接器实际放入可执行文件的内容
readelf -d /path/to/exe | grep RPATH

输出应该是这样的:

 0x0000000f (RPATH)              Library rpath: [$ORIGIN]

答案 1 :(得分:2)

将程序包装在shell脚本中:

#!/bin/sh

PROGRAM_DIRECTORY="`dirname "$0"`"
export LD_LIBRARY_PATH="$PROGRAM_DIRECTORY"

"$PROGRAM_DIRECTORY/program_executable" "$@"

如果您运行此脚本(而不是您的可执行文件),您的程序将链接正常。