Verknüpfen von Objektdateien, die mit verschiedenen GCC-Versionen erstellt wurden

8

Ich habe einige Bedenken hinsichtlich der Kompatibilität beim Aufbau einer C ++ - Bibliothek mit einer modernen Version von GCC 4.4.x / 4.5.x, wobei Clients auf einer älteren Version, sagen wir 3.4.x / 4.1.x. Eine vorgeschlagene Lösung besteht darin, die Objektdateien zu kompilieren und zu verteilen. Die Kunden können dann eine Verknüpfung mit einer beliebigen Version von GCC und der entsprechenden ABI herstellen. Einige Fragen:

  1. Stimmt das?
  2. Sollte ich statisch verlinken, um libstdc ++ Kompatibilitätsprobleme zu vermeiden?
  3. Ist das unnötig (ich habe gehört, gcc 3.4 ist vorwärtskompatibel)?

Prost, Graeme

    
Graeme 17.01.2011, 10:26
quelle

2 Antworten

6

Am sichersten wäre es, ihnen ein .so und den entsprechenden Header mit der stabilen binären API zu geben. Um binär stabil zu sein, sollte die API keine std:: -Typen wie std::string oder std::vector<> akzeptieren oder zurückgeben, da sich das binäre Layout von std:: -Typen von Version zu Version ändern kann.

Und es sollte statisch mit libstdc ++ verknüpft werden (ja, es ist möglich), so dass Ihre Clients nicht mit einer bestimmten Version von libstdc ++ verlinken müssen.

Nachdem dies gesagt wurde, war der letzte ABI-Wechsel von g ++, AFAIK, zwischen 3,3 und 3,4. Ab 3.4 sollten die Objektdateien kompatibel sein.

Sie können auch alle Ihre .o-Dateien zur Vereinfachung in eine .a-Datei packen, sodass Ihre Clients beim Hinzufügen einer neuen .o-Datei ihre Makefiles nicht aktualisieren müssen, um sie mit der neuen .o-Datei zu verknüpfen.

    
Maxim Egorushkin 17.01.2011, 10:44
quelle
1

AFAIK, Verknüpfung sollte mit der neuesten Version erfolgen.

Siehe Ссылка

und Ссылка

für relevante gcc-Dokumentation.

    
AProgrammer 17.01.2011 10:46
quelle

Tags und Links