C++-11 und C++-03 Kompatibilität



  • Hallo,

    ich hätte da eine Frage bezüglich ABI-Kompatibilität zwischen C++-03 und C++-11. Kann man innerhalb eines Programms Teile mit C++-11-Unterstützung übersetzen und andere Teile nicht? Bleibt also die Binärkompatibilität durch die Aktivierung der C++-11-Features erhalten?

    Das Szenario ergibt sich, wenn ich eine C++-Bibliothek verwende. Muss ich wissen, ob die Bibliothek mit C++-11 übersetzt wurde? Muss ich die Bibliothek neu übersetzen, wenn ich in meinem Programm C++-11 aktiviere und anfange, C++-11 zu nutzen?



  • Selbst C++98 soll wohl ABI-Kompatibel zu C++11 sein, aber es wird trotzdem empfohlen alles mit C++11 zu kompilieren, wenn es denn geht. Ob dies nun in dem Maße auch für C++03 zutrifft weiß ich nicht.


  • Mod

    Das wird wohl eine Frage der Implementierung sein, da C++ keine spezielle ABI vorschreibt. Also: Welcher Compiler?



  • Du kannst Probleme bekommen, wenn unterschiedliche Standardbibliotheken benutzt werden. In C++03 hatte die stdlibc++ noch eine Copy-on-write-Implementation von std::string, mit C++11 muss das aber gewechselt werden. Weil std::string im so-File drin ist, aber die Member im Header festgelegt werden, könnte man alte C++03-Programme nicht mit der neuen stdlibc++ ausführen, wenn das Library-File ändert. Deshalb wartet der GCC noch mit COW bis die Versionsnummer einen Sprung macht. Bei anderen Compilern weiss ich nicht, wie die das handhaben.

    Die ABI an sich macht soweit ich weiss keine Probleme.



  • SeppJ schrieb:

    Das wird wohl eine Frage der Implementierung sein, da C++ keine spezielle ABI vorschreibt. Also: Welcher Compiler?

    Die Frage ist bewusst allgemein gehalten. Es geht hier nicht um Compiler sondern den Standard. Zur Not auch nach der Realität. Meine Überzeugung ist, dass es möglich sein muss. Sonst müsste ich zu jeder C++ Bibliothek, die binary geliefert wird, dokumentieren, ob sie mit C++-11 übersetzt wurde oder nicht.



  • tntnet schrieb:

    SeppJ schrieb:

    Das wird wohl eine Frage der Implementierung sein, da C++ keine spezielle ABI vorschreibt. Also: Welcher Compiler?

    Die Frage ist bewusst allgemein gehalten. Es geht hier nicht um Compiler sondern den Standard. Zur Not auch nach der Realität. Meine Überzeugung ist, dass es möglich sein muss. Sonst müsste ich zu jeder C++ Bibliothek, die binary geliefert wird, dokumentieren, ob sie mit C++-11 übersetzt wurde oder nicht.

    Allgemein: ja, das musst du. Und alle anderen Einstellungen auch.



  • manni66 schrieb:

    tntnet schrieb:

    SeppJ schrieb:

    Das wird wohl eine Frage der Implementierung sein, da C++ keine spezielle ABI vorschreibt. Also: Welcher Compiler?

    Die Frage ist bewusst allgemein gehalten. Es geht hier nicht um Compiler sondern den Standard. Zur Not auch nach der Realität. Meine Überzeugung ist, dass es möglich sein muss. Sonst müsste ich zu jeder C++ Bibliothek, die binary geliefert wird, dokumentieren, ob sie mit C++-11 übersetzt wurde oder nicht.

    Allgemein: ja, das musst du. Und alle anderen Einstellungen auch.

    Wo kommt eigentlich das seltsame Gerücht her dass alle Einstellungen gleich sein müssten wenn man Sachen zusammenlinken will?
    Das müssen sie ganz sicher nicht.



  • Es müssen sicher nicht ALLE Einstellungen gleich sein, aber der Text hier sagt mir dass es in der Praxis auch nicht egal ist.

    https://gcc.gnu.org/wiki/Cxx11AbiCompatibility

    The C++98 language is ABI-compatible with the C++11 language, but several places in the library break compatibility. This makes it dangerous to link C++98 objects with C++11 objects. If you can recompile your code in matching versions of the language, you should do that. This page explains what to do if recompiling is very difficult.
    .
    .
    .



  • GetSetWilly schrieb:

    https://gcc.gnu.org/wiki/Cxx11AbiCompatibility

    The C++98 language is ABI-compatible with the C++11 language, but several places in the library break compatibility. This makes it dangerous to link C++98 objects with C++11 objects. If you can recompile your code in matching versions of the language, you should do that. This page explains what to do if recompiling is very difficult.

    Soll das heißen, dass man in der Praxis kaum C++11 verwenden kann, da das die Kompatibilität bricht?


  • Mod

    IBV schrieb:

    Soll das heißen, dass man in der Praxis kaum C++11 verwenden kann, da das die Kompatibilität bricht?

    Nein. Ausser du arbeitest mit komischen Bibliotheken, die Objekte aus der Standardbibliothek in der Schnittstelle haben und dann auch noch eben eines derjenigen, bei denen es tatsaechlich einen Unterschied macht.



  • Aber es kann doch sein, dass eine Schnittstelle einen string oder vector zurück gibt.



  • hustbaer schrieb:

    manni66 schrieb:

    tntnet schrieb:

    SeppJ schrieb:

    Das wird wohl eine Frage der Implementierung sein, da C++ keine spezielle ABI vorschreibt. Also: Welcher Compiler?

    Die Frage ist bewusst allgemein gehalten. Es geht hier nicht um Compiler sondern den Standard. Zur Not auch nach der Realität. Meine Überzeugung ist, dass es möglich sein muss. Sonst müsste ich zu jeder C++ Bibliothek, die binary geliefert wird, dokumentieren, ob sie mit C++-11 übersetzt wurde oder nicht.

    Allgemein: ja, das musst du. Und alle anderen Einstellungen auch.

    Wo kommt eigentlich das seltsame Gerücht her dass alle Einstellungen gleich sein müssten wenn man Sachen zusammenlinken will?
    Das müssen sie ganz sicher nicht.

    Wenn man eine allgemeine Antwort verlangt, ist das so. In Wirklichkeit hängt es (wie ja schon gesagt wurde) von Compiler ab, und da sind clang/gcc eher unproblematsich, VS nicht immer.


  • Mod

    IBV schrieb:

    Aber es kann doch sein, dass eine Schnittstelle einen string oder vector zurück gibt.

    Und wann hast du zuletzt eine Schnittstelle gesehen, die das tut? Die meisten Bibliotheken arbeiten doch entweder auf ihren eigenen Objekten oder sind ganz abstrakt gehalten mittels Templates (und die allermeisten benutzen eine C-Schnitttstelle 🙂 ).

    manni66 schrieb:

    Wenn man eine allgemeine Antwort verlangt, ist das so. In Wirklichkeit hängt es (wie ja schon gesagt wurde) von Compiler ab, und da sind clang/gcc eher unproblematsich, VS nicht immer.

    QFT!
    Dieser Thread hat eindeutig das Problem, dass der TE auf seiner eher ungeschickten Fragestellung bestand, obwohl die ersten Antworten ihn sofort da drauf hinwiesen, dass die Fragestellung zu fehlleitenden Antworten fuehren wird. Und jetzt hat dieser Umstand sogar noch Kollateralschaden an IBV ausgerichtet. 😞



  • SeppJ schrieb:

    IBV schrieb:

    Aber es kann doch sein, dass eine Schnittstelle einen string oder vector zurück gibt.

    Und wann hast du zuletzt eine Schnittstelle gesehen, die das tut? Die meisten Bibliotheken arbeiten doch entweder auf ihren eigenen Objekten oder sind ganz abstrakt gehalten mittels Templates (und die allermeisten benutzen eine C-Schnitttstelle 🙂 ).

    Ich hab doch von C++ keine Ahnung. Weisst ja: Ich benutzt new und delete. :p



  • SeppJ schrieb:

    Dieser Thread hat eindeutig das Problem, dass der TE auf seiner eher ungeschickten Fragestellung bestand, obwohl die ersten Antworten ihn sofort da drauf hinwiesen, dass die Fragestellung zu fehlleitenden Antworten fuehren wird. Und jetzt hat dieser Umstand sogar noch Kollateralschaden an IBV ausgerichtet. 😞

    Ich habe ein Problem. Und ich stelle eine Frage. Wenn die Antworten in eine falsche Richtung gehen, dann versuche ich, die Frage zu präzisieren. Oder soll ich dann einfach mein Problem, welches ich habe den Antworten anpassen 😕 🙄 .

    Es gibt nun mal mehrere Situationen, wo sich genau diese Frage stellt. Und zwar genau ganz allgemein und nicht spezifisch für eine Situation.

    Nehmen wir an, jemand will Qt verwenden. Er installiert sich die lib. Kann er jetzt die Features aus C++-11 verwenden? Dafür muss er das unter Umständen dem Compiler mitteilen. Qt verwendet selbst ja keine C++-11-Features. Eventuell verwendet er Qt, damit sein Programm auf unterschiedlichen Plattformen laufen kann. Hat er hier ein Problem? Und überhaupt, wenn ich 2 Programme habe, die beide Qt verwenden. Müssen beide Programme jetzt mit dem gleichen Sprachlevel übersetzt worden sein, wie die installierte Qt?

    Bei mir stellt sich die Frage, da ich selbst open-source-Programme mit C++ schreibe. Soll ich die Libs mit C++-11-Flags übersetzen damit der Anwender C++-11 nutzen kann obwohl die Lib selbst das nicht nutzt?

    Ich nutze die Autotools zum bauen. Damit hat der Paketierer die Möglichkeit, die Compileflags zu bestimmen. Wenn er jetzt die libs für eine bestimmte Linux-Distribution paketiert, welche Flags soll er dann verwenden?

    Indem ich Autotools nutze, bestimme ich eben nicht den Compiler. Standardmässig wird der Standardcompiler des Systems verwendet. Daher macht die Frage, welchen Compiler ich nutze keinen Sinn. Ich weiß ja nicht, welchen Compiler der Anwender meiner Libs nutzen wird.



  • Hmm, ich nutze ausschließlich C++11 mit Qt, warum sollte ich auch in altem C++ programmieren? Probleme hatte ich bis dato nicht.



  • Also ich glaube dass es das Problem weder unter Linux noch unter Windows wirklich gibt.
    Unter Linux nicht weil bei GCC sowieso so-gut-wie alles kompatibel ist, und bei Windows nicht weil MSVC keinen C++11 Switch anbietet.

    Wenn du sicher sein willst, dann guck in die Standard-Library rein. Also wie das dort gelöst wurde mit den neuen C++11 Features.
    Wenn die ganzen Klassen ala std::string vom Layout her identisch sind, dann sollte es kein Problem geben.



  • Die Standardbibliothek ist mit GCC meiner Erfahrung nach kompatibel. Es gibt aber Bibliotheken, wo man C++03 und C++11 nicht mischen kann. Wenn man zum Beispiel Boost Asio in verschiedenen Übersetzungseinheiten verwendet, die mit unterschiedlichen Standardversionen übersetzt wurden, kann man die zwar linken, aber zur Laufzeit gibt es Segmentation Faults oder ähnliche Vergnügen.


Log in to reply