2009-11-23 117 views
13

我有一個應用程序爲了代碼重用的目的被分成幾個庫。在Windows上,我所要做的就是將.dll文件放在與可執行文件相同的路徑中,並自動找到它們。在Linux上(因爲硬編碼路徑),我必須指定環境變量LD_LIBRARY_PATH或在可執行文件之前預先加載庫。作爲可執行文件目錄的共享庫路徑

我已經看到了一些使用鏈接器選項-Wl,-rpath=<PATH>嵌入路徑的事情,我試過它使用.作爲路徑。但是這只是查看當前的工作目錄,而不是可執行文件的目錄。

有沒有一種方法可以在鏈接器中默認查找共享庫的可執行文件的目錄(如在Windows上)?

謝謝! 馬特

回答

18

您需要$ ORIGIN在您的RPATH中,通過適當的選項ld或其他達爾文工具。見thisthis

請記住,$必須真正在路徑中結束,因此您需要在鏈接命令行中引用或轉義它。

更新: 你可以看到鏈接器實際上把你的可執行文件

readelf -d /path/to/exe | grep RPATH 

這裏是輸出應該是什麼樣子:

0x0000000f (RPATH)    Library rpath: [$ORIGIN] 
+4

使用$ ORIGIN時,您需要確保$正確引用,以便鏈接器實際看到它。從命令行,你想要「-rpath \ $ ORIGIN」,並從你想要的「Makefile」「-rpath \ $$ ORIGIN」 – 2009-11-23 20:38:29

+0

我正在使用Eclipse和CDT,並且我將這個選項放在各種鏈接器標誌下。我把'-Wl,-rpath = $$ ORIGIN'並在輸出窗口中顯示一個$。但它似乎並不奏效。我嘗試了幾個變化,但沒有任何反應。這就像鏈接器忽略了國旗。我已經試過: -Wl,-rpath = $ ORIGIN 輪候冊, - rpath的= $ ORIGIN -Wl,-rpath =/$ ORIGIN -Wl,-rpath = $ ORIGIN/ -Wl,-rpath =/$ ORIGIN/ 等 – CuppM 2009-11-23 21:05:01

+0

使用elfdump或本地等價物查看裏面有什麼?使用ldd並查看它說了什麼? – bmargulies 2009-11-23 21:39:11

2

在shell腳本包裝你的程序:

#!/bin/sh 

PROGRAM_DIRECTORY="`dirname "$0"`" 
export LD_LIBRARY_PATH="$PROGRAM_DIRECTORY" 

"$PROGRAM_DIRECTORY/program_executable" "[email protected]" 

如果您運行此腳本(而不是可執行文件)Y我們的程序鏈接就好了。

+0

是的,這就是我一直在做的,它的工作原理。該應用程序具有使用OpenMPI的並行版本,並且具有共享LD_LIBRARY_PATH的方式。所以我們現在正在使用這種解決方法,但是我們希望有一種更簡單的方式來做事情,因爲應用程序(以及MPI運行器)需要多個標誌來處理內容 – CuppM 2009-11-23 21:07:32

+0

您可以將腳本中的所有參數傳遞到程序中' 「$ @」'。 – 2009-11-23 23:35:55

相關問題