我正在尝试使用Visual Studio2010中的Boost.Test,但我遇到了一些问题。以下是源代码:
#include "stdafx.hpp"
#define BOOST_TEST_MODULE (main)
#include <boost/test/unit_test.hpp>
BOOST_AUTO_TEST_CASE(morphology)
{
BOOST_CHECK(true);
}stdafx.hpp从字面上看是空的。该项目被创建为一个空的C++项目,设置为构建应用程序,并将目录设置为指向boost头文件和库。我使用/entry指向Boost.Test提供的main函数。
似乎有几件事正在发生。首先,在构建时,链接器报告测试库中所有对象的警告,声称".CRT部分存在;可能存在未处理的静态初始化器或终止符“:
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运行时,测试应用程序在Boost.Test库中Boost.Test提供的main的调用树下的某处崩溃:
> 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告诉我有一个编译器标志我没有设置,或者像这样的愚蠢的东西……
发布于 2012-03-30 14:56:21
好了,我想通了。这个问题是由我将/entry设置为直接指向main引起的,它绕过了所有静态对象构造函数和运行时初始化。一旦我设置了/subsystem:console选项,并让编译器正确地设置运行时并调用Boost.Test提供的main函数,它就可以正常工作了。
真是个麻烦。
/subsystem:console参数用于MSVC链接器。要对此进行配置,请右键单击您的项目,转到Linker|Command Line,并在对话框底部将/subsystem:console添加到Additional Options。(VS2013)
发布于 2012-03-29 05:05:00
我在x64上使用Boost.Test没有任何问题。
您能否验证在应用程序中链接的C运行时库是否与Boost使用的库匹配?根据您的链接器输出,Boost似乎正在使用/MDd。(参见MSDN)。
https://stackoverflow.com/questions/9915565
复制相似问题