Verwenden Sie C ++ - Code in einem C-Projekt

8

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.

    
granquet 24.12.2012, 11:48
quelle

2 Antworten

3

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)

    
Mats Petersson 24.12.2012 12:09
quelle
1

Sie könnten die freigegebene C ++ - Bibliothek mit g++ verknüpfen und diese mit Ihrem Programm mit gcc verknüpfen, etwa wie folgt:

%Vor%

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

    
Basile Starynkevitch 24.12.2012 12:00
quelle

Tags und Links