2011-10-04 239 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