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:
- Was mache ich falsch?
- Kann ich überhaupt eine in C geschriebene Lib in meinem C++ code kompilieren?
- 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).