Ich arbeite mit einem Auftragnehmer zusammen, der eine Bibliothek für uns in C ++ entwickelt. Ich würde gerne wissen, ob es möglich ist, diese Bibliothek in einem C-Programm zu verwenden. Ich verwende Gcc als meinen Compiler.
Nein, das ist nicht möglich. Eine Sache, die sicherlich verpassen wird, sind Funktionen zur Handhabung von Ausnahmesituationen. Sie müssen den main mit dem C ++ - Compiler kompilieren.
Wenn Sie wirklich in c entwickeln und eine C ++ - Bibliothek verwenden möchten, können Sie eine c-Bibliothek entwickeln und main mit g ++ kompilieren.
Selbst wenn das Kompilieren erfolgreich ist, wird die Verknüpfung am Ende fehlschlagen. Sehen :
Warum kann ich eine gemischte statische C / C ++ - Bibliothek, die über eine C-Schnittstelle mit gcc verfügt, nicht verknüpfen?
Und es fehlt nicht nur die Ausnahmefunktionalität. Es gibt viele andere Dinge, die leicht gelöst werden können, indem man g ++ verwendet, um alles zu verknüpfen.
Wie bereits gesagt, ist die Lösung, eine Funktion von main aufzurufen und sie mit g ++ zu verknüpfen:
%Vor%Ja, das ist möglich. Wie BoBTFish in einem obigen Kommentar sagt, müssen Sie (oder der Auftragnehmer) jedoch eine C-Schnittstelle für die C ++ - Bibliothek entwerfen:
extern "C"
-Funktionen deklariert. Die Schnittstellen dieser Funktionen müssen in C gültig sein, was in C ++ bedeutet, dass sie nur POD-Typen verwenden (z. B. keine Referenzen) und keine Ausnahmen auslösen. Sie können Nicht-POD-C ++ - Klassen als unvollständige Typen deklarieren und Zeiger darauf verwenden. Daher wird jede nicht statische Elementfunktion häufig von einer Funktion umschlossen, die den Zeiger übernimmt, der als erster Parameter this
wird. #include
die Kopfzeile wo immer nötig) Ich nehme an, Sie könnten argumentieren, da das Programm mit g ++ verknüpft ist, ist es definitionsgemäß ein C ++ - Programm, das eine C-Bibliothek (die zufällig main
enthält) anstelle eines C-Programms verwendet verwendet eine C ++ - Bibliothek. Persönlich würde ich mich nicht darum kümmern, dass der wichtigste Punkt ist, dass keiner Ihrer bestehenden C-Code ändert.
Beispiel:
lib.h
%Vor%lib.cpp
%Vor%main.c
%Vor%bauen
%Vor% Das Folgende funktioniert auch anstelle der dritten Zeile, wenn Sie eine willkürliche Unterscheidung zwischen der Verwendung von gcc
zur Verknüpfung und der Verwendung von g++
machen wollen:
Allerdings , ich bin mir nicht sicher, ob gcc -libstdc++
so gut funktioniert wie g++
für den gesamten möglichen Code, der in lib.cpp
sein könnte. Ich habe es gerade für dieses Beispiel getestet, und natürlich gibt es eine Menge C ++, die ich nicht benutzt habe.
Diese kleine dynamische Bibliothek (g ++) und Programm (gcc) kompiliert und verbindet perfekt:
Kopfzeile library.h
%Vor%C ++ - Quelle library.cc kompiliert mit g ++ -shared -fpic library.cc -o libLibrary.so
%Vor%C Quelle main.c kompiliert mit gcc main.c -lLibrary -o Test
%Vor%Was genau ist das Problem? Haben Sie bereits eine ausgelieferte Bibliothek in der "falschen" Sprache oder möchte Ihr Auftragnehmer die Bibliothek in C ++ entwickeln, aber Sie benötigen sie, um von C zu verlinken?
Im ersten Fall sollten Sie, vorausgesetzt, Sie haben die Dinge richtig angegeben haben, das Problem Ihres Auftragnehmers machen, aber wenn Sie dies nicht tun oder nicht, müssen Sie eine Schnittstelle schreiben, wie oben von Steve Jessop vorgeschlagen.
Im letzteren Fall ist es wirklich kein Problem: Der Auftragnehmer muss sicherstellen, dass sie den Code in einer Form bereitstellt, die von C und safe / secure / stable abgerufen werden kann, um auf diese Weise zu telefonieren. Der interne Code, der die Arbeit erledigt, kann wirklich alles sein, wenn er sie auf die richtige Art und Weise für Sie bereitstellt. Wenn Sie planen, die Bibliothek selbst zu erstellen, benötigen Sie sie, um geeignete Build-Skripts bereitzustellen, die den Compiler auf die richtige Weise aufrufen. Ich denke, es gibt ein potenzielles Wartungsproblem, wenn Ihre internen Programmierer nicht mit C ++ zurechtkommen, aber das ist ein Problem, das mit Rekrutierung / Anstellung zu tun hat, nicht mit den technischen Details, wie es funktioniert.