2012-03-28 13 views
6

Próbuję wykorzystać Boost.Test w Visual Studio 2010, i mam problemy z uruchomieniem go. Oto źródło:Boost.Test na 64-bitowym systemie Windows

#include "stdafx.hpp" 

#define BOOST_TEST_MODULE (main) 
#include <boost/test/unit_test.hpp> 

BOOST_AUTO_TEST_CASE(morphology) 
{ 
    BOOST_CHECK(true); 
} 

stdafx.hpp jest dosłownie pusty. Projekt został utworzony jako pusty projekt C++, ustawiony na tworzenie aplikacji, z katalogami skonfigurowanymi tak, aby wskazywały nagłówki i biblioteki boost. Używam/wprowadzam, aby wskazać na funkcję main dostarczoną przez Boost.Test.

Wydaje się, że dzieje się kilka rzeczy. Po pierwsze, w czasie kompilacji, łącznik zgłasza ostrzeżenia nad wszystkimi obiektami w lib testowym, twierdząc, „sekcja .crt istnieje, nie może być statyczne nieobsłużone inicjalizatory lub terminatory”:

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 wykonywania, awarie aplikacji Test gdzieś w bibliotece Boost.Test pod drzewem wezwanie main dostarczonych przez 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()  

proszę .... ktoś mi powiedzieć, że to tylko flag kompilatora nie ustawiony, albo coś głupiego jak to ...

+0

[To może być pomocne w rozwiązaniu problemu] (http://stackoverflow.com/questions/6529003/crt-section-what-does-this-warning-mean). Na pobieżnej przepustce w Google jest to najlepsze, co mogę znaleźć w tej chwili. – MrGomez

+0

Tak, to była pierwsza rzecz, którą też znalazłem. Sugestie MSDN nie wydają się pomocne, ponieważ domyślnie nawet pusty projekt łączy się z bibliotekami wykonawczymi C i C++. Ponadto, jestem już "nie używać/noentry" z powodu użycia '/ entry'. –

+0

Dla pewności - zbudowałeś się wzmocnić? Jeśli tak, jakie opcje zostały przekazane do bjam/b2? – ildjarn

Odpowiedz

10

W porządku, mam to ustalone. Problem został spowodowany przez ustawienie/wejścia do punktu bezpośrednio do głównej, która omija wszystkie statyczne konstruktory obiektów i intializację środowiska wykonawczego. Po ustawieniu opcji /subsystem:console po prostu pozwól kompilatorowi poprawnie ustawić środowisko uruchomieniowe i wywołać funkcję main dostarczoną przez Boost.Test, która działała zgodnie z oczekiwaniami.

Co za kłopot.

Parametr /subsystem:console dotyczy łącznika MSVC. Aby to skonfigurować, kliknij projekt prawym przyciskiem myszy, przejdź do Linker | Command Line i dodaj /subsystem:console do Additional Options u dołu okna dialogowego. (VS2013)

+0

Yikes, brzmi denerwująco.Najlepiej słyszeć, że to teraz działa –

+0

Wow, Myślę, że zaoszczędziłeś mi dużo czasu .. Miał dokładnie ten sam problem, dzięki za to. – MOnsDaR

1

I użyj Boost.Test na x64 bez żadnych problemów.

Czy można sprawdzić, czy biblioteki uruchomieniowe języka C połączone w aplikacji są zgodne z używanymi przez funkcję Zwiększ? Wydaje się, że Boost używa/MDd zgodnie z wynikami twojego linkera. (Patrz MSDN).

+0

Wyjście 'dumpbin/all. \ Libboost_unit_test_framework-vc100-mt-gd-1_49.lib | select-string DEFAULTLIB' pokazuje 'msvcprtd' i' MSVCRTD'. Używam '/ MDd' w mojej aplikacji (która łączy się z' MSVCRTD'). –

+0

Jak skonfigurować swój projekt? –

+0

Zgodnie ze schematem [Boost nazing] (http://www.boost.org/doc/libs/1_49_0/more/getting_started/windows.html#library-naming) '-mt-gd' oznacza debugowanie wielowątkowe (non -statycznie połączone). Czy to pasuje do ustawień domyślnych (/ MDd w ustawieniach projektu)? –

Powiązane problemy