2009-09-10 69 views
0

我試圖編譯一個具有標準構建過程的軟件,例如在Linux中與不同的.so文件鏈接

configure 
make 
make install 

該軟件需要庫例如libreq.so安裝在/ usr/local/lib中。但是,我的問題是我想構建軟件並將其與我安裝在/ home/user/mylibs中的同一個庫的不同版本(我擁有該庫的源代碼)鏈接。

我的問題是,我怎麼編譯並在/ home /用戶/ mylibs對鏈接庫的軟件,而不是一個在/ usr/local/lib目錄

我試圖設置「LD_LIBRARY_PATH」包括/家庭/用戶/ mylibs但沒有奏效。

謝謝!

回答

5

當你有一個autoconf配置腳本,使用:

CPPFLAGS=-I/home/user/include LDFLAGS=-L/home/user/mylibs ./configure ... 

這增加了提名目錄的目錄列表搜索頭文件(通常是必要的,當你使用一個庫),並增加了其他提名目錄到搜索實際庫的列表。

我一直都在使用它 - 在我的工作機器上,/usr/local由MIS'維護',並且包含99.9%的過時代碼(並且是NFS掛載的,只讀的),所以我努力避免使用它完全可以在/usr/gnu下維護我自己的,更接近當前版本的軟件。這個對我有用。

+0

是的,這似乎工作,非常感謝! – 2009-09-10 13:33:57

2

嘗試使用LD_PRELOAD設置爲您的實際文件。

+0

謝謝,但似乎並沒有在構建過程中覆蓋/ usr/local/lib版本,是否有一些參數可以通過配置告訴它在特定位置使用庫? – 2009-09-10 12:52:53

0

LD_LIBRARY_PATH用於在運行時查找動態鏈接庫。在編譯時,您應該將-L參數添加到gcc/g ++中,以指定* .so文件所在的目錄。您還需要使用-l <名稱>(其中庫爲libNAME.so)添加庫名稱。

重要!爲了鏈接你不僅需要libNAME.so文件,而且還需要一個libNAME.a文件。

運行該應用程序時,不要忘記將dir添加到LD_LIBRARY_PATH中。

+0

@重要!爲了鏈接你不僅需要libNAME.so文件,而且還需要一個libNAME.a文件。 - >你不是在談論Windows(.dll + .lib)嗎? .a是靜態庫,根本不需要。 – nothrow 2009-09-10 12:57:04

+0

你一定是對的!我認爲這也是在Linux下需要的。 – Vereb 2009-09-10 13:05:00

0

當您將/home/user/mylibs添加到LD_LIBRARY_PATH中時,是否將其添加到現有路徑的前端或結尾?令牌按順序搜索,因此您希望您的列表中第一個出現。

此外,許多使用configure的標準構建環境將允許您爲每個需要的部分指定一個確切的庫。您必須運行./configure --help,但您應該看到類似--using-BLAH-lib=/path/to/your/library或類似的內容。