我有一个隐式加载几个.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
注意在OS X中形成可执行文件的路径的@loader_path/.
。对于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上完成同样的事情?
答案 0 :(得分:6)
您需要使用文字字符串$ORIGIN
作为运行路径,即动态加载程序将其理解为可执行文件的位置。
答案 1 :(得分:2)
一个常见的解决方案是创建一个shell脚本包装器,它可以确定可执行文件所在的目录,并在执行实际可执行文件之前适当地设置LD_LIBRARY_PATH。