我有一个可执行文件,它隐式加载了几个 .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 上完成同样的事情?