2011-01-17 10 views
8

Ich habe einige Kompatibilitätsprobleme beim Aufbau einer C++ - Bibliothek mit einer modernen Version von GCC 4.4.x/4.5.x, wobei Clients auf einer älteren Version 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:Verknüpfen von Objektdateien, die mit verschiedenen Versionen von GCC erstellt wurden

  1. Ist das korrekt?
  2. Sollte ich statisch verknüpfen, um libstdC++ Kompatibilitätsprobleme zu vermeiden?
  3. Ist das unnötig (ich hörte gcc 3.4 aufwärts kompatibel ist)?

Cheers, Graeme

Antwort

6

Die sicherst ihnen eine .so und die entsprechende Kopfzeile mit dem stabilen binären API zu geben wäre. 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 der 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++ verknüpfen müssen.

Mit diesem gesagt, war die letzte ABI Änderung 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 in eine .a-Datei packen, damit 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.

+0

Wissen Sie, ob das Gleiche für gcc unter Solaris gilt? – Graeme

+0

Ja. Das oben genannte ist nicht betriebssystemspezifisch. –

Verwandte Themen