Gibt es Einschränkungen für ausführbare Dateien, die mit g ++ auf einer Linux-Distribution kompiliert wurden, die auf einer anderen Distribution verwendet wird?

8

Gibt es Idiosynkrasien oder Variationen zwischen Distributionen, die C ++ - Binärdateien betreffen, die mit GCC 4.7.x auf einer Distribution kompiliert wurden, die direkt auf einer anderen Distribution verwendet wird? Ich verstehe, dass die ideale Situation ist, aus der Quelle auf der zweiten Distribution zu kompilieren, aber ich möchte wirklich keine Sorgen darüber machen, neue GCC-Versionen und den Quellcode des Programms auf meiner Produktionsmaschine zu kompilieren. Ich bin ein relativ unerfahrener Linux-Benutzer (daher die Frage!) Und bevorzuge weiterhin IDEs im Gegensatz zur Befehlszeilen-Kompilierung, wobei ssh alles ist, was ich wirklich verwenden kann, um auf die Produktionsmaschine zuzugreifen.

Der Code selbst ist nichts Interessantes, aber er nutzt einige Funktionen des Betriebssystems wie Blocking Sockets und ähnliches.

Jeder Rat würde sehr geschätzt werden!

    
Elliott 19.10.2012, 15:18
quelle

4 Antworten

5

Wenn die Binärdateien nicht auf genau demselben Betriebssystem (einschließlich Version) und genau derselben Hardware basieren, gibt es keine Garantien.

In der Praxis:

  1. Wenn die Hardware dieselbe Chipfamilie ist, sollte es funktionieren.

    • Das liegt daran, dass die meisten Leute die hardwarespezifischen Optimierungen nicht einschalten (aber sie können es).
    • Das Verschieben von Binärdateien über Chipsätze funktioniert höchstwahrscheinlich nicht
    • Das Verschieben von Binärdateien von älteren zu neueren Mitgliedern einer Hardwarefamilie funktioniert wahrscheinlich
    • Das Verschieben von Binärdateien von neueren zu älteren Mitgliedern einer Hardwarefamilie ist weniger wahrscheinlich (wird aber von der Optimierung und den Compilereinstellungen abhängen) (es ist unwahrscheinlich, dass der Wechsel von 64- auf 32-Bit-Architektur funktioniert).
  2. Wenn das Betriebssystem dieselbe Major-Nummer hat, sollte es (wahrscheinlich) funktionieren.

    • Die Version des Betriebssystems, mit der eine Binärdatei arbeiten wird, hängt von der Version des Compilers ab, mit dem sie erstellt wurde, und vom Host-Betriebssystem.
    • Wenn der Compiler Änderungen in der ABI hat, die er generiert, sind alle Wetten deaktiviert. Aber in der Regel wird eine Änderung des vom Compiler generierten ABI ein großes Problem darstellen und daher nur an größeren Punkten in der OS-Straßenkarte auftreten (nicht in kleinen Schritten).
  3. Mein Rat aus der Quelle aufbauen.

    • Gehen Sie nicht explizit aus und aktualisieren Sie die Entwicklungsumgebung (verwenden Sie die, die mit der Distribution geliefert wird. Wenn Sie die Standardaktualisierungen durchführen, wird die Abwärtskompatibilität nicht aufgehoben).
    • Bauen ist einfach, lesen Sie einfach die Datei README . In der Regel werden jedoch die beiden Befehle ./configure und make ausgeführt. Wenn Sie nichts Besonderes möchten, brauchen Sie normalerweise nichts anderes zu tun.
Martin York 19.10.2012, 15:35
quelle
3

G ++ hatte schon lange eine stabile ABI, das sollte keine Probleme verursachen. Was wahrscheinlich Probleme verursacht, ist die Verwendung dynamisch verknüpfter Bibliotheken. Das System, auf dem das Programm ausgeführt wird, muss kompatible Versionen aller gemeinsam genutzten Bibliotheken haben, für die die ausführbare Datei kompiliert wurde. Wenn Sie nur statische Verknüpfungen verwenden, sollten Sie kein Problem haben. Sie können die statische Verknüpfung mithilfe der Option -static aktivieren.

    
Dirk Holsopple 19.10.2012 15:29
quelle
3

Bei statischer Verknüpfung müssen zwei Bedingungen erfüllt sein:

1) Das Zielsystem und das Build-System müssen dieselbe Architektur haben (mit Ausnahmen: Sie können 32-Bit-Binärdateien auf vielen 64-Bit-Hosts ausführen)

2) Das (g) libc-Paket auf dem Zielsystem darf keine ältere Version sein als auf dem Build-System (Sie können manchmal kleinere Versionsunterschiede durchmachen)

Es wird komplizierter mit dynamischer Verknüpfung.

    
idefixs 19.10.2012 15:31
quelle
0

Im Allgemeinen funktionieren Binärdateien, die auf neueren Distributionen basieren, nicht mit älteren Versionen, aber Binärdateien, die auf älteren Distributionen basieren, funktionieren mit neueren Distributionen. Für den Fall, dass Sie eine Binärdatei auf RedHat EL4 erstellen, würde dies auf den meisten unterstützten Distributionen funktionieren (möglicherweise müssen Sie libstdc ++ kopieren, wenn sie fehlen)

    
Tsuneo Yoshioka 19.10.2012 15:27
quelle

Tags und Links