2017-08-25 141 views
5

在增强单元测试文档中,它明确指出您需要定义BOOST_TEST_DYN_LINK以便与增强单元测试库链接。定义BOOST_TEST_DYN_LINK会导致应用程序在Visual Studio中崩溃

我用这简单的例子:

#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); 
} 

我已经加入推动我包括/库路径和代码编译罚款,但是当我编译使用Visual Studio升压单元测试,并尝试运行它们我出现以下错误:

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

我觉得我只是需要指出的是此错误消息是一切是如何模糊,没有帮助...

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

这是怎么发生的?


附加信息:

这是我在用的:

升压v1_63_0

enter image description here

+1

请勿将错误或信息作为屏幕截图发布。改为将它们发布为文本。你的屏幕截图显示你正在使用VS14,但你用VS13标记。也不知道你为什么提到IDE版本。 IDE!=编译器。提到MSVC版本(VS附带的C/C++编译器)会更有帮助。 – tambre

+0

哎呀!我标记了不正确的版本。我会解决这个问题。 – tjwrona1992

+0

而MSVC版本是14.0 – tjwrona1992

回答

3

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

我升压建立这样(要Boost的源目录后):

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

然后,您需要将DLL文件下阶段\ lib中某处的路径复制到,并添加恰当的增压目录到你的环境。对于我的命令行环境,我已(假设你已经做了类似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 
+0

我自己构建了boost源,但可能我在这个过程中犯了一个错误。我想我会再试一次。 – tjwrona1992

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> 

它同时使用Visual StudioMinGw使用GCCWindows运行在Linux罚款。

+0

这是我计划使用的解决方案,但我想知道***为什么它不起作用。我似乎无法找到任何地方记录的原因,boost文档说明需要'BOOST_TEST_DYN_LINK'定义才能工作。 – tjwrona1992

+0

我很高兴该解决方案适用于您@ tjwrona1992。至于**为什么**它不起作用:我不知道。我建议你将你的一个问题标签改为'boost-test'来找到一个知道**为什么**的人...... – kenba

+0

谢谢@kenba,我已经用新标签更新了问题。 – tjwrona1992

1

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

特别是,自动链接库在使用时,在链接选项上不可见,这使得难以捕捉到问题。