Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Linux rpath中对可执行文件位置进行编码?_Linux_Macos_Gcc_Shared Libraries_Rpath - Fatal编程技术网

如何在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_路径