C++ mit Library, schaffe nicht mal Kompilierung



  • Hallo beisammen,

    ich habe bisher noch nie gegen eine Library gelinkt.
    Ich versuche mal zu erklären was ich machen möchte:

    * Ich habe einen fertigen C++ code der einwandfrei kompiliert.
    * Ich habe einen 2ten C-code den ich kompilieren kann und der als Library verwendet werden kann.
    * Jetzt möchte ich in meinem C++ code Datenstrukturen und Funktionen aus der Library verwenden.

    Ich dachte bisher ich kann es so machen:

    - Library kompilieren und verfügbar machen
    - in meinem code einfach die datenstrukturen der library benutzen. dazu habe ich die Indludes aus dem library-code als pfad mit -I in meinem g++ compilier verfügbar gemacht.
    - am ende linke ich mit -L gegen die library.

    Allerdings funktioniert das bei mir nicht. sobald ich eine datenstruktur
    setze sagt er: Fehler: »DieLIB_StructVector« wurde in diesem Gültigkeitsbereich nicht definiert.

    MEINE FRAGEN:

    1. Was mache ich falsch?
    2. Kann ich überhaupt eine in C geschriebene Lib in meinem C++ code kompilieren?
    3. Sollte ich vielleicht den umgekehrten Weg gehen und einen C-code schreiben in dem ich dann meinen C++ code aufrufe?

    Danke für jede Hilfe!



  • Was du falsch machst kann ich dir nicht genau sagen. Grundsätzlich kann man C-Libs mit C++ Programmen zusammenbinden.

    - Deine Fehlermeldung sieht nach einem fehlenden "#include" in deinem Code aus.

    - C-Funktionen kann man in C++ zwar verwenden, sie müssen aber als

    extern "C" int meineFunktion();
    

    deklariert werden. Möglicherweise sind diese Deklarationen schon in der Lib vorhanden.

    - Bibliotheken werden unter Unix mit "-L <Pfad zu den Libs> -lmeineLib" angegeben, wobei die Lib libmeineLib.a (pder auch .so) heißt.



  • Mit -L gibst du nur den Ort an, an dem die Lib liegt. Die lib selber linkst du dazu mit -lNameDerLib. Beim gcc und g++ wird implizit bei Libs das Praefix "lib" erwartet. Sprich bei -Lfoo -lmyLib sucht der Linker im Ordner foo nach der Lib libmyLib.[a|so]

    Ausserdem solltest du beim inkludieren der Header dem Compiler noch sagen, dass der Code mit C Linkage erstellt wurde. Also extern "C" { #include "foo.h" } etc. Damit sagst du dem Compiler (genauer: Linker), dass die Objekte in C gelinkt wurden und er sucht nach C-Objektnamen (und nicht C++ Objektnamen, die bei Funktionen z.B. den Typ im Namen codieren).


Anmelden zum Antworten