Kann ein C ++ 14/17-Projekt binäre Bibliotheken verwenden, die mit dem C ++ 11-Standard kompiliert wurden, oder muss der Quellcode neu kompiliert werden?

8

Kann eine Binärdatei, die mit C ++ 11 kompiliert wurde, in einem c ++ 14/17-Projekt verwendet werden? Was ist mit einer C ++ 14 Binärbibliothek in einem C ++ 17 Projekt?

Oder müsste der Quellcode unter Verwendung des gleichen Standards wie das Projekt aktualisiert und neu kompiliert werden?

Gibt es andere Möglichkeiten, ältere Standard-C ++ - Bibliotheken in neue Standardprojekte einzubinden?

    
Greg 25.10.2017, 04:41
quelle

3 Antworten

3

Der C ++ - Standard hat nichts mit dem Dateiformat der Binärdatei zu tun. Das hängt nur von den Compilern / Linkern und dem Betriebssystem ab. Wenn also der Compilerhersteller die ABI (Application Binary Interface) ändert, können Sie die Teile nicht einfach miteinander verknüpfen.

Wie Sie hier lesen können, nur relevant für gcc:

Ссылка

gcc führt mit gcc5.1 einen neuen ABI ein. Eine Geschichte von Versionen von Bibliotheken aus gcc und vielleicht Kommentare zu ABI-Änderungen finden Sie hier:

Ссылка

Das Ändern von einer C ++ - Version in eine andere änderte nicht die ABI, aber das Ändern des Compilers kann.

    
Klaus 25.10.2017, 07:08
quelle
1

Ich habe das STL-Tag in Ihrer Frage bemerkt. Wenn Sie STL in Ihrer Client-Schnittstelle verwenden (was ich nicht tun würde), könnte sich die in der Bibliothek verwendete Implementierung von der Implementierung unterscheiden, die Sie gerade verwenden.

Eine alte Version einer fiktiven STL-Klasse (oder einer anderen Bibliothek):

%Vor%

Eine mit dem alten Compiler / STL entwickelte Bibliothek:

%Vor%

Die neue Version der gleichen fiktiven STL-Klasse:

%Vor%

Ihre Anwendung vermischt die STL-Versionen:

%Vor%     
ZDF 25.10.2017 16:50
quelle
0

Standard definiert, welche Funktionen für den Compiler im Quellcode verständlich sind und was von der Standardbibliothek bereitgestellt wird. Die Antwort auf Ihre Frage hängt davon ab, wie kompatibel ABI-Versionen Ihrer Bibliotheken sind, die durch Ihre Compiler / Toolchain-Version / Implementierung definiert sind. Zum Beispiel, wegen std::string ABI Wechsel zwischen GCC 4.x und 5.x Bibliotheken von ihnen gebaut werden nicht miteinander verknüpfbar sein.

    
scrutari 25.10.2017 06:32
quelle