我正在学习CppUnit,并且在调用TestRunner :: run()时我的代码是coredumped。这是下面代码中的第34行。我看不出有什么不对劲。它几乎与CppUnit cookbook中的示例代码完全相同。
#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
答案 0 :(得分: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
。