2012-04-19 2 views
5

Я думаю, что мне не хватает чего-то действительно глупого здесь.Как подключиться к cppunit?

Я libcppunit установили: (я использую Ubuntu 12.04)

$ apt-cache policy libcppunit-dev 
libcppunit-dev: 
    Installed: 1.12.1-4 
    Candidate: 1.12.1-4 
    Version table: 
*** 1.12.1-4 0 
     500 http://archive.ubuntu.com/ubuntu/ precise/main amd64 Packages 
     100 /var/lib/dpkg/status 

$ apt-cache policy libcppunit-1.12-1 
libcppunit-1.12-1: 
    Installed: 1.12.1-4 
    Candidate: 1.12.1-4 
    Version table: 
*** 1.12.1-4 0 
     500 http://archive.ubuntu.com/ubuntu/ precise/main amd64 Packages 
     100 /var/lib/dpkg/status 

И у меня есть простой тест:

#include <iostream> 

#include <cppunit/ui/text/TestRunner.h> 
#include <cppunit/CompilerOutputter.h> 
#include <cppunit/TestFixture.h> 
#include <cppunit/extensions/HelperMacros.h> 

int main() { 
    CppUnit::Test* suite = CppUnit::TestFactoryRegistry::getRegistry().makeTest(); 

    CppUnit::TextUi::TestRunner runner; 
    runner.addTest(suite); 
    runner.setOutputter(new CppUnit::CompilerOutputter(&runner.result(), std::cerr)); 

    return runner.run() ? 0 : 1; 
} 

И это вывод компилятора:

$ g++ -lcppunit -o test.bin test.cpp 
/tmp/ccoQDuGC.o: In function `main': 
test.cpp:(.text+0x36): undefined reference to `CppUnit::TestFactoryRegistry::getRegistry(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)' 
test.cpp:(.text+0x75): undefined reference to `CppUnit::TextTestRunner::TextTestRunner(CppUnit::Outputter*)' 
test.cpp:(.text+0x8b): undefined reference to `CppUnit::TestRunner::addTest(CppUnit::Test*)' 
test.cpp:(.text+0x9a): undefined reference to `CppUnit::TextTestRunner::result() const' 
test.cpp:(.text+0xe2): undefined reference to `CppUnit::CompilerOutputter::CompilerOutputter(CppUnit::TestResultCollector*, std::basic_ostream<char, std::char_traits<char> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)' 
test.cpp:(.text+0xf4): undefined reference to `CppUnit::TextTestRunner::setOutputter(CppUnit::Outputter*)' 
test.cpp:(.text+0x150): undefined reference to `CppUnit::TextTestRunner::run(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool, bool, bool)' 
test.cpp:(.text+0x189): undefined reference to `CppUnit::TextTestRunner::~TextTestRunner()' 
test.cpp:(.text+0x227): undefined reference to `CppUnit::TextTestRunner::~TextTestRunner()' 
collect2: ld returned 1 exit status 

Чтобы убедиться, что библиотеки существуют под/usr/lib

$ ls /usr/lib/ | grep cppunit 
libcppunit-1.12.so.1 
libcppunit-1.12.so.1.0.0 
libcppunit.a 
libcppunit.la 
libcppunit.so 

Что мне не хватает, что вызывает это?

+0

работа вокруг я нашел не размещать «-Wl, - не-по мере необходимости» перед «-lcppunit» – Naddiseo

ответ

8

Вы должны сообщить компилятору, какие библиотеки для связи с после вы указать, какие файлы для компиляции, т.е.

g++ test.cpp -lcppunit -o test.bin 
+0

является его возможно ли это сделать для googletest тоже? –

+2

@MartinPfeffer * Обычно * необходимо указать параметры ссылки после компиляции. – steffen

1

Я побежал в том же номере (с Ubuntu 11.04)

Это представляется bug в Ubuntu. Ваше обходное решение «-Wl, - no-as-needed» работает для меня и также упоминается как обходной путь в связанном отчете об ошибке. Я не нырнул в него достаточно, чтобы обнаружить настоящую причину.

+0

См. Https://wiki.ubuntu.com/NattyNarwhal/ToolchainTransition. К сожалению, это, по-видимому, неправильный подход. – moggi

1

Основная причина я думаю это CppUnit документ учебник файл «money_example.html», который предлагает добавить в Makefile.am линию

MoneyApp_LDFLAGS = $(CPPUNIT_LIBS) -ldl 

вместо правильного

MoneyApp_LDADD = $(CPPUNIT_LIBS) -ldl 

или даже более правильно

MoneyApp_LDADD = $(CPPUNIT_LIBS) 

так CPPUNIT_LIBS приносит в -ldl во всяком случае. LDFLAGS добавляет флаги сразу после исполняемого имени компоновщика, LDADD добавляет их в конце, устраняя ошибку в исходном сообщении.

0

обмен ссылками с CppUnit и дл (-lcppunit -ldl) библиотеки

Смежные вопросы