2010-03-16 138 views
2

我是新來推動的,並且認爲我會用.dll的一些實際的部署場景來嘗試它,所以我使用以下命令來編譯/安裝庫:在VS2005上使用「--layout = system」時出現boost鏈接錯誤

.\bjam install --layout=system variant=debug runtime-link=shared link=shared 
--with-date_time --with-thread --with-regex --with-filesystem 
--includedir=<my include directory> --libdir=<my bin directory> > installlog.txt 

這似乎工作,但我的簡單的程序(從「入門」頁面右邊線)失敗:

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

// Place your functions after this line 
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; 
    } 
} 

這失敗,出現以下鏈接錯誤:

fatal error LNK1104: cannot open file 'libboost_regex-vc80-mt-1_42.lib' 

我確定.lib和.dll都在那個目錄下,並命名爲我希望它們是什麼(例如:boost_regex.lib等,所有未版本化,因爲--layout = system說)。那麼爲什麼要尋找它的版本類型呢?我怎樣才能找到它的未版本化的類型?

我已經試過這更「正常」的選項,如下面:

.\bjam stage --build-type=complete --with-date_time --with-thread --with-filesystem --with-regex > mybuildlog.txt 

而且工作正常。我確信我的編譯器看到了「stage \ lib」目錄,它編譯並運行良好,除了讓環境查看正確的lib目錄之外沒有任何其他的東西。但是當我拿走那些「測試」目錄並想要使用這些其他(未版本控制)的目錄時,它就失敗了。

我在XP的VS2005下。有任何想法嗎?

回答

5

快速回答,因爲我無法在家中使用Visual C++。

我相信你在Visual C++編譯器上與Boost的「自動鏈接」發生衝突。

解決方法是禁用「自動鏈接」(請參閱​​您的文檔:快速谷歌搜索顯示宏「BOOST_ALL_NO_LIB」禁用所有Boost庫的自動鏈接),然後將您的項目明確鏈接到正確的庫。

我會盡快更新此答案。

+0

工作,雖然現在我得到一個shared_ptr錯誤(一個BOOST_ASSERT失敗的空指針)。我甚至跨過了代碼,無法理解未初始化的東西。可能是因爲我編譯沒有這個標誌的庫,並且試圖用它來編譯應用程序,但是這仍然沒有多大意義。 無論如何,感謝您的幫助。 – 2010-03-17 14:53:45

0

我也遇到了這個奇怪的(對我來說)鏈接器錯誤,我構建了 使用VS2005在Windows Server 2003上升級。我使用類似的bjam 命令行選項作爲OP,但沒有--layout=system 選項,因爲我不介意它們中的版本信息(尚未)。

內容提要下面的冗詞是:如果你看到 LINK : fatal error LNK1104: cannot open file 'libboost_regex-vc80-mt-gd-1_42.lib',那麼你需要在你的下游應用指定 相同-D編譯行選項建設成爲 Boost的構建時,他們建立了Boost做正則表達式庫。 文件沒有說明AFAICT(截至2010-03-23)。

細節:事情我發現相當有幫助調試這個問題是:

  1. 使用-d+2選項bjam建設時。這會導致大量的日誌記錄關於使用哪個命令行選項 。這就是我如何確定-DBOOST_ALL_NO_LIB=1-DBOOST_REGEX_DYN_LINK=1在構建Boost Regex庫時在編譯行中指定的 cl.exe

  2. 要知道,你也必須提供相同特殊-D標誌 (使用的VS2005接受一樣 的事情無論是-D/D選項)當您編譯使用該 加速應用程序的.cpp文件庫(對於Boost正則表達式是正確的,我猜測對於其他人來說它是真的 ,我還沒有證實)。這就是爲什麼你會看到 的連接故障:LINK : fatal error LNK1104: cannot open file 'libboost_regex-vc80-mt-gd-1_42.lib',因爲沒有 -DBOOST_ALL_NO_LIB=1-DBOOST_REGEX_DYN_LINK=1選擇, 自動鏈接將踢在當編譯器解析.cpp 文件和#include的Boost的頭球攻門,後者其中 #include的自動鏈接頭,其中 默認使用自動鏈接邏輯,它們是編譯器編譯指示 ,告訴鏈接器使用哪個庫。並猜測自動鏈接邏輯默認選擇哪一個 ?答案:靜態 那些形式爲libblablabla.lib而不是 blablabla.lib哪些是您期望的導入庫。這 基於編譯指示的鏈接器指令邏輯是什麼讓我追着我的尾巴 3小時試圖找出我的鏈接器 行做錯了什麼,當它在自動鏈接 邏輯的C預處理器控制下它。

+0

而不是命令行選項,我實際上更改了boost \ config中的user.hpp文件,因爲那樣在編譯時會同時影響bjam和您自己的應用程序。 – 2010-03-24 17:17:55

相關問題