定义 BOOST_TEST_DYN_LINK 会导致应用程序在 Visual Studio 中崩溃

Defining BOOST_TEST_DYN_LINK causes application to crash in Visual Studio

在 boost 单元测试文档中,它明确指出您需要定义 BOOST_TEST_DYN_LINK 以便 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 添加到我的 include/library 路径并且代码编译正常,但是当我使用 Visual Studio 编译 boost 单元测试并尝试 运行 它们时,我收到以下错误:

The application was unable to start correctly (0xc000003b).

我觉得我只需要指出这条错误信息是多么模糊和毫无帮助...

出于某种原因,如果我删除行 #define BOOST_TEST_DYN_LINK,代码将编译并 运行 成功,但这直接违背了 boost 文档所说的内容。

为什么会这样?


附加信息:

这是我正在使用的:

提升v1_63_0

然后在使用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源目录后):

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

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

特别是,auto-link 库在使用时在 link 选项中不可见,这使得问题更难发现。