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:

    1. 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

    2. 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.


Anmelden zum Antworten