簡體   English   中英

在VS2005上使用“--layout = system”時出現鏈接錯誤

[英]Boost link error when using “--layout=system” on VS2005

我是新手,並且認為我會嘗試使用.dll的一些實際部署方案,所以我使用以下命令來編譯/安裝庫:

.\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 =系統所說)。 那么為什么要尋找它的版本化類型呢? 我如何讓它來尋找未版本化的庫類型?

我已嘗試使用更多“正常”選項,如下所示:

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

這很好。 我確保我的編譯器看到了“stage \\ lib”目錄,並且編譯並運行正常,除了讓環境查看正確的lib目錄之外什么都沒有。 但是,當我把那些“測試”目錄拿走,並想要使用其他這些(無版本)時,它就失敗了。

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

我相信你正在與Visual C ++編譯器上Boost的“自動鏈接”發生沖突。

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

我會盡快更新這個答案。

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

下面的措辭的執行摘要是:如果你看到LINK : fatal error LNK1104: cannot open file 'libboost_regex-vc80-mt-gd-1_42.lib' ,那么你需要指定相同的-D編譯行選項您的下游應用程序構建為Boost構建時構建Boost Regex庫。 該文件未說明AFAICT(截至2010-03-23)。

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

  1. 在構建時使用-d+2選項來生成bjam 這會大量記錄有關正在使用的命令行選項的日志記錄。 這就是我在構建Boost Regex庫時確定在cl.exe編譯行上指定-DBOOST_ALL_NO_LIB=1-DBOOST_REGEX_DYN_LINK=1方法。

  2. 當您在使用該Boost庫的應用程序中編譯.cpp文件時,您必須提供相同的特殊-D標志(使用VS2005接受的-D/D選項作為相同的選項)(對於Boost Regex是真的) ,我猜其他人也是如此,我還沒有證實。 這就是為什么你會看到鏈接器失敗的原因: 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 ,它們是您期望的導入庫。 這個基於pragma的鏈接器指令邏輯讓我追蹤我的尾巴3個小時試圖找出我在鏈接器行上做錯了什么,當它在自動鏈接邏輯中進行C預處理器控制時。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM