Boost.Test on 64-bit Windows

I am trying to use Boost.Test in Visual Studio 2010 and I am having problems with its operation. Here is the source:

#include "stdafx.hpp" #define BOOST_TEST_MODULE (main) #include <boost/test/unit_test.hpp> BOOST_AUTO_TEST_CASE(morphology) { BOOST_CHECK(true); } 

stdafx.hpp literally empty. The project was created as an empty C ++ project, installed to create an application, with directories configured to raise headers and libraries. I use / entry to point to the main function provided by Boost.Test.

It seems that several things are happening. First, during assembly, the linker gives warnings about all objects in the test library, stating that there is a section β€œ.CRT, there may be raw static initializers or terminators”:

 1>msvcprtd.lib(locale0_implib.obj) : warning LNK4210: .CRT section exists; there may be unhandled static initializers or terminators 1>morphology.obj : warning LNK4210: .CRT section exists; there may be unhandled static initializers or terminators 1>libboost_unit_test_framework-vc100-mt-gd-1_49.lib(unit_test_main.obj) : warning LNK4210: .CRT section exists; there may be unhandled static initializers or terminators 1>libboost_unit_test_framework-vc100-mt-gd-1_49.lib(framework.obj) : warning LNK4210: .CRT section exists; there may be unhandled static initializers or terminators 1>libboost_unit_test_framework-vc100-mt-gd-1_49.lib(test_tools.obj) : warning LNK4210: .CRT section exists; there may be unhandled static initializers or terminators 1>libboost_unit_test_framework-vc100-mt-gd-1_49.lib(unit_test_log.obj) : warning LNK4210: .CRT section exists; there may be unhandled static initializers or terminators 1>libboost_unit_test_framework-vc100-mt-gd-1_49.lib(unit_test_suite.obj) : warning LNK4210: .CRT section exists; there may be unhandled static initializers or terminators 1>libboost_unit_test_framework-vc100-mt-gd-1_49.lib(results_reporter.obj) : warning LNK4210: .CRT section exists; there may be unhandled static initializers or terminators 1>libboost_unit_test_framework-vc100-mt-gd-1_49.lib(results_collector.obj) : warning LNK4210: .CRT section exists; there may be unhandled static initializers or terminators 1>libboost_unit_test_framework-vc100-mt-gd-1_49.lib(unit_test_parameters.obj) : warning LNK4210: .CRT section exists; there may be unhandled static initializers or terminators 1>libboost_unit_test_framework-vc100-mt-gd-1_49.lib(unit_test_monitor.obj) : warning LNK4210: .CRT section exists; there may be unhandled static initializers or terminators 1>libboost_unit_test_framework-vc100-mt-gd-1_49.lib(debug.obj) : warning LNK4210: .CRT section exists; there may be unhandled static initializers or terminators 1>libboost_unit_test_framework-vc100-mt-gd-1_49.lib(progress_monitor.obj) : warning LNK4210: .CRT section exists; there may be unhandled static initializers or terminators 1>libboost_unit_test_framework-vc100-mt-gd-1_49.lib(plain_report_formatter.obj) : warning LNK4210: .CRT section exists; there may be unhandled static initializers or terminators 1>libboost_unit_test_framework-vc100-mt-gd-1_49.lib(xml_report_formatter.obj) : warning LNK4210: .CRT section exists; there may be unhandled static initializers or terminators 

The runtime of the program, the test application crashes somewhere in the Boost.Test library under the main call tree provided by Boost.Test:

 > Pentachoron.Test.exe!std::list<boost::shared_ptr<boost::runtime::cla::parameter>,std::allocator<boost::shared_ptr<boost::runtime::cla::parameter> > >::begin() Line 787 + 0x13 bytes C++ Pentachoron.Test.exe!boost::unit_test::for_each::begin<std::list<boost::shared_ptr<boost::runtime::cla::parameter>,std::allocator<boost::shared_ptr<boost::runtime::cla::parameter> > > >(const std::list<boost::shared_ptr<boost::runtime::cla::parameter>,std::allocator<boost::shared_ptr<boost::runtime::cla::parameter> > > & t, boost::mpl::bool_<1> __formal) Line 107 + 0xf bytes C++ Pentachoron.Test.exe!boost::runtime::cla::parser::operator[](boost::unit_test::basic_cstring<char const > string_id) Line 169 + 0x41 bytes C++ Pentachoron.Test.exe!boost::unit_test::runtime_config::`anonymous namespace'::retrieve_parameter<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >(boost::unit_test::basic_cstring<char const > parameter_name, const boost::runtime::cla::parser & s_cla_parser, const std::basic_string<char,std::char_traits<char>,std::allocator<char> > & default_value, const std::basic_string<char,std::char_traits<char>,std::allocator<char> > & optional_value) Line 216 + 0x34 bytes C++ Pentachoron.Test.exe!boost::unit_test::runtime_config::report_sink() Line 470 + 0x8b bytes C++ Pentachoron.Test.exe!boost::unit_test::results_reporter::`anonymous namespace'::results_reporter_impl::results_reporter_impl() Line 59 + 0x31 bytes C++ Pentachoron.Test.exe!boost::unit_test::results_reporter::`anonymous namespace'::s_rr_impl() Line 91 + 0x35 bytes C++ Pentachoron.Test.exe!boost::unit_test::results_reporter::get_stream() Line 120 + 0x5 bytes C++ Pentachoron.Test.exe!`boost::unit_test::unit_test_main'::`1'::catch$3() Line 207 + 0x5 bytes C++ msvcr100d.dll!_CallSettingFrame() Line 44 Asm msvcr100d.dll!__CxxCallCatchBlock(_EXCEPTION_RECORD * pExcept) Line 1337 + 0x15 bytes C++ ntdll.dll!0000000077c50c21() [Frames below may be incorrect and/or missing, no symbols loaded for ntdll.dll] Pentachoron.Test.exe!boost::unit_test::unit_test_main(boost::unit_test::test_suite * (int, char * *)* init_func, int argc, char * * argv) Line 179 C++ Pentachoron.Test.exe!main(int argc, char * * argv) Line 238 C++ kernel32.dll!000000007753652d() ntdll.dll!0000000077c2c521() 

Please ... someone will tell me that there is only a compiler flag that I did not set, or something stupid like that ...

+6
source share
2 answers

OK I understood. The problem was caused by the installation / input of cells directly to the main one, which bypasses all the designers of static objects and initialization of the runtime. Once I set the /subsystem:console option and just let the compiler properly configure the runtime and call the main function provided by Boost.Test, it worked as expected.

What a hassle.

The /subsystem:console is for the MSVC linker. To configure this, right-click your project, go to Linker | Command Line and add /subsystem:console to Additional Options at the bottom of the dialog box. (VS2013)

+10
source

I use Boost.Test on x64 with no problems.

Can you verify that the C runtime libraries that you link in your application match those used by Boost? Boost apparently uses / MDd according to your linker. (See MSDN .)

+1
source

Source: https://habr.com/ru/post/911896/


All Articles