Müssen wir Bibliotheken mit C ++ 11 neu kompilieren?

8

Das ist eine sehr uninformierte Frage, aber:

Ich möchte C ++ 11 verwenden. Kann ich weiterhin meine große Sammlung von Bibliotheken verwenden, die mit meinem alten gcc 4.2.1 Compiler kompiliert wurden, oder muss ich sie alle mit einem neuen Compiler neu kompilieren? Ich würde denken (oder hoffen) die Antwort ist nein, aber ich bin nur ein Plätscher.

Damit ich zumindest einen Teil meiner Unwissenheit entfernen kann, können Sie in beiden Fällen erklären warum?

Danke

    
user487100 23.02.2012, 07:13
quelle

5 Antworten

9

Ja, sollten Sie.

Der schwächere Grund ist nicht die Binärkompatibilität, das Problem sind die Erwartungen. Ein C ++ 11-fähiger Compiler erwartet, dass eine Reihe von Features verfügbar ist (Konstruktoren unter ihnen verschieben) und diese gegebenenfalls verwenden. Und das ist nur die Spitze des Eisbergs kratzen, gibt es mehrere andere Inkompatibilitäten ( auto , 0 und seine Interaktion mit Zeigern, ...).

Es bedeutet, dass jede Inline-Methode in einem Header plötzlich anders interpretiert werden kann, in Anbetracht des C ++ 11 Standards.

Der stärkere Grund ist, dass jede Version des Compilers mit einer eigenen Implementierung der Standardbibliothek ausgeliefert wird. Sie wollen nicht wirklich anfangen, verschiedene Versionen zu mischen und vor allem nicht, wenn sie so große Änderungen erfahren haben (noch einmal, rvalue-Referenzen ...).

Glauben Sie mir, es ist einfacher, jetzt neu zu kompilieren, anstatt diesen quälenden Gedanken zu haben, dass jeder Fehler, der auftaucht, auf einer Inkompatibilität zwischen alten und neuen Bibliotheken beruht ...

    
Matthieu M. 23.02.2012, 07:29
quelle
3

Es ist eine Compilerfrage. Wenn Sie beispielsweise einen einzelnen Compiler haben, der abhängig vom Compiler-Switch sowohl C++03 als auch C++11 unterstützt, können Sie sehr wahrscheinlich Bibliotheken mischen. Es gibt nichts Neues in C ++ 11, das eine Inkompatibilität mit C ++ 03 erzwingt .

Sie haben jedoch erwähnt, dass Ihre Bibliotheken mit GGC 4.2.1 kompiliert wurden. Da C ++ 11 damals nur eine Idee war, war es sehr wahrscheinlich, dass GCC damals so implementiert wurde, dass es mit C ++ 11 nicht kompatibel war.

Zum Beispiel muss std::list::size() in C ++ 11 O (1) sein, aber in C ++ 03 könnte es O (N) sein. GCC hat sich damals für eine O (N) -Implementierung entschieden, ohne die zukünftigen Anforderungen zu kennen. Die aktuelle GCC std::list::size Implementierung ist kompatibel mit C ++ 11 und C ++ 03, da O (1) besser ist als O (N).

    
MSalters 23.02.2012 11:47
quelle
3

Die Antwort hängt vollständig von der API Ihrer Bibliothek und deren Implementierungsabhängigkeiten ab.

Die Bedingungen, die garantieren, dass Sie nicht neu kompilieren müssen, sind:

- Ihre Bibliothek verwendet keine C ++ - spezifischen Funktionen in ihrer öffentlichen API.

Das bedeutet:

  1. Ihre Bibliothek bietet keine Klassen / Klassen-Templates / Funktions-Templates / anderes C ++ spezifisches Zeug.

  2. Sie akzeptieren keine C ++ - Klassen und geben sie nicht an Ihre Bibliotheksfunktionen zurück.

  3. Sie übergeben Funktionsparameter nicht als Referenz.

  4. Sie stellen keine öffentlichen Inline-Funktionen mit C ++ spezifischen Implementierungen zur Verfügung.

  5. Sie werfen keine Ausnahmen von Ihren Funktionen.

  6. Sie haben (weil Sie keinen Grund haben) C ++ - spezifische Bibliothekskopfzeilen in Ihre öffentlichen Kopfzeilen aufzunehmen. (Es würde nicht schaden, wenn Sie sie einschließen, aber alles muss in Ordnung sein, wenn Sie solche Includes entfernen. Es ist wie ein Indikator.)

- Ihre Bibliothek hängt nur von den Bibliotheken ab, die binär kompatibel mit denen sind, die in Ihrer neuen Build-Umgebung verfügbar sind.

Wenn diese Bedingungen nicht erfüllt sind, kann nicht garantiert werden, dass Ihre Bibliothek ordnungsgemäß funktioniert. In den meisten Fällen ist es viel einfacher neu zu kompilieren als sicherzustellen, dass alles korrekt funktioniert.

Wenn Sie eine binärkompatible API erstellen möchten, die die obigen Bedingungen erfüllt, dann ist es viel besser, C-API zu entwickeln und zu implementieren. Auf diese Weise erfüllen Sie automatisch die obigen Bedingungen und fallen nicht in die Sünde, C-style C ++ Code zu schreiben.

    
Serge Dundich 23.02.2012 08:13
quelle
1

Sie können große Teile von C ++ 11 ohne Neukompilierung verwenden (vorausgesetzt, ABI-Kompatibilität), aber ein besonders wichtiger Teil, für mich zumindest, wird nicht zugänglich sein für die bereits kompilierte Code - Verschieben Semantik.

Move-Semantik kann Ihren Code schneller machen, indem Sie einfach mit einem C ++ 11-Compiler (und vorzugsweise einer C ++ 11-Standardbibliothek) neu kompilieren.

Es gibt noch andere Gründe. Vielleicht ist Ihre bevorzugte Bibliothek C ++ 11 bewusst geworden, seit Sie sie zuletzt kompiliert haben, und ist jetzt effizienter, sicherer oder einfacher zu verwenden, wenn sie mit einem C ++ 11-Compiler kompiliert wird?

Für Ihre eigenen Bibliotheken, mit C ++ 11 können Sie sie sicher effizienter, sicherer und benutzerfreundlicher machen? :)

    
Xeo 23.02.2012 07:27
quelle
1

Wenn Ihre Schnittstellen zum kompilierten Code irgendeine Vorlage verwenden, die von C ++ 11 modifiziert wurde, dann müssen Sie ja neu kompilieren. Sonst können Sie wahrscheinlich Ihre alten Bibliotheken weiter verwenden (es sei denn, der Compiler-Anbieter hat sich auch dazu entschieden, gleichzeitig Änderungen am ABI vorzunehmen, da dies eine großartige Möglichkeit ist, langwierige ABI-Bugs zu beheben, die ansonsten wegen Binärdateien oft nicht behoben werden Inkompatibilitäten).

    
celtschk 23.02.2012 07:34
quelle