【问题标题】:Defining BOOST_TEST_DYN_LINK causes application to crash in Visual Studio定义 BOOST_TEST_DYN_LINK 会导致应用程序在 Visual Studio 中崩溃
【发布时间】:2017-08-25 11:20:50
【问题描述】:

在 boost 单元测试文档中,它特别指出您需要定义 BOOST_TEST_DYN_LINK 才能与 boost 单元测试库链接。

我正在使用这个基本示例:

#define BOOST_TEST_DYN_LINK
#define BOOST_TEST_MODULE test_module1

// This header is for the dynamic library, not the header only one
#include <boost/test/unit_test.hpp>

BOOST_AUTO_TEST_CASE(test1) {
    BOOST_CHECK(true);
}

我已将 boost 添加到我的包含/库路径并且代码编译正常,但是当我使用 Visual Studio 编译 boost 单元测试并尝试运行它们时,我收到以下错误:

应用程序无法正确启动 (0xc000003b)。

我觉得我只需要指出这个错误消息是多么的模糊和没有帮助......

由于某种原因,如果我删除 #define BOOST_TEST_DYN_LINK 行,代码将编译并成功运行,但这与 boost 文档所说的直接背道而驰。

为什么会这样?


其他信息:

这是我正在使用的:

提升 v1_63_0

【问题讨论】:

  • 不要将错误或信息发布为屏幕截图。而是将它们作为文本发布。您的屏幕截图显示您使用的是 VS14,但您使用 VS13 进行了标记。也不知道你为什么提到 IDE 版本。 IDE != 编译器。提及 MSVC 版本(VS 附带的 C/C++ 编译器)会更有帮助。
  • 哎呀!我标记了不正确的版本。我会解决的。
  • 而且MSVC版本是14.0
  • 您可能需要提供更多信息。哪个版本的 Windows?微软直到 Windows 10 才提供 C++ 的 Dynamic Initialization and Destruction with Concurrency (aka Magic Statics),它需要 Visual Studio 2017。Windows 或 Visual Studio 的较小版本将遇到无法解释的问题启动问题如果 i> 你不走运。经验之谈...
  • @jww 我使用的是 Windows 7 Professional SP1 x64

标签: c++ boost visual-studio-2015 dynamic-linking boost-test


【解决方案1】:

运行您的代码没有任何问题。所以我怀疑你的情况存在构建问题。

我的 boost 是这样构建的(在进入 Boost 源目录之后):

bootstrap.bat
.\b2.exe toolset=msvc -j 2 --with-test release link=shared stage

然后,您需要将 stage\lib 下的 DLL 复制到路径中的某个位置,并将适当的 Boost 目录添加到您的环境中。对于我的命令行环境,我有(假设你做了类似set BOOST_ROOT=C:\src\boost_1_65_1 的事情):

set INCLUDE=%BOOST_ROOT%;%INCLUDE%
set LIB=%BOOST_ROOT%\stage\lib;%LIB%

那么我就可以毫无问题地成功构建你的测试代码了:

cl /EHsc /MD test.cpp
.\test.exe

【讨论】:

  • 我确实自己构建了 boost 源,但我可能在此过程中犯了一个错误。我想我会再试一次。
【解决方案2】:

关于原因,这肯定是因为您在代码中包含/注入了静态和动态 (dll) 变体。这可能在 MSVC 中发生,因为 Boost 使用编译器的自动链接功能。我总是使用BOOST_ALL_NO_LIB 来禁用自动链接并完全控制链接的库。

特别是,自动链接库在使用时在链接选项中不可见,这使得问题更难发现。

【讨论】:

    【解决方案3】:

    那么在使用 Visual Studio 时就不要定义BOOST_TEST_DYN_LINK

    我们的单元主文件只包含:

    #ifndef _MSC_VER
    #define BOOST_TEST_DYN_LINK
    #endif
    #define BOOST_TEST_MAIN
    #define BOOST_TEST_MODULE Main
    #include <boost/test/unit_test.hpp>
    

    它在Linux 上使用GCC 运行良好,在Windows 上使用Visual StudioMinGw 运行良好。

    【讨论】:

    • 这是我计划使用的解决方案,但我想知道为什么它不起作用。我似乎找不到任何地方记录的原因,并且 boost 文档说它需要 BOOST_TEST_DYN_LINK 定义才能工作。
    • 我很高兴该解决方案适合您@tjwrona1992。至于 为什么 它不起作用:我不确定。我建议您将其中一个问题标签更改为 boost-test 以找到知道为什么...的人
    • 谢谢@kenba,我已经用新标签更新了问题。
    猜你喜欢
    • 1970-01-01
    • 2011-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-04
    • 1970-01-01
    相关资源
    最近更新 更多