2009-08-19 6 views
0

Obwohl ich ein wenig Erfahrung habe, bin ich immer noch mit der Frage verwirrt, ob es notwendig ist, eine Anwendung zu installieren und/oder ein C++ - Programm oder C++ - Bibliothek unter Network File zu erstellen Von Maschinen gemeinsam genutztes System, das unterschiedliche Linux-Versionen (z. B. CentOS Release 4.7, Ubuntu 8.10), möglicherweise unterschiedliche Bit (z. B. 32-Bit, 64-Bit) und verschiedene Versionen des Compilers (z. B. gcc/g ++ 3.4.6 20060404 (Red Hat 3.4.6-10), gcc/g ++ (Ubuntu 4.3.2-1ubuntu12) 4.3.2.), So dass die ausführbaren Dateien oder die Bibliotheksdateien unter diesen verschiedenen Maschinen verwendet werden können? Was sind die Prinzipien hier?Build-Programm und Installation von Software unter Network File System für verschiedene Maschinen

Zum Beispiel habe ich auf einem Netzwerk-Dateisystem eine ausführbare Datei von meinem C++ - Programm unter einem Rechner mit CentOS Release 4.7, x86_64 ad gcc/g ++ 3.4.6 20060404 (Red Hat 3.4.6-104). Ich finde überrascht, dass die ausführbare Datei unter einem anderen Rechner mit Ubuntu 8.10, x86_64 und gcc/g ++ (Ubuntu 4.3.2-1ubuntu12) 4.3.2 verwendet werden kann. Auch alle gemeinsam genutzten Bibliotheken, die ich auf der ersten Maschine erstellt und von meinem Programm benutzt habe, beschweren keinen Fehler, wenn die ausführbare Datei auf dem zweiten Rechner läuft. Ich bin so besorgt, wenn das Ausführen der ausführbaren Datei, die auf einer anderen Maschine erstellt wurde, zuverlässige Ergebnisse liefert?

Ein anderes Beispiel, ich erinnere mich, eine ausführbare Datei, die auf einem 64-Bit-Rechner erstellt wurde, kann nicht auf einem 32-Bit-Rechner ausgeführt werden. Aber wie wäre es umgekehrt, läuft auf einer 64-Bit-Maschine eine ausführbare Datei auf 32-Bit-Maschine? Wie wäre es mit C++ - Bibliotheksdateien, die auf verschiedenen Bit-Maschinen erstellt und verwendet werden?

Wenn möglich, könnten Sie mich auf eine Referenz verweisen, wie eine Webseite, Buch, ..., die mit meinen Fragen zusammenhängen?

Danke und Gruß!

Antwort

0

Sie müssen wirklich Ihr Programm auf jeder unterschiedlichen Konfiguration testen, um absolut sicher zu sein.

Sie können normalerweise 32-Bit-Programme auf 64-Bit-Maschinen ausführen, so dass Sie wahrscheinlich nur mit einer 32-Bit-Version kommen, wenn Sie möchten.

Sie müssen ein wenig vorsichtig sein, welche Version von gcc auf jeder Plattform verwendet wurde. Das Ausführen eines Programms, das mit gcc 4 auf einer Maschine erstellt wurde, deren Betriebssystem und glibc mit gcc 3 erstellt wurden, könnte Probleme verursachen. Stellen Sie also sicher, dass mindestens die wichtigsten Versionsnummern übereinstimmen.

Offensichtlich, wenn Sie verschiedene Maschinenarchitekturen haben, zum Beispiel Sparc versus AMD64, werden Sie verschiedene Versionen benötigen. Es gibt sogar ein paar subtile Unterschiede zwischen Intel und AMD, also mach dich nicht mit den Compiler-Optimierungen übermäßig aggressiv und wenn du Programm SSE-Anweisungen verwendest (wenn du nicht weißt, was das ist, dann verwendest du es nicht), stelle sicher, dass SSE-Set, das Sie verwenden, wird von allen Computern unterstützt.

Die wichtigsten Fragen hier sind die Maschinenarchitektur, die Verfügbarkeit der richtigen Bibliotheken und die "ABI" oder Application Binary Interface. Der ABI gibt an, wie das Betriebssystem Maschinenregister und Speicher verwenden soll, um Informationen zwischen verschiedenen Teilen des Programms weiterzuleiten, z. B. wie Daten auf den Stapel geschoben werden, um Argumente an eine Funktion zu übergeben. Es ist bekannt, dass sich der von GCC verwendete ABI von Zeit zu Zeit ändert, weshalb die Verwendung kompatibler Versionen notwendig ist.

Ich bin mir nicht bewusst, ein Buch oder eine Webseite, die all diese Dinge abdeckt. Beginnen Sie mit der Dokumentation für GCC und Binutils. Und es gibt keinen Ersatz für gute Tests.

+0

Habe ich Recht, dass dieses Kompatibilitätsproblem fast nie garantiert wird, ist der sichere Weg, eine Version für jede Maschine zu bauen? Zum Beispiel, wenn ich eine C++ - Bibliothek und zwei Maschinen für das NFS habe, muss ich es in ~/libraries/host1/mylibrary/und ~/libraries/host2/mylibrary/erstellen.Wenn mein C++ - Programm diese Bibliothek verwendet, wie schreibt man ein Makefile, das den aktuellen Rechner erkennt, und weist der Bibliothek den richtigen Pfad für -L und -I zu? – Tim

+0

Nun, um die Garantie zu bekommen, müssen Sie Ihre Hausaufgaben machen und testen. Wenn Sie für jede Maschine bauen möchten, sollten Sie GNU autoconf und automake verwenden. Autoconf wurde für dieses Problem entwickelt. Am Ende erstellen und verwenden Sie ein Konfigurations-Skript, genau wie die meisten heruntergeladenen Linux-Quellpakete. Wenn Sie viele verschiedene Maschinen zu bauen oder Sie planen, dieses Programm an andere zu verteilen, ist dies der Weg zu gehen. Aber autoconf ist nicht trivial, wenn Sie es noch nie zuvor getan haben. Wenn Sie die Makefiles nur manuell schreiben möchten, können Sie Shell-Befehle verwenden, um Systeminformationen abzurufen. –