2012-04-19 61 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

圍繞我找到了一個工作,是把「輪候冊, - 無按需」之前「-lcppunit」 – Naddiseo 2012-04-19 22:53:23

回答

8

你必須告訴哪些庫後鏈接到你告訴它哪些文件彙編編譯器,即

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

是也有可能爲googletest做到這一點? – 2015-12-10 23:23:22

+2

@MartinPfeffer它通常*是編譯選項後放置鏈接選項所必需的。 – steffen 2015-12-20 16:18:15

1

我碰到了同樣的問題(與Ubuntu 11.04)

這在Ubuntu中似乎是bug。您的解決方法「-Wl, - 不需要」適用於我,並且在鏈接的錯誤報告中也被提及爲解決方法。我沒有深入到足以發現真正的原因。

+0

查看https://wiki.ubuntu.com/NattyNarwhal/ToolchainTransition。可悲的是,這似乎是錯誤的做法。 – moggi 2012-05-06 14:49:19

1

的根本原因我想是提出添加到Makefile.am線

MoneyApp_LDFLAGS = $(CPPUNIT_LIBS) -ldl 

而不是正確的

MoneyApp_LDADD = $(CPPUNIT_LIBS) -ldl 

或CppUnit的文檔的教程文件「money_example.html」更正確

MoneyApp_LDADD = $(CPPUNIT_LIBS) 

因爲CPPUNIT_LIBS帶來了-ldl無論如何。 LDFLAGS在鏈接器可執行文件名後面添加標記,LDADD最後添加它們,從而消除原始文章中的錯誤。與CppUnit的和DL(-lcppunit -ldl)庫