我是新手,并且认为我会尝试使用.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。有什么想法吗?
答案 0 :(得分:5)
快速回答,因为我无法在家中访问Visual C ++。
我相信你正在与Visual C ++编译器上Boost的“自动链接”发生冲突。
解决方案是禁用“自动链接”(请参阅您的文档:快速谷歌搜索显示宏“BOOST_ALL_NO_LIB”以禁用所有Boost库的自动链接),然后明确地将您的项目链接到正确的库。< / p>
我会尽快更新这个答案。
答案 1 :(得分: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 Regex库时会发生。该
文件没有说明AFAICT(截至2010-03-23)。
详细信息:我发现调试此问题非常有帮助的事情是:
构建时使用-d+2
选项bjam
。这就抛弃了
关于命令行选项的大量日志记录
正在使用。这就是我确定-DBOOST_ALL_NO_LIB=1
的方式
和-DBOOST_REGEX_DYN_LINK=1
被指定
构建Boost Regex库时cl.exe
编译行。
意识到您还必须提供相同的特殊-D
标志
(使用VS2005接受的-D
或/D
个选项
当你编译使用它的应用程序中的.cpp
文件时
Boost库(对于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
是自动链接标头,后者由
default使用自动链接逻辑,它是编译器编译指示
告诉链接器使用哪个库。猜猜哪些
那个自动链接逻辑默认选择?答案:静态
形式为libblablabla.lib
而不是blablabla.lib
的那些
{{1}}这是您期望的导入库。这个
基于pragma的链接器指令逻辑让我追逐我的尾巴
3个小时试图找出我在链接器上做错了什么
行,当它在自动链接中的C预处理器控制下时
这样做的逻辑。