在VS2005上使用“--layout = system”时出现链接错误

时间:2010-03-16 22:31:58

标签: c++ boost linker

我是新手,并且认为我会尝试使用.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。有什么想法吗?

2 个答案:

答案 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)。

详细信息:我发现调试此问题非常有帮助的事情是:

  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库(对于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预处理器控制下时 这样做的逻辑。