Linkerproblem bei Aufruf einer C Funktion aus statischer Lib (g++)
-
Hallo zusammen!
Ich schreibe ein C-Programm welches ich aus Bequemlichkeit mittels CPPUNIT testen möchte. Ich hoffe, ich kann den Code auf das wesentliche reduzieren:
readTSP.h:
enum ioError IO_fillTSPInstanceFromString(tTSPInstance* pTSPInst, const char* tspString);
Die C-Bibliothek wird mittels
gcc -MD -E readTSP.c -I../src > /dev/null && \ mv readTSP.d ../tmp gcc -g -Wall -pedantic -I../src -c readTSP.c -o readTSP.o && \ mv readTSP.o ../tmp ar r ../bin/libtsp.a ../tmp/readTSP.o ar: creating archive ../bin/libtsp.a
erstellt.
Nun binde ich sie in meine Testklasse ein:
#include "tsplib.h" // ... void cTestIO::tReadAndVerifyTSP() { tTSPInstance testInstance; int ioerr = IO_fillTSPInstanceFromString(&testInstance, mTSP.c_str()); CPPUNIT_ASSERT( IO_ERROR_OK == ioerr ); }
Beim Linken erhalte ich dann einen Fehler:
g++ -o testTSP ../../tmp/test.o ../../tmp/testIO.o -L../../bin -L/opt/cppunit/lib -ltsp -lcppunit -lstdc++ && \ mv testTSP ../../bin /usr/bin/ld: Undefined symbols: IO_fillTSPInstanceFromString(uTSPInstance*, char const*) collect2: ld returned 1 exit status
Verzichte ich auf den Aufruf von IO_fillTSPInstanceFromString funktioniert alles. Im ../../bin befindet sich tatsächlich die Datei libtsp.a
Wenn ich eine main.c schreibe, die einfach nur libtsp.h und stdio.h einbindet, um IO_fillTSPInstanceFromString aufzurufen und ein "Hurra" auszugeben, funktioniert das Linken.
Ich verstehe nun nicht, warum es in der C++ Klasse Probleme gibt. Kann ich C Funktionen nicht statisch binden in einer C++ Applikation?
Gibt es Probleme mit Namespaces? Ich habe auch::IO_fillTSPInstanceFromString
aufgerufen - ohne Erfolg...
-
Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum Compiler- und IDE-Forum verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Zwei Dinge habe ich mittlerweile selbst herausgefunden:
-
Auf Mac OSX funktioniert der Schalter -shared des gcc nicht.
Gute Übersicht über das Generieren dynamischer Bibliotheken: http://www.fortran-2000.com/ArnaudRecipes/sharedlib.html -
Die libtsp.a sollte auch mittels g++ erstellt werden. Warum das so ist, kann ich nur erahnen. Aber so funktioniert's auch mit statischer Bindung.
-