Pergunta

Eu tenho dificuldade para entender o compilador gcc fornecidos pela OSX 10.6 Snow Leopard, principalmente por causa da minha falta de experiência com ambientes de 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

No entanto, minha arquitetura é visto como um tipo de intel i386 (eu tenho um dos mais recentes processadores Intel Core2 Duo MacBook)

$ arch
i386

e as metas do compilador i686-apple-darwin10

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

Claro que, se eu compilar 32 bits eu recebo um executável de 32 bits.

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

mas eu não obter a imagem grande. A configuração padrão para o compilador é produzir x86_64 executáveis, mesmo que eu tenha arco dizendo que tenho uma máquina de 32 bits (por Core2 é 64?); mesmo que (eu acho) Estou executando um kernel de 32 bits; mesmo se eu tiver um compilador como alvo a plataforma i686-maçã-darwin. Por quê? Como eles podem executar? Devo compilar 64 ou 32?

Esta questão é devido a minha tentativa de compilar gcc 4.2.3 no Mac, mas eu estou tendo um monte de problemas com gmp, mpfr e libiberty recebendo (em alguns casos) compilado para x86_64. Devo compilar tudo x86_64? Se assim for, qual é o alvo (não i686-apple-darwin10 eu acho)?

Obrigado pela ajuda

Foi útil?

Solução

O compilador padrão no Snow Leopard é gcc4.2, e sua arquitetura padrão é x86_64. A forma habitual de construir software Mac é construir múltiplas arquiteturas em passagens separadas, então use lipo para combinar os resultados. (Lipo única compila arquivos single-arco em um arquivo de múltipla arco, ou tiras de arcos para fora de um arquivo multi-arco. Não tem nenhuma utilidade em arquivos individuais de arco, como você descobriu.)

O número de bits do compilador não tem nada a ver com nada. Pode construir binários de 32 bits com um compilador de 64 bits, e vice-versa. (O que você acha que é o "alvo" do compilador é realmente seu executável, que é diferente.)

O número de bits do kernel tem nada a ver com nada. Você pode construir e executar binários de 64 bits quando inicializado em um kernel de 32 bits, e vice-versa.

O que importa é quando você ligar, se você tem as arquiteturas apropriadas para a ligação. Não é possível ligar de 32 bits constrói contra binários de 64 bits ou vice-versa. Então, o importante é ver o que as arquiteturas de suas bibliotecas de ligação são, certifique-se que eles são coerentes, em seguida, construir o seu binário da mesma arquitetura para que você possa ligar com as bibliotecas que você tem.

Outras dicas

i686-apple-darwin10.0.0 contém uma pasta x86_64 que não é compreendido pela maioria das versões do autotools. Em outras palavras, eu diria que o compilador gcc é, infelizmente, nada menos do que uma piada no Snow Leopard. Por que você iria agrupar bibliotecas de 32 bits e 64 bits em i686-apple-darwin10.0.0 está além de mim.

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

Você precisa mudar todos os seus arquivos do configure autotools para lidar olhando * 86- darwin diretórios e, em seguida, olhando para as bibliotecas de 64 bits eu imagino.

Tal como acontece com o seu sistema, o meu Mac mini diz que seu i386, embora o seu obviamente usando uma plataforma de 64 bits, novamente outro erro desde a sua distribuído com hardware de 64 bits.

$arch
i386

toolchains da Apple suportar múltiplas arquiteturas. Se você quiser criar um binário de gordura que contém x86 e x86_64 código, então você tem que passar o -arch i386 -arch x86_64 parâmetros para gcc. O compilador irá compilar o código duas vezes para ambas as plataformas de uma só vez.

Adicionando -arch i386 -arch x86_64 para CFLAGS pode permitir que você para compilar gmp, mpfr, e outros enfeites para vários arcos de uma só vez. Construir libusb dessa forma funcionou para mim.

Esta resposta está errada, mas ver comentários abaixo

A verdadeira questão é ... como você conseguiu uma versão do OSX 32-bit? Eu não estava ciente de que o Snow Leopard estiveste a versão de 32 bits, como todos os chips da Intel da Apple são Core 2 ou Xeon, que suportam a arquitetura x86_64.

Ah, e Snow Leopard só funciona em chips da Intel.

Edit:. Aparentemente Snow Leopard é iniciado no modo de 32 bits

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top