Question

J'ai du mal à comprendre le compilateur gcc fourni par Mac OS X 10.6 léopard des neiges, principalement à cause de mon manque d'expérience avec les environnements 64 bits.

$ cat >foo.c
main() {}
$ gcc foo.c -o foo
$ file foo
foo: Mach-O 64-bit executable x86_64
$ lipo -detailed_info foo
input file foo is not a fat file
Non-fat file: foo is architecture: x86_64

Cependant, mon architecture est considérée comme un type i386 intel (je l'un des derniers processeurs Intel Core 2 Duo MacBook)

$ arch
i386

et les cibles du compilateur i686-pomme-darwin10

$ gcc --version 
i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5646)

Bien sûr, si je compile 32 bits je reçois un exécutable 32 bits.

$ gcc -m32 foo.c -o foo
$ file foo
foo: Mach-O executable i386

mais je ne comprends pas la grande image. La configuration par défaut pour le compilateur est de produire executables x86_64, même si je dois dire que je arc ai une machine 32 bits (pourquoi Core2 est 64?); même si (je suppose), je suis en cours d'exécution d'un noyau 32 bits; même si j'ai un compilateur ciblant la plate-forme i686-apple-darwin. Pourquoi? Comment peuvent-ils fonctionner? Dois-je compiler 64 ou 32?

Cette question est due à ma tentative de compilation gcc 4.2.3 sur Mac, mais je vais avoir un tas de problèmes avec gmp, mpfr et libiberty obtenir (dans certains cas) compilé pour x86_64. Dois-je tout compiler x86_64? Si oui, quelle est la cible (non i686-pomme-darwin10 je suppose)?

Merci pour l'aide

Était-ce utile?

La solution

Le compilateur par défaut sur Snow Leopard est gcc4.2, et son architecture par défaut est x86_64. La façon typique de construire un logiciel Mac est de construire des architectures multiples dans plusieurs passes, puis utilisez lipo pour combiner les résultats. (Lipo compile uniquement les fichiers à une arche dans un fichier à voûtes multiples ou bandes archs d'un fichier multi-arcade. Il n'a pas d'utilité sur les fichiers à un seul arc, comme vous découvriez.)

Le nombre de bits du compilateur n'a rien à voir avec quoi que ce soit. Vous pouvez construire les binaires 32 bits avec un compilateur 64 bits, et vice versa. (Ce que vous pensez est la « cible » du compilateur est en fait son exécutable, ce qui est différent.)

Le nombre de bits du noyau n'a rien à voir avec quoi que ce soit. Vous pouvez créer et exécuter les binaires 64 bits lors du démarrage sur un noyau 32 bits, et vice versa.

Ce qui importe est quand vous le lien, si vous avez les architectures appropriées pour relier. Vous ne pouvez pas lier 32 bits construit contre les binaires 64 bits ou vice-versa. Donc, la chose importante est de voir ce que les architectures de vos bibliothèques de liens sont, assurez-vous qu'ils sont cohérents, puis construire votre binaire de la même architecture afin que vous puissiez créer un lien avec les bibliothèques que vous avez.

Autres conseils

i686-pomme-darwin10.0.0 contient un dossier x86_64 qui ne sont pas compris par la plupart des versions de autotools. En d'autres termes, je dirais que le compilateur gcc est malheureusement rien d'une blague sur Snow Leopard. Pourquoi vous regrouper 32 bits et bibliothèques 64 bits en i686-pomme-darwin10.0.0 me dépasse.

$ ls /usr/lib/gcc
i686-apple-darwin10 powerpc-apple-darwin10

Vous devez changer tous vos autotools configurer les fichiers pour gérer la recherche dans * 86- darwin répertoires et recherche ensuite pour les bibliothèques 64 bits j'imagine.

Comme avec votre système, mon mac mini-dit son i386, même si son utilisation de toute évidence, une plate-forme 64 bits, encore une fois une autre erreur depuis son distribué avec le matériel 64 bits.

$arch
i386

Apple toolchains prennent en charge plusieurs architectures. Si vous voulez créer un fichier binaire gras qui contient le code x86 et x86_64, alors vous devez passer les paramètres -arch i386 -arch x86_64 à gcc. Le compilateur compiler votre code deux fois pour les deux plates-formes en une seule fois.

Ajout -arch i386 -arch x86_64 à CFLAGS peut vous permettre de compiler gmp, mpfr, et ainsi de suite pour plusieurs archs en une seule fois. Construire libusb cette façon a fonctionné pour moi.

Cette réponse est fausse, mais voir commentaires ci-dessous

La vraie question est ... comment avez-vous une version 32 bits de Mac OS X? Je ne savais pas que Snow Leopard HAD une version 32 bits, comme toutes les puces Intel d'Apple sont Core 2 ou Xeon, qui soutiennent l'architecture x86_64.

Oh, et Snow Leopard ne fonctionne que sur des puces Intel.

Edit:. Apparemment, commence Snow Leopard en mode 32 bits

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top