Es gibt zwei Software-Teams, die C ++ - Anwendungen für das gleiche Betriebssystem entwickeln (Scientific Linux 6.5):
Team_A verwendet den vom Betriebssystem bereitgestellten Compiler und die Bibliotheken (GCC 4.4.7, GLIBC_2.12, GLIBCXX_3.4.13), um seine C ++ 98-Anwendung und verschiedene gemeinsame Bibliotheken zu erstellen.
Team_B verwendet eine neuere GCC-Version (4.8.3), die aus der Quelle erstellt wurde. Es ist ein nativer Compiler, es verbindet sich mit der OS-libc und verwendet die OS-Standard-Header, hat aber eine eigene Version von stdc ++ (GLIBCXX_3.4.19). Team_B verwendet diesen Compiler im C ++ 11-Modus, um seine Anwendung zu erstellen ( AppB ), und implementiert dabei libstdc ++ und libgcc_s.
Team_A stellt Services für Team_B in Form einer gemeinsam genutzten Bibliothek (.so, .hpp) bereit: LibA . Die API der Bibliothek besteht aus einer Reihe von C ++ - Klassen (Deklaration im Header, Implementierung in .so), und die Methoden verwenden std :: string und andere stdc ++ - Klassen als Argumente.
An diesem Punkt kommen wir zu dem Problem: AppB konstruiert GLIBCXX_3.4.19 C ++ 11 Stil std :: whatever Objekte und übergibt sie an LibA wer interpretiert sie als GLIBCXX_3.4.13 C ++ 98 Stil Objekte, und dies möglicherweise nicht vorwärtskompatibel sein.
Ist das ein Problem? Kann es zu einem Anwendungsabsturz kommen? Sind die std :: whatever Implementierungen zwischen den Versionen kompatibel (selbes Speicherlayout)? Was ist mit C ++ 98 vs C ++ 11?
Einige Handlungswechsel, die mich verwirrter machen:
Ich würde gerne verstehen, was genau in diesem Fall passiert, wenn es riskant ist und Probleme aufheben. Es ist keine Option, die Teams in die gleiche Entwicklungsumgebung zu bringen. Das Entfernen von std :: classes aus der API wäre ebenfalls sehr schwierig.
Irgendwelche Hinweise willkommen! :)
Im Gegensatz zu C gibt es keinen definierten ABI für C ++. Das heißt ....
protected:
, private:
und public:
Teile der Struktur angeordnet werden. Die Position und Bedeutung der V-Tabelle kann zwischen Compilern verschoben werden. Es kann verschiedene vordefinierte Funktionen wie die typeinfo in der vtable zwischen den verschiedenen Compiler-Versionen geben. Was können Sie tun, um diese Probleme zu beheben?
Anstatt eine kompilierte Bibliothek bereitzustellen, müssen Sie die Dienste als Quellcode bereitstellen, der in derselben Umgebung kompiliert wird.
Der Source-Compiler kann mit dem älteren stdC ++ neu erstellt werden. Dies würde die Auswirkungen von Punkt 3) begrenzen.
Es gibt eine Schnittstelle zwischen den beiden Teams, die eine gemeinsame Sprache sprechen müssen. Diese Sprache sollte wahrscheinlich C sein.
Team A = & gt; C ++ Fassade / Stub = & gt; C Schnittstelle = & gt; C ++ Fassade / Proxy = & gt; Team B.
Die Fassade sollte in der Umgebung gebaut werden, in der sie verwendet wird.