如何在Linux rpath中对可执行文件位置进行编码?
我有一个可执行文件,它隐式加载了几个库,所有库都是我自己构建的。对于部署,或者至少是测试/调试,我希望它们都在同一个目录中:如何在Linux rpath中对可执行文件位置进行编码?,linux,macos,gcc,shared-libraries,rpath,Linux,Macos,Gcc,Shared Libraries,Rpath,我有一个可执行文件,它隐式加载了几个库,所有库都是我自己构建的。对于部署,或者至少是测试/调试,我希望它们都在同一个目录中: my_executable libmylib1.so libmylib2.so 为了让可执行文件隐式加载库,我想为可执行文件的目录设置一个rpath(DT_RUNPATH)。使用OS X,我会这样做: clang -dynamiclib -o libmylib1.dylib -install_name @rpath/libmylib1.dylib src1.c src2
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
请注意在OSX中形成可执行文件的rpath的@loader\u path/
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上完成同样的事情?您需要使用文本字符串
$ORIGIN
作为运行路径,动态加载程序将其理解为可执行文件的位置。一个常见的解决方案是创建一个shell脚本包装器,在执行实际的可执行文件之前,该包装器可以找出可执行文件所在的目录,并适当地设置LD_LIBRARY_路径