Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Defining BOOST_TEST_DYN_LINK causes application to crash in Visual Studio

In the boost unit testing documentation it specifically states that you need to define BOOST_TEST_DYN_LINK in order to link with the boost unit test library.

I am using this basic example:

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

I have added boost to my include/library paths and the code compiles fine, but when I compile boost unit tests using Visual Studio and try to run them I get the following error:

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

I feel like I just need to point out how vague and not helpful this error message is at all...

For some reason if I remove the line #define BOOST_TEST_DYN_LINK the code will compile and run successfully, but this goes directly against what the boost documentation says.

Why is this happening?


Additional info:

This is what I am using:

boost v1_63_0

enter image description here

like image 753
tjwrona1992 Avatar asked Aug 25 '17 11:08

tjwrona1992


2 Answers

I do not have any problems running your code. So I doubt there is a build problem in your case.

My boost is built this way (after going to the Boost source directory):

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

You then need to copy the DLLs under stage\lib to somewhere in your path, and add the appropriate Boost directories to your environment. For my command-line environment, I have (assuming you have done something like set BOOST_ROOT=C:\src\boost_1_65_1):

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

Then I can successfully build your test code without any problems:

cl /EHsc /MD test.cpp
.\test.exe
like image 198
Yongwei Wu Avatar answered Nov 19 '22 18:11

Yongwei Wu


Concerning the why, this is certainly because you are including/injecting both static and dynamic (dll) variants into your code. That may happen in MSVC because Boost uses the auto linking facility of the compiler. I always use BOOST_ALL_NO_LIB to disable auto-linking and have full control over the linked libraries.

In particular, the auto-link libraries, when used, are not visible on the link options, which make the problems harder to catch.

like image 28
Raffi Avatar answered Nov 19 '22 18:11

Raffi