Reputation: 9035
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
Upvotes: 5
Views: 2010
Reputation: 3385
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.
Upvotes: 3
Reputation: 5582
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
Upvotes: 4
Reputation: 4539
Then simply don't define BOOST_TEST_DYN_LINK
when using Visual Studio.
Our unit main file just contains:
#ifndef _MSC_VER
#define BOOST_TEST_DYN_LINK
#endif
#define BOOST_TEST_MAIN
#define BOOST_TEST_MODULE Main
#include <boost/test/unit_test.hpp>
It runs fine on Linux
using GCC
and on Windows
using both Visual Studio
and MinGw
.
Upvotes: -1