【问题标题】:Boost link error when using "--layout=system" on VS2005在 VS2005 上使用“--layout=system”时提升链接错误
【发布时间】:2010-03-16 22:31:58
【问题描述】:

我是 boost 新手,我想尝试一些实际的 .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=system 所说) .那么它为什么要寻找它的版本化类型呢?以及如何让它查找库的未版本化类型?

我已经尝试过使用更多“正常”选项,如下所示:

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

而且效果很好。我确保我的编译器看到了“stage\lib”目录,它编译并运行良好,除了让环境查看正确的 lib 目录之外,什么都没有。但是当我把那些“测试”目录拿走,并想使用其他的(未版本化的)时,它失败了。

我在 XP 上使用 VS2005。有什么想法吗?

【问题讨论】:

    标签: c++ boost linker


    【解决方案1】:

    快速回答,因为我家里没有 Visual C++。

    我相信您正在与 Visual C++ 编译器上 Boost 的“自动链接”发生冲突。

    解决方案是禁用“自动链接”(请参阅​​您的文档:快速谷歌搜索显示宏“BOOST_ALL_NO_LIB”以禁用所有 Boost 库的自动链接),然后将您的项目明确链接到正确的库。

    我会尽快更新这个答案。

    【讨论】:

    • 这行得通,但现在我得到一个 shared_ptr 错误(一个 BOOST_ASSERT 因空指针而失败)。我什至单步执行了代码,无法理解某些东西是如何未初始化的。可能是因为我编译了没有这个标志的库,并试图用它编译应用程序,但这仍然没有多大意义。不管怎样,谢谢你的帮助。
    【解决方案2】:

    我的构建也遇到了这个奇怪的(对我而言)链接器错误 使用 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 年 3 月 23 日)。

    细节:我发现调试这个问题很有帮助的事情是:

    1. 在构建时将-d+2 选项用于bjam。这会输出一个 大量关于命令行选项的日志 正在使用。这就是我如何确定-DBOOST_ALL_NO_LIB=1-DBOOST_REGEX_DYN_LINK=1 被指定在 cl.exe 编译 Boost Regex 库时的行。

    2. 意识到您还必须提供 same 特殊的 -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 选项, 当编译器解析 your .cpp 时,自动链接将启动 文件和#include 是 Boost 头,后者 #include 是自动链接头,后者由 默认使用作为编译器编译指示的自动链接逻辑 告诉链接器使用哪个库。猜猜是哪一个 自动链接逻辑默认选择?答案:静态 形式为libblablabla.lib 而不是 blablabla.lib 是您期望的导入库。这 基于编译指示的链接器指令逻辑是我追尾的原因 花了 3 个小时试图弄清楚我在链接器上做错了什么 行,当它在自动链接中处于 C 预处理器控制之下时 这样做的逻辑。

    【讨论】:

    • 我实际上更改了 boost\config 中的 user.hpp 文件,而不是命令行选项,因为这会影响 bjam 以及编译时您自己的应用程序。
    猜你喜欢
    • 2013-01-21
    • 2020-08-31
    • 2023-03-24
    • 2022-08-13
    • 2018-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多