2011-10-04 237 views
4

我正在尝试测试我在QTCreator for Windows中完成的(微积分)库。boost测试库:多重定义错误

我已经创建了一个主文件,并在测试的单独文件中创建了一个类。如果我编译在http://www.boost.org/doc/libs/1_47_0/libs/test/doc/html/utf/user-guide/test-organization/manual-test-suite.html中找到的示例,它的工作原理,因此在http://www.boost.org/doc/libs/1_47_0/libs/test/doc/html/utf/user-guide/test-organization/manual-nullary-test-case.html中找到的示例也适用。

但是,当我尝试编译我的项目,我有很多(超过500)多个定义的错误。下面你可以找到我的文件。正如你所看到的,我也试图在boost头文件中加入一些防范措施,但它不起作用。我究竟做错了什么?

的main.cpp

#include "testcalculus.h" 

#ifndef USE_BOOST_HEADERS 
#define USE_BOOST_HEADERS 
#include <boost/test/included/unit_test.hpp> 
#include <boost/bind.hpp> 
#endif 

using namespace boost::unit_test; 

test_suite* 
init_unit_test_suite(int argc, char* argv[]) 
{ 
    WRayTesting::TestCalculus xTestCalculus; 

    test_suite* pxTestSuiteCalculus = BOOST_TEST_SUITE("Test Calculus"); 

    pxTestSuiteCalculus->add(BOOST_TEST_CASE(boost::bind(&WRayTesting::TestCalculus::testCartesianPoint2D, &xTestCalculus))); 

    framework::master_test_suite().add(pxTestSuiteCalculus); 

    return 0; 
} 

testcalculus.h

#ifndef TESTCALCULUS_H 
#define TESTCALCULUS_H 

#ifndef USE_BOOST_HEADERS 
#define USE_BOOST_HEADERS 
#include <boost/test/included/unit_test.hpp> 
#include <boost/bind.hpp> 
#endif 

#include "cartesianpoint2d.h" 
#include "cartesianvector2d.h" 

namespace WRayTesting 
{ 

/** Class for testing the Calculus project */ 
class TestCalculus 
{ 
public: 

    //! Constructor 
    TestCalculus(); 

    //! Testing class point 
    void testCartesianPoint2D(); 

private: 

}; 

} // namespace WRayTesting 

#endif // TESTCALCULUS_H 

testcalculus.cpp

#include "testcalculus.h" 

#ifndef USE_BOOST_HEADERS 
#define USE_BOOST_HEADERS 
#include <boost/test/included/unit_test.hpp> 
#include <boost/bind.hpp> 
#endif 

namespace WRayTesting 
{ 

using ::Calculus::CartesianPoint2D; 
using namespace boost::unit_test; 


/** 
* Constructor 
*/ 
TestCalculus::TestCalculus() 
{ 

} 

/** 
* Test the CartesianPoint2D class. 
*/ 
void TestCalculus::testCartesianPoint2D() 
{ 
    // Default constructor 
    CartesianPoint2D xTestingPoint; 
    BOOST_CHECK(0.0 == xTestingPoint.getX()); 
    BOOST_CHECK(0.0 == xTestingPoint.getY()); 

} 

} // namespace WRayTesting 

编译输出

debug/testcalculus.o:c:/lib/boost/boost/test/impl/compiler_log_formatter.ipp:62: multiple definition of `boost::unit_test::output::compiler_log_formatter::log_start(std::ostream&, unsigned long)' 
debug/main.o:c:/lib/boost/boost/test/impl/compiler_log_formatter.ipp:62: first defined here 
debug/testcalculus.o:c:/lib/boost/boost/test/impl/compiler_log_formatter.ipp:72: multiple definition of `boost::unit_test::output::compiler_log_formatter::log_finish(std::ostream&)' 
debug/main.o:c:/lib/boost/boost/test/impl/compiler_log_formatter.ipp:72: first defined here 
debug/testcalculus.o:c:/lib/boost/boost/test/impl/compiler_log_formatter.ipp:80: multiple definition of `boost::unit_test::output::compiler_log_formatter::log_build_info(std::ostream&)' 
debug/main.o:c:/lib/boost/boost/test/impl/compiler_log_formatter.ipp:80: first defined here 
debug/testcalculus.o:c:/lib/boost/boost/test/impl/compiler_log_formatter.ipp:93: multiple definition of `boost::unit_test::output::compiler_log_formatter::test_unit_start(std::ostream&, boost::unit_test::test_unit const&)' 
debug/main.o:c:/lib/boost/boost/test/impl/compiler_log_formatter.ipp:93: first defined here 
debug/testcalculus.o:c:/lib/boost/boost/test/impl/compiler_log_formatter.ipp:103: multiple definition of `boost::unit_test::output::compiler_log_formatter::test_unit_finish(std::ostream&, boost::unit_test::test_unit const&, unsigned long)' 
debug/main.o:c:/lib/boost/boost/test/impl/compiler_log_formatter.ipp:103: first defined here 
........... 

回答

4

您不能在同一测试模块中的多个文件中包含#include。您可能需要切换到库或将所有内容放入单个文件中

+1

谢谢。这是在文档中明确解释的吗?你所说的也在这里重复: http://lists.boost.org/boost-users/2008/12/43338.php –

+0

我认为这样的事情不会发生适当的头盔保护安置。当我使用Boost 1.64.0时,这个问题完全引起我的注意。 – arthropod