2012-07-25 73 views
3

我想除本地安裝(在我的家庭文件夾(Linux),說$ HOME/boost)boost C++庫,除了系統範圍內安裝的默認的升壓庫。我用魔法建造它們,並且工作得很好。鏈接器不使用本地(用戶)升壓安裝與g ++

之後,我設置了環境變量CPLUS_INCLUDE_PATH和LD_LIBRARY_PATH以匹配本地安裝的目標,因此它們分別指向$ HOME/boost/include和$ HOME/boost/lib /。

爲了測試這一點,我用下面的代碼測試CPLUS_INCLUDE_PATH的正確使用的標題:

#include <boost/version.hpp> 
#include <iostream> 
#include <iomanip> 

int main() 
{ 
    std::cout << "Boost version: " << BOOST_LIB_VERSION << std::endl; 

    return 0; 
} 

g++ -o Test_boost_version test_boost_version.cpp作品編譯它如預期,報告預期(本地)版本。讓CPLUS_INCLUDE_PATH爲空,可以爲我提供默認的系統範圍安裝的升級版本。到現在爲止還挺好。

爲了測試鏈接,我用下面的代碼(從升壓主頁採取:

#include <boost/regex.hpp> 
#include <iostream> 
#include <string> 

int main() 
{ 
    std::string line; 
    boost::regex pat("^Subject: (Re: |Aw:)*(.*)"); 

    while (std::cin) 
    { 
     std::getline(std::cin, line); 
     boost::smatch matches; 
     if (boost::regex_match(line, matches, pat)) 
      std::cout << matches[2] << std::endl; 
    } 
} 

g++ -o Test_boost_linking test_boost_linking.cpp -lboost_regex建造它

調用ldd Test_boost_linking但是不使用本地的。安裝(通過LD_LIBRARY_PATH提供)但給我:libboost_regex.so.1.42.0 => /usr/lib/libboost_regex.so.1.42.0 (0x00007f9264612000)

當我使用g++ -o Test_boost_linking test_boost_linking.cpp -lboost_regex -L$HOME/boost/lib時,ldd正在報告正確的庫(libboost_regex.so.1.50.0 => $HOME/boost/lib/libboost_regex.so.1.50.0 (0x00007f6947d2a000))。

對我來說,這實際上是一個問題,因爲我想設置我的本地環境,這樣編譯將忽略系統默認的升壓安裝,只使用本地安裝,我認爲這正是設置CPLUS_INCLUDE_PATH和LD_LIBRARY_PATH,但對於後者,這似乎不適用。

那麼如何確保使用g++ -o Test_boost_linking test_boost_linking.cpp -lboost_regex(不含-L)使用本地庫?

[編輯]進一步思考,我想知道如果它實際上是絕對必須在命令行中使用「-L $ HOME/boost/lib」(使用LDFLAGS作爲環境變量似乎沒有效果,可能只是與Makefile結合使用)在非標準目錄中使用庫時?是這樣嗎?

(順便說一句,我認爲這將持有真也爲其他圖書館,不僅提高...)

(我用:G ++(Debian的4.4.5-8)4.4.5)

謝謝您。

回答

3

您需要使用環境變量LIBRARY_PATH讓gcc知道鏈接時在哪裏找到這些庫。 LD_LIBRARY_PATH讓程序知道在運行時在哪裏找到動態庫。這answer有更多的細節。這些來自「GCC簡介」的鏈接也可能是有用的:Compilation options:Environment VariablesShared and Static Libraries

+0

謝謝,這顯然是訣竅!我之前曾嘗試過這個變量,但由於某種原因我放棄了該變量,但顯然出現了錯誤。 – Shadow 2012-07-25 08:09:19