2012-09-13 33 views
9

我有一个隐含加载几个。所以库的可执行文件,所有的人都被我建。对于部署,或至少测试/调试,我想有他们都在同一个目录下:如何在Linux 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.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 

注意,形成可执行的rpath在OS X中使用Linux的@loader_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上完成同样的事情吗?

回答

6

您需要使用文本字符串$ORIGIN的运行路径,即理解为通过动态加载器可执行文件的位置。

+0

这就是它!谢谢。 –

2

常见的解决方案是创建一个shell脚本包装,计算出的可执行文件是什么目录下,并设置execing实际的可执行文件之前适当LD_LIBRARY_PATH。

+3

一个常见但肮脏的解决方案,人们应该了解rpath – wich

相关问题