Verwenden Sie C ++ DLLs aus demselben VS, die zu unterschiedlichen Zeiten / Teams kompiliert wurden - ABI-Kompatibilität?

8

Zur Wiederholung: Ich suche nach ABI-Kompatibilität zwischen Bibliotheken der selben Visual-C ++ Version!

Wir wollen einige interne C ++ - DLLs verschiedener Teams mischen und abgleichen - zu unterschiedlichen Zeiten mit verschiedenen Projektdateien erstellt. Wegen der langen Build-Zeiten wollen wir große monolithische Builds vermeiden, bei denen jedes Team den Quellcode einer anderen Team-Bibliothek neu kompiliert.

Wenn C ++ DLLs mit C ++ - Schnittstellen konsumiert werden, ist eher clear das können Sie dies nur tun, wenn alle DLLs mit dem gleichen Compiler kompiliert werden / Visual Studio-Version.

Was mir nicht sofort klar ist, ist was , es muss genau dasselbe sein, um ABI-Kompatibilität zu erhalten.

  • Offensichtlich debuggen ( _DEBUG ) und release ( NDEBUG ) können nicht gemischt werden - das wird aber auch daran deutlich, dass diese auf verschiedene Versionen der shared runtime verlinken.
  • Benötigen Sie genau die gleiche Compiler -Version, oder genügt es, dass die resultierende DLL auf die gleiche gemeinsame C ++ - Laufzeit zugreift - also im Grunde gleich ist weitervertreibbar ? (Ich denke, statische fliegt nicht, wenn man C ++ - Objekte umgeht)
  • Gibt es eine dokumentierte Liste von Compiler (und Linker) -Optionen, die es sein muss das gleiche für zwei C ++ - DLLs der gleichen VC ++ - Version kompatibel sein?
    • Zum Beispiel ist derselbe /O Schalter notwendig - beeinflusst der Optimierungsgrad die ABI Kompatibilität? (Ich bin mir ziemlich sicher nicht.)
    • Oder müssen beide Versionen dasselbe /EH switch verwenden?
    • Oder /volatile:ms|iso ...?

Im Wesentlichen möchte ich eine Reihe von (Meta-) Daten erstellen, die mit einer Visual-C ++ - DLL verknüpft werden können, die die ABI-Kompatibilität beschreibt.

Wenn Unterschiede existieren, liegt mein Fokus momentan nur auf VS2015.

    
Martin Ba 21.10.2016, 14:10
quelle

1 Antwort

1

Habe in den letzten Tagen darüber nachgedacht, und was ich getan habe, war herauszufinden, ob einige Anwendungsfälle existieren, wo Entwickler bereits ihre C ++ - Builds kategorisieren mussten, um sicherzustellen, dass Binärdateien kompatibel sind.

Ein solcher Ort sind die nativen Pakete von nuget . Also habe ich mir dort ein Paket angeschaut, speziell die cpprestdk :

Die Binärdateien im herunterladbaren Paket so aufgeteilt:

%Vor%

Ich habe das aus diesem Beispiel herausgezogen, weil ich keine anderen Dokumente finden konnte. Ich weiß auch, dass die Boost-Binaries Build-Verzeichnis in ähnlicher Weise getrennt ist.

Um zu einer Liste von Metadaten zu gelangen, um die ABI-Kompatibilität zu identifizieren, kann ich vorläufig Folgendes auflisten:

  • VC-Version (dh die Version der verwendeten C- und CPP-Laufzeitbibliotheken)
    • hier ein Punkt ist, dass z.B. vc140 sollte heutzutage genug sein - wenn man bedenkt, wie die CRT eingebunden ist, müssen alle möglichen Bugfixes zu den versionierten CRT-Komponenten sowieso ABI-kompatibel sein, so dass es keine Rolle spielt, in welcher Version eine vorkompilierte Bibliothek erstellt wurde.
  • reiner Eingeborener | verwaltet (/ CLI) | WinRT
  • wie die CRT verbraucht wird (statisch / dynamisch)
  • Bitness / Plattform (Win32, x64, ARM usw.)
  • Release- oder Debug-Version (d. h. welche Version des CRT wir verlinken)
  • plus: _ITERATOR_DEBUG_LEVEL ... wenn alle mit den Standardeinstellungen arbeiten, in Ordnung, wenn ein Projekt dies nicht tut, muss es so deklariert werden

Zusätzlich meine beste Schätzung bezüglich der folgenden Punkte:

  • /O spielt keine Rolle - wir mischen und stimmen Binaries ständig mit verschiedenen Optimierungseinstellungen ab - speziell funktioniert dies sogar für Objektdateien innerhalb derselben Binärdatei
  • /volatile - da dies eine Code-Gen-Sache ist, kann ich mir schwer vorstellen, wie dies einen ABI brechen könnte
  • /EH - mit Ausnahme der Option, alle Ausnahmen zu deaktivieren, in welchem ​​Fall Sie natürlich nichts nennen können, das wirft, bin ich ziemlich sicher, dass dies aus einer ABI-Perspektive sicher ist: Es gibt mögliche Fallstricke hier, aber ich denke, sie können nicht wirklich in ABI compat kategorisiert werden. (Vielleicht könnte man sagen, dass einige komplexe Callback-Ketten ABI-inkompatibel sind, nicht sicher)

Andere:

  • Standard-Aufrufkonvention ( /G.. ): I denke dies würde zum Zeitpunkt der Verknüpfung abbrechen, wenn verstümmelte Exportsymbole und Header-Deklarationen nicht übereinstimmen.
  • /Zc:wchar_t - bricht zur Verbindungszeit ab (Es ist tatsächlich ABI-kompatibel, aber die Symbole werden nicht macth.)
  • Aktiviere RTTI ( /GR ) - bin mir nicht sicher - ich habe nie mit diesem deaktiviert gearbeitet.
Martin Ba 26.10.2016 20:18
quelle