Frage

Ich kam aus der Linux -Welt und kannte viele Artikel über die Aufrechterhaltung der Binärverträglichkeit (BC) einer dynamischen Bibliothek -API, die in C ++ - Sprache geschrieben wurde. Einer von ihnen ist "Richtlinien/Binärkompatibilitätsprobleme mit C ++" basierend auf Itanium C ++ ABI, der vom GCC -Compiler verwendet wird. Aber ich kann für den Microsoft C ++ - Compiler (von MSVC) nichts Ähnliches finden.

Ich verstehe, dass die meisten Techniken für den MS C ++ - Compiler anwendbar sind und ich möchte entdecken Compiler-spezifisch Probleme im Zusammenhang mit ABI-Unterschieden (V-Tisch-Layout, Schuhling usw.)

Meine Fragen sind also folgende:

  • Kennen Sie Unterschiede zwischen MS C ++ und GCC -Compilern bei der Aufrechterhaltung von BC?
  • Wo finde ich Informationen über MS C ++ ABI oder über die Aufrechterhaltung der BC der API in Windows?

Alle verwandten Informationen werden sehr geschätzt.
Vielen dank für Deine Hilfe!

War es hilfreich?

Lösung

Zuallererst sind diese Richtlinien allgemein und beziehen sich nicht nur auf GCC. Zum Beispiel: Private/Public -Mark in Funktionen ist etwas Spezifisches für MSVC und nicht für GCC.

Grundsätzlich sind diese Regeln auch für MSVC und General Compiler vollständig anwendbar.

Aber...

Sie sollten sich erinnern:

  1. GCC/C ++ hält seinen ABI seit 3.4 -Veröffentlichung stabil und es ist ungefähr 7 Jahre (seit 2004), während MSVC seine ABI jede Hauptveröffentlichung durchbricht: MSVC8 (2005), MSVC9 (2008), MSVC10 (2010) sind nicht miteinander kompatibel.
  2. Einige häufig mit MSVC verwendete Flaggen können ABI brechen (wie das Ausnahmenmodell)
  3. MSVC verfügt über inkompatible Run-Times für Debug- und Release-Modi.

Ja, Sie können diese Regeln verwenden, aber wie im üblichen Fall von MSVC hat es viel mehr Macken.

Siehe auch "Einige Gedanken zur binären Kompatibilität"Und QT hält sie auch mit MSVC stabil.

Beachten Sie, ich habe einige Erfahrung damit, wenn ich diese Regeln befolge CPPCMS

Andere Tipps

Unter Windows haben Sie im Grunde 2 Optionen für eine langfristige binäre Kompatibilität:

  1. Com
  2. com

Schauen Sie sich meinen Beitrag hier an. Dort sehen Sie einen Weg, um DLLs zu erstellen und auf Binär kompatible Weise über verschiedene Compiler und Compiler -Versionen auf DLLs zuzugreifen.

C ++ DLL -Plugin -Schnittstelle

Die beste Regel für die Binärkompatibilität von MSVC ist die Verwendung einer C -Schnittstelle. Die einzige C ++ -Funktion, mit der Sie nach meiner Erfahrung davonkommen können. Stellen Sie also alles als Schnittstellen dar, die C -Datentypen verwenden.

Hier ist eine Liste von Dingen, die sind nicht binär kompatibel:

  • Die stl. Das binäre Format ändert sich auch nur zwischen Debug/Release und je nach Compiler-Flaggen.
  • Haufen. Unterlassen Sie new / malloc in einem Modul und delete / free in einem anderen. Es gibt verschiedene Haufen, die nichts über einander wissen. Ein weiterer Grund, warum die STL nicht mit Kreuzmodulen funktioniert.
  • Ausnahmen. Lassen Sie sich nicht von Ausnahmen von einem Modul zum anderen ausbreiten.
  • Rtti/dynamic_casting datatypes aus anderen Modulen.
  • Vertrauen Sie keinen anderen C ++ - Funktionen.

Kurz gesagt, C ++ hat kein konsistentes ABI, aber C tut also, also vermeiden Sie C ++ -Funktionenkreuzungsmodule. Da die einzelne Vererbung ein einfaches V-Tisch ist, können Sie sie nützlich verwenden, um C ++-Objekte freizulegen, sofern sie C-Datentypen verwenden und keine Cross-Heap-Zuteilungen vornehmen. Dies ist der Ansatz, der von Microsoft selbst verwendet wird, z. B. für die Direct3D -API. GCC mag bei der Bereitstellung eines stabilen ABI nützlich sein, aber der Standard erfordert dies nicht, und MSVC nutzt diese Flexibilität.

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