Ich habe einen Client, der einen C ++ - Code enthält, den ich unbedingt in einem wirklich großen Projekt verwenden muss, das in C geschrieben wurde.
Das Problem ist: Ich kann den C ++ Code nicht schreiben, um in C zu sein ... wäre zu einfach, ich habe die IP auf diesem Code nicht und der Klient muss den Code behalten.
Ich kann auch mein wirklich großes Projekt in C nicht mit g ++ verlinken: das würde Dinge kaputt machen!
Ich habe versucht, den C ++ - Code in eine lib umzuwandeln, indem ich eine C-Style-Schnittstelle (mit externem "C", Klassen in Strukturen kapseln) verwandle, aber ich habe ein Problem beim Verknüpfen dieser Bibliothek mit meinem Projekt ... kann nicht mit g ++ verlinken): Ich lande mit undefinierten Referenzen auf fast alle STL Verzweifelt verband ich die STL statisch mit der C / C ++ - Wrapper-Lib, die ich gemacht habe, aber das änderte nichts.
Ich weiß nicht viel über C ++, aber ich möchte keinen C ++ - STL / C-Wrapper für diesen speziellen Anwendungsfall schreiben.
Im Moment habe ich eine Binärdatei aus dem C ++ - Code erstellt, und ich nenne sie mit fork / exec in meinem C-Code ... das ist eine wirklich schlechte Lösung, die ich gerne vermeiden würde.
Wenn jemand einen Hinweis / eine Richtung / einen Hinweis hat, Das wäre sehr zu begrüßen.
Thx, Guillaume.
Die eigentliche Antwort auf diese Frage, abgesehen von Azzys Antwort, ist wirklich eine Frage dessen, was Sie tun müssen, um Ihren C ++ Code aufzurufen.
Die Verwendung von fork ist zwar eine gute Idee, aber im Allgemeinen würde ich sagen, dass das nicht die richtige Lösung ist, es sei denn, der C ++ - Code benötigt eine gewisse Zeit für die Ausführung [in diesem Fall ist der fork / exec-Overhead klein genug, um egal zu sein].
Im Allgemeinen besteht die richtige Lösung darin, eine kleine Schnittstelle zwischen Ihrem Programm und dem C ++ - Code zu schreiben. Verwenden Sie dazu eine C-Schnittstelle (und die extern "C"
-Wrapper). Vergessen Sie nicht #ifdef __cplusplus
in der Definition zu verwenden die Schnittstelle, um die extern "C"
, so dass Sie die gleiche Header-Datei in der C ++ - Schnittstellenimplementierung und dem aufrufenden C-Code verwenden können).
Achten Sie auch auf Ausnahmen. Sie MÜSSEN NICHT C aufrufen ++ Code, der Ausnahmen von C führt - sie in C behandelt werden müssen ++ oder BAD Dinge passieren (genau, welche Art von schlechten Dinge nicht bestimmbar ist - Random-Code kann ausgeführt werden, oder das System abstürzt werden, oder einige zufällige fehlerhafte Ausgabe erfolgt, etc)
Sie könnten die freigegebene C ++ - Bibliothek mit g++
verknüpfen und diese mit Ihrem Programm mit gcc
verknüpfen, etwa wie folgt:
Verwenden Sie dann diese gemeinsam genutzte Bibliothek in Ihrem C-Projekt:
%Vor%Denken Sie daran, dass Sie eine gemeinsam genutzte Bibliothek mit anderen gemeinsam genutzten Bibliotheken verknüpfen können.
Natürlich möchten Sie Ihr Bausystem ändern, z. Dein Makefile
-s, um die obigen Befehle auszuführen.
Beachten Sie auch, dass einige Funktionen das Funktionsattribut constructor
(und die C ++ - Kompilierung verwenden) haben das viel, für die Konstruktion von statischen C ++ - Instanzen). Diese Funktionen werden vor main
ausgeführt. symmetrisch läuft die Funktion mit dem Attribut destructor
nach main
. Bei dynamisch geladenen Bibliotheken, die von dlopen
geladen werden, werden Konstruktorfunktionen während dlopen
und Destruktorfunktionen während dlclose
ausgeführt.
Wie einige andere darauf hingewiesen haben, hüte dich vor C ++ - Ausnahmen, die über eine C-Grenze geworfen werden