2017-06-05 80 views
0

我在集羣上安裝了兩個版本的boost。舊的位於標準位置,而新位置位於我的主目錄中。由於我沒有su特權,我不能刪除舊特權。我出口環境變量提升(和其它庫),如下所示:兩個升級版本之間的衝突

在/ usr/bin中/ LD:在連接階段

export PATH=/truba/home/osibliyev/boost/bin:$PATH 
export LD_LIBRARY_PATH=/truba/home/osibliyev/boost/lib:$LD_LIBRARY_PATH 
export LIBRARY_PATH=/truba/home/osibliyev/boost/lib:$LIBRARY_PATH 
export CPLUS_INCLUDE_PATH=/truba/home/osibliyev/boost/include:$CPLUS_INCLUDE_PATH 

make編譯後,我得到以下錯誤警告:libboost_serialization.so.1.64.0,需要 /truba/home/osibliyev/boost/lib/libboost_mpi.so,可能與 衝突libboost_serialization.so.1.53.0/usr/bin/ld:loadmap.o:undefined 參考符號'_ZN5boost7archive17archive_exceptionC2ERKS1_' /truba/home/osibliyev/boost/lib/l ibboost_serialization.so.1.64.0: 錯誤添加符號:DSO命令行

lboost_serialization已添加到LDADD丟失:

LDADD = -lmetis -lmpi -lboost_mpi -lboost_serialization -lboost_log -lboost_log_setup -lboost_thread -lpthread -lboost_date_time -lboost_filesystem -lboost_system -lboost_timer 

我有點確保誤差是因爲衝突因爲其他圖書館鏈接沒有問題,只會增加抱怨。這不會發生在我的機器上只有一個增強版本。我能做些什麼來解決這個錯誤?

+0

如果你搜索_DSO從命令line_缺少這樣,你得到了一組可能的答案。你有沒有讀過它們?這看起來很像一個重複的問題。 [這裏](https://stackoverflow.com/q/15634114/4987285)是一個也許可以幫助你。 – skypjack

+0

@skypjack是的,我搜索了類似的問題,但他們沒有解決我的問題。除了問題只發生在羣集而不是我的電腦。這讓我覺得問題是存在兩個升級版本,但不知道如何擺脫舊版本。 – Shibli

+0

問題是沒有獲得舊版本的rif,而是選擇新版本。據我所知,你所描述的環境變量中沒有一個會產生這種效果。相反,您希望在指定Boost庫的任何'-l'選項之前,將'-L/truba/home/osibliyev/boost/lib'選項添加到'LDADD'。但是,您將在* run *時間需要'LD_LIBRARY_PATH'。 –

回答

1

如何確定工具鏈的標題和庫搜索路徑是特定於實現的。對於哪些環境變量(如果有的話)影響它們,或者如何影響它們,沒有通用規則。

您嘗試使用的特定環境變量以及您爲其設置的值表示UNIX樣式的系統。你應該知道,

  • 在這樣一個系統上,PATH變量設置可執行文件的搜索路徑,而不是庫或頭文件。
  • 在那些識別它的系統上,LD_LIBRARY_PATH指定鏈接器搜索路徑的動態的額外目錄 - 這些在運行時是相關的,而不是構建時間。
  • CPLUS_INCLUDE_PATH被GNU C++編譯器識別,也可能是其他的,用於指定其他目錄來搜索包含文件。這與您找到Boost標題相關,但不是庫。在GNU編譯器中,這個變量中列出的目錄將在標準目錄之前被搜索。
  • LIBRARY_PATH被GNU鏈接器及其他可能的網站識別爲指定額外的目錄來搜索庫。與CPLUS_INCLUDE_PATH類似,這與您相關,但它不允許您將庫替換爲其中一個標準位置中發現的其他名稱,因爲標準目錄在之前被搜索這些。

您的錯誤消息表明鏈接器正在查找Boost v1.53和v1.64庫的混合。這可能意味着前者駐留在首先搜索的目錄中 - 可能是系統目錄(如/usr/lib) - 但並非您嘗試鏈接的所有Boost庫都存在;有些可在您的v1.64安裝中找到。考慮到你已經嘗試過的東西不起作用,你不可能設置任何環境變量來解決這個問題。正如我所說的,但是,它的實現依賴,雖然我懷疑你正在使用的GNU工具鏈,你沒有指定。

使用GNU工具鏈,如果您希望鏈接器在搜索標準目錄之前搜索庫的個人Boost安裝,那麼您需要通過命令行選項專門指示它。正如在評論中討論,您可以通過添加-L/truba/home/osibliyev/boost/lib到您的Automake LDADD變量實現這一目標。