2009-08-19 9 views
0

Bien que peu expérimenté, je ne comprends toujours pas s'il est nécessaire d'installer une application et/ou de construire un programme C++ ou une bibliothèque C++ sous Network File Système partagé par des machines, qui ont une version Linux différente (par exemple CentOS version 4.7, Ubuntu 8.10), éventuellement un bit différent (par exemple 32 bits, 64 bits) et différentes versions du compilateur (par exemple gcc/g ++ 3.4.6 20060404 (Red Hat 3.4.6-10), gcc/g ++ (Ubuntu 4.3.2-1ubuntu12) 4.3.2.), De sorte que les fichiers exécutables ou de bibliothèque peuvent être utilisés sous ces machines différentes? Quels sont les principes ici? Par exemple, sur un système de fichiers réseau, j'ai un exécutable construit à partir de mon programme C++ sous une machine avec CentOS version 4.7, x86_64 ad gcc/g ++ 3.4.6 20060404 (Red Hat 3.4.6-10). Je trouve avec surprise que l'exécutable peut être utilisé sous une autre machine avec Ubuntu 8.10, x86_64 et gcc/g ++ (Ubuntu 4.3.2-1ubuntu12) 4.3.2. De plus, toutes les bibliothèques partagées que j'ai construites sur la première machine et utilisées par mon programme ne se plaignent pas d'erreur lorsque l'exécutable s'exécute sur la seconde machine. Je suis si inquiet si le fonctionnement de l'exécutable construit sur une machine différente donnera des résultats fiables?créer un programme et installer un logiciel sous Network File System pour différentes machines

Un autre exemple, je me souviens d'un exécutable construit sur une machine 64 bits ne peut pas fonctionner sur une machine 32 bits. Mais qu'en est-il de l'inverse, exécutant sur une machine 64 bits un exécutable construit sur une machine 32 bits? Qu'en est-il des fichiers de bibliothèque C++ construits et utilisés sur différentes machines binaires?

Si possible, pouvez-vous me diriger vers une référence, comme une page Web, un livre, ... qui sont liés à mes questions?

Merci pour votre intérêt!

Répondre

0

Vous avez vraiment besoin de tester votre programme sur chaque configuration pour être absolument sûr.

Vous pouvez généralement exécuter des programmes 32 bits sur des machines 64 bits, vous pouvez donc probablement vous en passer uniquement avec une version 32 bits si vous le souhaitez.

Vous devez faire attention à la version de gcc utilisée sur chaque plate-forme. L'exécution d'un programme construit avec gcc 4 sur une machine dont le système d'exploitation et la glibc ont été construits avec gcc 3 pourrait vous causer des problèmes. Assurez-vous donc qu'au moins les numéros de version principaux correspondent.

De toute évidence, si vous avez différentes architectures de machines, Sparc par rapport à AMD64 par exemple, vous aurez besoin de différentes versions. Il y a même quelques différences subtiles entre Intel et AMD donc ne soyez pas trop agressif avec les optimisations du compilateur et si vous programmez utilise des instructions SSE (si vous ne savez pas ce que c'est, alors vous ne l'utilisez pas), assurez-vous que Le set SSE que vous utilisez est supporté par toutes les machines.

Les problèmes clés ici sont l'architecture de la machine, la disponibilité des bibliothèques appropriées et l'interface binaire d'application ou "ABI". L'ABI spécifie comment le système d'exploitation doit utiliser les registres machine et la mémoire pour transmettre des informations entre différentes parties du programme, par exemple, comment les données sont poussées dans la pile pour transmettre des arguments à une fonction. L'ABI utilisé par GCC a été connu pour changer de temps en temps, c'est pourquoi l'utilisation de versions compatibles est nécessaire.

Je ne suis pas au courant d'un livre ou d'une page Web qui couvre toutes ces choses. Commencez avec la documentation pour GCC et Binutils. Et il n'y a pas de substitut à de bons tests.

+0

Ai-je raison de dire que ce problème de compatibilité n'est presque jamais garanti, la manière la plus sûre est de construire une version pour chaque machine? Par exemple, si j'ai une bibliothèque C++ et deux machines pour le NFS, je devrai le construire dans ~/libraries/host1/mylibrary/et ~/libraries/host2/mylibrary /.Lorsque mon programme C++ utilise cette bibliothèque, comment écrire un Makefile qui détecte la machine actuelle et affecter le bon chemin à la bibliothèque pour -L et -I? – Tim

+0

Eh bien, pour obtenir la garantie, vous devez faire vos devoirs et tester. Si vous voulez construire pour chaque machine, pensez à utiliser GNU autoconf et automake. Autoconf a été conçu pour ce problème. Vous finissez par créer et utiliser un script configure, comme la plupart des paquets source Linux que vous téléchargez. Si vous avez beaucoup de machines différentes à construire ou si vous avez l'intention de distribuer ce programme à d'autres, c'est ce qu'il vous faut. Mais, utiliser autoconf n'est pas trivial si vous ne l'avez jamais fait auparavant. Si vous voulez juste écrire les Makefiles manuellement, vous pouvez utiliser des commandes de shell pour obtenir des informations sur le système. –

Questions connexes