![](/img/trans.png)
[英]boost serialization problem in windows vs2005, input stream error
[英]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)。
細節:我發現調試這個問題很有幫助的事情是:
在構建時使用-d+2
選項來生成bjam
。 這會大量記錄有關正在使用的命令行選項的日志記錄。 這就是我在構建Boost Regex庫時確定在cl.exe
編譯行上指定-DBOOST_ALL_NO_LIB=1
和-DBOOST_REGEX_DYN_LINK=1
方法。
當您在使用該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.