mischender Compiler

8

Ich frage mich, ob es möglich ist, ein mit gcc4.2 kompiliertes c ++ - Programm mit einer gemeinsamen c ++ - Bibliothek zu verknüpfen, die in einer späteren Version wie gcc4.5 kompiliert wird.

Ich habe versucht, dies zu tun, aber ich habe verschiedene Probleme bekommen. Wenn ich die geteilte Bibliothek gcc5.3 kompiliere, bekomme ich eine Nachricht:

* "malloc: Fehler für Objekt 0x7fff707d2500: Der freigegebene Zeiger wurde nicht zugeordnet  Setzen Sie einen Breakpoint in malloc_error_break, um "*" zu debuggen.

Wenn ich versuche, die geteilte Bibliothek mit gcc4.6 zu kompilieren, bekomme ich wirklich seltsames Verhalten. Die std :: stringstream-Klasse funktioniert nicht korrekt. Die resultierende Zeichenfolge ist nach dem Schreiben in den Stream leer.

Ist das möglich? Oder versuche ich etwas, das unmöglich ist? Ich hatte gehofft, dass dies möglich ist, da ich die lib dynamisch verknüpfe. Übrigens bin ich auf MacOSX.

BR

    
user499986 04.07.2011, 20:28
quelle

2 Antworten

5

Beginnend mit gcc 3.0 folgt g ++ dem Itanium ABI, also sollte es theoretisch kein Problem geben. G ++ 4.2 hat jedoch CXXABI_1.3.1, während g ++ 4.5 über CXXABI_1.3.4 verfügt (siehe hier ). Deshalb würde ich vorsichtig sein. Wenn keine Unterschiede bestehen, werden die Revisionsnummern nicht erhöht.

Außerdem hat das glibc ++ zwischen diesen Versionen fünf Revisionen durchlaufen, was ein Grund sein könnte, warum Sie std::stringstream lustige Sachen machen.

Zu guter Letzt gibt es noch viele Konfigurationsoptionen (zum Beispiel, um Strings vollständig dynamisch zu machen oder nicht), die das Verhalten und die Kompatibilität der Standardbibliothek direkt beeinflussen. Bei zwei (zufälligen, unbekannten) Builds können Sie nicht einmal wissen, dass sie die gleichen Konfigurationsoptionen haben.

    
Damon 04.07.2011 21:28
quelle
4

Nach meiner Erfahrung bedeutet die ABI-Kompatibilität, dass C ++ - Bibliotheken ohne Probleme miteinander verbunden werden können.

Da C ++ jedoch so viele Inline-Funktionen verwendet, bedeutet das nicht viel.

Wenn die Standard-C ++ - Bibliothek alle Inline-Funktionen verwendet oder alle Bibliotheksfunktionen verwendet, können Sie Code verwenden, der mit älteren Versionen von GCC mit neueren Versionen kompiliert wurde.

Aber es tut es nicht. Die Bibliothek mischt Inline- und externen Bibliothekscode. Dies bedeutet, dass, wenn etwas in std :: string oder std :: vector oder locales oder was auch immer geändert wird, der inline Code aus dem alten GCC nicht mehr mit dem aus dem neuen GCC verlinkten Bibliothekscode übereinstimmt.

    
Zan Lynx 04.07.2011 23:01
quelle

Tags und Links