библиотека тестов boost: ошибка множественного определения

#c #unit-testing #boost #boost-test #multiple-definition-error

#c #модульное тестирование #boost #boost-тест #ошибка множественного определения

Вопрос:

Я пытаюсь протестировать библиотеку, которую я сделал (исчисление), в QtCreator для Windows.

Я создал основной файл и класс в отдельном файле для тестирования. Если я скомпилирую пример, найденный в 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(amp;WRayTesting::TestCalculus::testCartesianPoint2D, amp;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::ostreamamp;, 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::ostreamamp;)'
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::ostreamamp;)'
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::ostreamamp;, boost::unit_test::test_unit constamp;)'
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::ostreamamp;, boost::unit_test::test_unit constamp;, unsigned long)'
debug/main.o:c:/lib/boost/boost/test/impl/compiler_log_formatter.ipp:103: first defined here
...........
  

Ответ №1:

Вы не можете включить #include в несколько файлов в одном тестовом модуле. Вам нужно либо переключиться на библиотеку, либо поместить все в один файл

Комментарии:

1. Спасибо. Это явно объясняется в документации? То, что вы заявляете, также повторяется здесь: lists.boost.org/boost-users/2008/12/43338.php

2. Я предполагал, что такого не произойдет при правильном размещении headerguard. Когда я использовал Boost 1.64.0, эта проблема застала меня совершенно … врасплох.