Qual é a diferença entre “arquiteturas” e “arquiteturas válidas” nas configurações de compilação do Xcode?

112

Qual é o significado deles e posso defini-los em valores diferentes?

árvore do norte
fonte

Respostas:

113

Arquiteturas são aquelas que você deseja construir, arquiteturas válidas são aquelas que você poderia conceber construir com sua base de código.

Então, talvez você só queira construir seu binário para armv7s, mas o mesmo código fonte compilaria bem para armv7 e armv6. Então VALID_ARCHS = armv6 armv7 armv7s, mas você define ARCHS = armv7sporque é tudo o que você realmente deseja construir com seu código.

Ou, em Apple-ese:

ARCHS (arquiteturas)

Lista de identificadores separados por espaço. Especifica as arquiteturas (ABIs, modelos de processador) às quais o binário é direcionado. Quando esta configuração de construção especifica mais de uma arquitetura, o binário gerado pode conter código-objeto para cada uma das arquiteturas especificadas.

e:

VALID_ARCHS (arquiteturas válidas)

Lista de identificadores separados por espaço. Especifica as arquiteturas para as quais o binário pode ser construído. Durante a construção, esta lista é cruzada com o valor da configuração de construção ARCHS; a lista resultante especifica as arquiteturas nas quais o binário pode ser executado. Se a lista de arquitetura resultante estiver vazia, o destino não gerará nenhum binário.

Fonte: Referência de configuração do Xcode Build

Na prática, você sai VALID_ARCHSsozinho e não se preocupa em alterá-lo, apenas mexe com ARCHSa configuração das arquiteturas que deseja construir. Normalmente, você define uma compilação de depuração para apenas NATIVE_ARCH, uma vez que deseja apenas compilar a versão de depuração para a máquina em que irá testá-la / executá-la, e as compilações de lançamento para todo o espectro de arquiteturas que você planeja suportar.

Jeremy W. Sherman
fonte
1
@DanMoore A "lista de arquitetura resultante" é feita na memória no momento da construção.
Saltymule de
3
@ onmyway133 Na maioria das vezes, você não quer VALID_ARCHS. Se você estava escrevendo um conjunto embutido apenas para certas arquiteturas, pode alterar VALID_ARCHS para refletir que seu código não se destina mais a nenhuma outra, a não ser essas arquiteturas. Porém, na maioria das vezes, é apenas uma sugestão do Xcode que indica para quais arquiteturas ele pode ser construído, e você escolhe a partir daí para o seu ARCHS.
Jeremy W. Sherman de
4

Pelo documento da Apple, sabemos que o Xcode binário que construirá é a lista Valid Architectures com a qual se cruzou Architectures.

Então, não acho que a resposta de Jeremy esteja certa, como ele diz:

Então, talvez você só queira construir seu binário para armv7s, mas o mesmo código fonte
compilaria bem para armv7 e armv6. Então VALID_ARCHS = armv6 armv7 armv7s, mas você define ARCHS = armv7s porque isso é tudo que você realmente deseja construir com seu código.

Quando você define VALID_ARCHS = armv6 armv7 armv7s, e define ARCHS = armv7s, o resultado da construção do Xcode binário é armv7s, não é compatível com armv6 / armv7.

E se você quiser ser compatível com armv6 / armv7 / armv7s, você deve definir VALID_ARCHS = armv6 armv7 armv7se ARCHS = armv6. Desta forma, o resultado da construção do Xcode binário é armv6, e pode funcionar bem em ambos armv6 / armv7 / armv7s, pois o processador arm é compatível com versões anteriores .

foogry
fonte
1
Ele estava certo: "porque isso é tudo o que você realmente deseja construir com seu código."
Laszlo