Frage

Ist es für gcc möglich, eine Verknüpfung mit einer Bibliothek herzustellen, die mit Visual C++ erstellt wurde?Wenn ja, gibt es Konflikte/Probleme, die dadurch entstehen könnten?

War es hilfreich?

Lösung

Einige der Kommentare in den Antworten hier sind etwas zu allgemein.

Obwohl nein, werden im genannten speziellen Fall gcc-Binärdateien nicht mit einer VC++-Bibliothek (AFAIK) verknüpft.Die eigentliche Art der Verknüpfung von Code/Bibliotheken ist eine Frage des verwendeten ABI-Standards.

Ein zunehmend verbreiteter Standard in der Embedded-Welt ist der EABI- (oder ARM-ABI-)Standard (basierend auf der Arbeit während der Itanium-Entwicklung). http://www.codesourcery.com/cxx-abi/).Wenn Compiler EABI-kompatibel sind, können sie ausführbare Dateien und Bibliotheken erstellen, die miteinander funktionieren.Ein Beispiel für die Zusammenarbeit mehrerer Toolchains ist der RVCT-Compiler von ARM, der Binärdateien erstellt, die mit GCC ARM ABI-Binärdateien funktionieren.

(Der Link zur Codequelle ist derzeit nicht verfügbar, kann aber von Google zwischengespeichert werden.)

Andere Tipps

Ich würde es nicht vermuten.Normalerweise verwenden C++-Compiler ganz unterschiedliche Methoden zur Namensverfälschung, was bedeutet, dass die Linker nicht die richtigen Symbole finden.Das ist übrigens eine gute Sache, denn der Standard erlaubt C++-Compilern weitaus größere Inkompatibilitäten, die dazu führen, dass Ihr Programm abstürzt, abstürzt, Welpen frisst und Farbe überall an der Wand verschmiert.

Übliche Lösungsansätze hierfür umfassen in der Regel sprachunabhängige Techniken wie COM oder CORBA.Eine einfachere, heilige Methode ist die Verwendung von C-„Wrappern“ um Ihren C++-Code.

Es ist nicht möglich.Normalerweise ist es nicht einmal möglich, Bibliotheken zu verknüpfen, die von verschiedenen Versionen desselben Compilers erstellt wurden.

NEIN.Schlicht und einfach :-)

Ja, wenn Sie daraus einen dynamischen Link machen und die Schnittstelle im C-Stil gestalten.lib.exe generiert Importbibliotheken, die mit der gcc-Toolchain kompatibel sind.

Dadurch werden Ihre Verknüpfungsprobleme gelöst.Allerdings ist das erst der Anfang des Problems.

Ihre größeren Probleme werden Dinge wie Ausnahmen und Speicherzuweisung sein.

  • Sie müssen sicherstellen, dass keine Ausnahme von VC++ auf GCC-Code übergeht, es gibt keine Garantien für die Kompatibilität.
  • Jedes Objekt aus der VC++-Bibliothek muss aus folgenden Gründen auf dem Heap gespeichert werden:
  • Mischen Sie gcc new/delete nicht mit irgendetwas aus VC++, da sonst schlimme Dinge passieren werden.Dies gilt auch für die Objektkonstruktion auf dem Stapel.Wenn Sie jedoch eine Schnittstelle wie create_some_obj()/delete_some_obj() erstellen, verwenden Sie am Ende nicht gcc new, um VC++-Objekte zu erstellen.Erstellen Sie vielleicht ein kleines Handler-Objekt, das den Aufbau und die Zerstörung übernimmt.Auf diese Weise behalten Sie RAII bei, verwenden aber weiterhin die C-Schnittstelle für die echte Schnittstelle.
  • Die Aufrufkonvention muss korrekt sein.In VC++ gibt es cdecl und stdcall.Wenn gcc versucht, eine importierte Funktion mit dem falschen Aufruftyp aufzurufen, passieren schlimme Dinge.

Die Quintessenz ist, eine einfache Schnittstelle zu behalten, die ANSI C-kompatibel ist, und alles sollte in Ordnung sein.Die Tatsache, dass verrücktes C++ dahinter steckt, ist in Ordnung, solange es eingedämmt wird.

Oh, und stellen Sie sicher, dass der gesamte Code reentrant ist, sonst besteht die Gefahr, dass ein ganz anderer Can-o-Wurm geöffnet wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top