2012-09-13 73 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

相關問題