CppUnit, очень простой тестовый код разбился, почему?

Я изучаю CppUnit, и мой код сбрасывается при вызове TestRunner::run(). Это строка 34 в приведенном ниже коде. Я не вижу ничего плохого. Он почти идентичен образцу кода в кулинарной книге CppUnit.

#include <iostream>  
#include <cppunit/TestCaller.h>  
#include <cppunit/TestSuite.h>  
#include <cppunit/ui/text/TestRunner.h>  
using namespace std;  

//class MyFixture: public CppUnit::TestFixture {  
class MyFixture{  
public:  
   MyFixture() {cout<<"MyFixture:: ctor()"<<endl;}  
   ~MyFixture() {cout<<"MyFixture:: dtor()"<<endl;}  
   void setUp() {cout<<"MyFixture::Setup()"<<endl;}  
   void tearDown() {cout<<"MyFixture::tearDown()"<<endl;}  
   void testFunc1() {cout<<"MyFixture::testFunc1()"<<endl; m=1; CPPUNIT_ASSERT(m==1);}  
   void testFunc2() {cout<<"MyFixture::testFunc2()"<<endl; m=2;}  
   int m;  
   static CppUnit::TestSuite * CreateSuite();  
};  

CppUnit::TestSuite * MyFixture::CreateSuite()  
{  
   CppUnit::TestSuite * suite = new CppUnit::TestSuite("My TestSuite for MyFixture");  
   suite->addTest(new CppUnit::TestCaller<MyFixture>("MyFixture::testFunc1", &MyFixture::testFunc1));  
   suite->addTest(new CppUnit::TestCaller<MyFixture>("MyFixture::testFunc2", &MyFixture::testFunc2));  
}  

int main()  
{  
   cout<<"point 1000"<<endl;  
   CppUnit::TextUi::TestRunner runner;  
   runner.addTest(MyFixture::CreateSuite());  
   cout<<"point 7000"<<endl;  
/*Line34*/   runner.run();  


   cout<<"point 8000"<<endl;  
}  

Результат:

  cppunit$ ./test_runner   
  point 1000  
  MyFixture:: ctor()  
  MyFixture:: ctor()  
  point 7000  
  Segmentation fault (core dumped)  

Трассировка стека:

(gdb)bt  
-0  0x00733cc9 in CppUnit::TestRunner::WrappingSuite::run(CppUnit::TestResult*) ()  
   from /usr/lib/libcppunit-1.12.so.1  
-1  0x0073170a in CppUnit::TestResult::runTest(CppUnit::Test*) () from /usr/lib/libcppunit-1.12.so.1  
-2  0x00733af0 in CppUnit::TestRunner::run(CppUnit::TestResult&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) () from /usr/lib/libcppunit-1.12.so.1  
-3  0x00736d2b in CppUnit::TextTestRunner::run(CppUnit::TestResult&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) () from /usr/lib/libcppunit-1.12.so.1  
-4  0x00736da2 in CppUnit::TextTestRunner::run(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool, bool, bool) () from /usr/lib/libcppunit-1.12.so.1  
-5  0x080494dd in main () at test_runner.cpp:34  

Строка компиляции: g++ -g -o -Wall test_runner test_runner.cpp -lcppunit
Он успешно компилируется без каких-либо предупреждений.
Если я включал "-Wall", он выдавал ошибку:

......
(.data+0x4): multiple definition of `__dso_handle'  
/usr/lib/i386-linux-gnu/gcc/i686-linux-gnu/4.5.2/crtbegin.o:(.data+0x0): first defined here  
test_runner: In function `_init':  
(.init+0x0): multiple definition of `_init'  
/usr/lib/i386-linux-gnu/gcc/i686-linux-gnu/4.5.2/../../../crti.o:(.init+0x0): first defined here  
/tmp/ccgzqvu9.o: In function `MyFixture::CreateSuite()':  
/home/fzhao/temp/cppunit/test_runner.cpp:22: multiple definition of `MyFixture::CreateSuite()'  
test_runner:/home/fzhao/temp/cppunit/test_runner.cpp:22: first defined here  
/tmp/ccgzqvu9.o: In function `main':  
/home/fzhao/temp/cppunit/test_runner.cpp:29: multiple definition of `main'  
test_runner:/home/fzhao/temp/cppunit/test_runner.cpp:29: first defined here  
/usr/lib/i386-linux-gnu/gcc/i686-linux-gnu/4.5.2/crtend.o:(.dtors+0x0): multiple definition of `__DTOR_END__'  
test_runner:(.dtors+0x4): first defined here  
/usr/bin/ld: warning: Cannot create .eh_frame_hdr section, --eh-frame-hdr ignored.  
/usr/bin/ld: error in test_runner(.eh_frame); no .eh_frame_hdr table will be created.  
collect2: ld returned 1 exit status  
make: *** [test_runner] Error 1  

person John Crane    schedule 11.10.2011    source источник
comment
Он рухнул или не построился? Выбери один.   -  person Lightness Races in Orbit    schedule 11.10.2011


Ответы (1)


Учитывая, что подпись для функции:

CppUnit::TestSuite * MyFixture::CreateSuite()

разве вы не должны что-то вернуть (я бы предположил, что suite)?

Не возвращая ничего, строка:

runner.addTest(MyFixture::CreateSuite());

собирается добавить очень хитрый указатель на ваш runner.


И причина, по которой вы, вероятно, получаете эти ошибки при вставке -Wall, заключается в том, что:

g++ -g -o -Wall test_runner test_runner.cpp -lcppunit
       \______/ \___________________________________/

попытается вывести ваш исполняемый файл в файл -Wall, соединив вместе test_runner, test_runner.cpp и библиотеку cppunit. Возможно, вы хотели ввести:

g++ -g -Wall -o test_runner test_runner.cpp -lcppunit
             \____________/ \_______________________/

(Здесь я предполагаю, что указанная вами строка компиляции была той, в которой произошли ошибки, поскольку на самом деле в ней есть -Wall ).

person paxdiablo    schedule 11.10.2011
comment
Но почему, когда я включаю -Wall, g++ выдает столько ошибок и не работает? Он сообщил о нескольких определениях main(), _init, _dso_handle? Теперь это мой главный вопрос. Я отредактирую пост, чтобы отразить это. - person John Crane; 11.10.2011
comment
@Джон, посмотри мой второй раздел. Если у вас есть -Wall там, где вы сказали, вы пытаетесь объединить исполняемый файл test_runner, test_runner.cpp и библиотеку cppunit. Поскольку в исполняемом файле уже все определено, вы получите повторяющиеся ошибки символов. Измените его так, чтобы -o и test_runner были рядом, и именно в таком порядке. - person paxdiablo; 11.10.2011
comment
Упс снова. Это еще одна глупая ошибка. Спасибо за помощь - person John Crane; 11.10.2011
comment
Нет проблем, @Джон. Только одно. Обычно не рекомендуется коренным образом менять свой вопрос, поскольку он нарушает ответы, которые уже были даны. Во что бы то ни стало расширьте информацию (добавив еще один блок кода), но добавление оператора return к существующему коду означает, что вопрос/ответы больше не совпадают, что делает их бесполезными для будущих посетителей. Я вернул вопрос, чтобы исправить это. - person paxdiablo; 11.10.2011