9

我有一个可执行文件,它隐式加载了几个 .so 库,它们都是由我构建的。对于部署,或者至少是测试/调试,我希望将它们全部放在同一个目录中:

my_executable
libmylib1.so
libmylib2.so

为了让可执行文件隐式加载库,我想为可执行文件的目录设置一个 rpath (DT_RUNPATH)。对于 OS X,我会这样做:

clang -dynamiclib -o libmylib1.dylib -install_name @rpath/libmylib1.dylib src1.c src2.c    
clang -dynamiclib -o libmylib2.dylib -install_name @rpath/libmylib2.dylib src3.c src4.c
clang -o my_executable -L. -llibmylib1.so -llibmylib2.so -Wl,-rpath,@loader_path/. main.c

请注意@loader_path/.在 OS X 中形成可执行文件的 rpath。对于 Linux,我能做到的最接近的是

gcc -dynamiclib -o libmylib1.so src1.c src2.c    
gcc -dynamiclib -o libmylib2.so src3.c src4.c
gcc -o my_executable -L. -llibmylib1.so -llibmylib2.so -Wl,-rpath=. main.c

这里的问题是,在 Linux 上,rpath 遵循当前工作目录,而不是可执行文件的目录。有没有办法在 Linux 上完成同样的事情?

4

2 回答 2

6

您需要使用文字字符串$ORIGIN作为运行路径,动态加载程序将其理解为可执行文件的位置。

于 2012-09-13T03:38:10.653 回答
2

一个常见的解决方案是创建一个 shell 脚本包装器,该包装器确定可执行文件所在的目录,并在执行实际的可执行文件之前适当地设置 LD_LIBRARY_PATH。

于 2012-09-13T03:38:29.613 回答