2012-04-19 26 views
5

Creo que me estoy perdiendo algo realmente estúpido aquí.¿Cómo puedo enlazar a cppunit?

he instalado libcppunit: (estoy usando 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 

Y tengo una prueba sencilla:

#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; 
} 

Y esta es la salida del compilador:

$ 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 

Para estar seguro, las bibliotecas existen en/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 

¿Qué me estoy perdiendo que está causando esto?

+0

Un trabajo en torno a que he encontrado es colocar "-Wl, - no-como-necesaria" antes "-lcppunit" – Naddiseo

Respuesta

8

usted tiene que decirle al compilador que las bibliotecas para enlazar a después que usted le indique qué archivos para compilar, es decir

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

es que posible hacer esto para el googletest también? –

+2

@MartinPfeffer es * generalmente * necesario para colocar opciones de enlace después de las opciones de compilación. – steffen

1

me encontré con el mismo problema (con Ubuntu 11.04)

Este parece ser un bug en Ubuntu. Su solución alternativa "-Wl, -no-como-necesita" funciona para mí y también se menciona como una solución alternativa en el informe de errores vinculado. No me he sumergido lo suficiente como para descubrir la causa real.

+0

Ver https://wiki.ubuntu.com/NattyNarwhal/ToolchainTransition. Lamentablemente, este parece ser el enfoque equivocado. – moggi

1

La causa fundamental que supongo que es el archivo de tutorial cppunit doc "money_example.html", que propone añadir a la Makefile.am una línea

MoneyApp_LDFLAGS = $(CPPUNIT_LIBS) -ldl 

en lugar de la correcta

MoneyApp_LDADD = $(CPPUNIT_LIBS) -ldl 

o aún más correcta

MoneyApp_LDADD = $(CPPUNIT_LIBS) 

desde CPPUNIT_LIBS trae en el -ldl de todos modos. LDFLAGS agrega las marcas justo después de que el nombre del ejecutable del enlazador, LDADD las agrega al final, eliminando el error en la publicación original.

0

enlace añadir con cppunit y bibliotecas dl (-lcppunit -ldl)