2012-07-27 43 views
2

我有兩個版本之間隱式的LIBRARY_PATH修改g ++(g++ -v給出此信息)的問題。我將LIBRARY_PATH設置爲具有自定義庫的單個本地目錄。然而,事實證明,只有一個版本的g ++(讓我們稱之爲版本A)正確鏈接,另一個(版本B)鏈接到系統默認的,這是不希望的。顯然,目錄的順序混淆了,我的規範沒有得到適當的尊重。這與LIBRARY_PATH not used before /usr/lib anymore in gcc 4.2 and later?類似,但不適用於這些版本。解碼gcc規範文件行

不知何故,我來看看兩個不同版本的規格文件(通過g++ -dumpspecs > specs獲得)。然後我試着看看用另一個版本(A)的規格文件運行g ++(B;它產生* un *期望的修改)版本是否仍然會產生這種修改,並且爲了我的安慰,LIBRARY_PATH現在完全與我期待它(匹配版本A)!

我進一步追查下來這個奇怪的修改的地方在下面一行發生:

. !m64 !m32;.:../lib64 m64 !m32;.:../lib32 !m64 m32; 

而且出現影響LIBRARY_PATH的設置/修改,我黯然不知道什麼這行的意思。 因此,我希望你們中的一些人能夠「解密」這一行並解釋它的含義,以便我可以根據我的要求嘗試修改它。

謝謝!

回答

3

這條線影響庫如何相對於GCC的$PREFIX/lib目錄中找到

有三個部分,它(其中$PREFIX是目錄GCC安裝到。):

$PREFIX/lib/.使用時既不-m32或在命令行上使用-m64

$PREFIX/lib/.:$PREFIX/lib/../lib64當使用-m64時被使用。

$PREFIX/lib/.:$PREFIX/lib/../lib32當使用-m32時被使用。

這向我建議你使用的是Debian或Ubuntu,我不認爲從FSF源文件構建的vanilla GCC會在規範中使用。您的GCC版本是.deb套件還是您自己安裝的? (在最近的Debian/Ubuntu的多足弓支撐釋放移動庫目錄等破壞香草GCC,我認爲Debian和Ubuntu補丁的GCC代碼爲他們.deb包。)

了,你能g++ -v添加鏈接的輸出爲每您的版本,以查看每個版本使用的確切庫搜索路徑?

另外,爲什麼不使用-L而不是LIBRARY_PATH?以-L指定的目錄始終排在第一位,系統目錄或GCC自己的目錄或LIBRARY_PATH中指定的目錄之前。

+0

非常感謝,這可能證明非常有幫助。 g ++ ver。 A實際上是Debian提供的全系統編譯器。另一個版本(版本B)附帶一個名爲easybuild的系統,該系統用於管理多用戶系統上的安裝和版本處理(潛在的顯着不同的工具和版本需求)。我認爲整體設置是非常特定的這個網站,因此我不想在那裏詳細說明。我不想使用「-L」,因爲這必須明確設置(根據定義),我認爲使用「LIBRARY_PATH」將是一個通用的透明解決方案,以保證「安全」的默認鏈接。 – Shadow 2012-07-30 06:38:18

+0

Debian提供的GCC使用修改其庫搜索路徑的補丁構建,例如, http://anonscm.debian.org/viewvc/gcccvs/branches/sid/gcc-4.6/debian/patches/gcc-multiarch.diff?revision=5904&view=markup and http://anonscm.debian.org/viewvc/ gcccvs /支鏈/ SID/GCC-4.6 /的Debian /補丁/ GCC-multilib64.diff?修訂= 4969&視圖=標記 – 2012-07-30 07:16:38