c ++ - Boost.Test på 64-bit Windows

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg forsøger at udnytte Boost.Test i Visual Studio 2010, og jeg har problemer med at få det til at fungere. Her er kilden:


#include "stdafx.hpp"

#define BOOST\_TEST\_MODULE (main)
#include <boost/test/unit\_test.hpp>

BOOST\_AUTO\_TEST\_CASE(morphology)
{
    BOOST\_CHECK(true);
}


stdafx.hpp er bogstaveligt talt tom. Projektet blev oprettet som et tomt C + + -projekt, der er indstillet til at opbygge et program, med mapper oprettet for at pege på at øge overskrifter og libs. Jeg bruger/indgang til at pege på funktionen main, der leveres af Boost.Test.


Der synes at være et par ting der foregår. For det første rapporterer linkeren advarsler over alle objekter i test lib, der hævder '.CRT-sektionen', da der kan være uhåndterede statiske initialiserere eller terminatorer ':


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


Art runtime, kolliderer testprogrammet et sted i Boost.Test biblioteket under opkaldstræet af main, som Boost.Test tilbyder:


>   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()    


Vær venlig .... nogen fortæller mig der er bare et compiler flag jeg ikke satte eller noget dumt sådan

Bedste reference


Okay, jeg fik det ud. Problemet blev forårsaget af mig indstilling/indtastning til punkt direkte til main, som omgår alle de statiske objektkonstruktorer og runtime intialisering. Når jeg har indstillet /subsystem:console mulighed og bare lad kompilatoren opsætte runtime korrekt og kalde funktionen main leveret af Boost.Test, fungerede det som forventet.


Hvad et besvær.


Parameteren /subsystem:console er til MSVC-linkeren. For at konfigurere dette skal du højreklikke på dit projekt, gå til Linker | Command Line og tilføj /subsystem:console til Additional Options nederst i dialogboksen. (VS2013)

Andre referencer 1


Jeg bruger Boost.Test på x64 uden problemer.


Kan du kontrollere, at de C-runtime-biblioteker, du linker i din ansøgning, svarer til den, der bruges af Boost? Boost ser ud til at bruge/MDd ifølge din linker output. (Se MSDN). [14]