¿Cuál es la diferencia entre "arquitecturas" y "arquitecturas válidas" en la configuración de compilación de Xcode?

112

¿Cuál es el significado de ellos y puedo establecerlos en diferentes valores?

Northtree
fuente

Respuestas:

113

Las arquitecturas son las que desea construir, las arquitecturas válidas son las que podría concebir construir con su código base.

Entonces, tal vez solo desee construir su binario para armv7s, pero el mismo código fuente se compilaría bien para armv7 y armv6. Entonces VALID_ARCHS = armv6 armv7 armv7s, pero lo configura ARCHS = armv7sporque eso es todo lo que realmente quiere construir con su código.

O, en Apple-ese:

ARCOS (Arquitecturas)

Lista de identificadores separados por espacios. Especifica las arquitecturas (ABI, modelos de procesador) a las que se dirige el binario. Cuando esta configuración de construcción especifica más de una arquitectura, el binario generado puede contener código de objeto para cada una de las arquitecturas especificadas.

y:

VALID_ARCHS (arquitecturas válidas)

Lista de identificadores separados por espacios. Especifica las arquitecturas para las que se puede construir el binario. Durante la construcción, esta lista se cruza con el valor de la configuración de construcción ARCHS; la lista resultante especifica las arquitecturas en las que se puede ejecutar el binario. Si la lista de arquitectura resultante está vacía, el destino no genera ningún binario.

Fuente: Referencia de configuración de compilación de Xcode

En la práctica, lo deja en VALID_ARCHSpaz y no se preocupa por cambiarlo, y simplemente juega ARCHSpara configurar las arquitecturas que desea construir. Por lo general, establece una compilación de depuración en solo NATIVE_ARCH, ya que solo desea compilar la versión de depuración para la máquina en la que lo probará / ejecutará, y compilaciones de lanzamiento para el espectro completo de arquitecturas que planea admitir.

Jeremy W. Sherman
fuente
1
@DanMoore La "lista de arquitectura resultante" se realiza en la memoria en el momento de la compilación.
Saltymule
3
@ onmyway133 La mayoría de las veces, no quieres VALID_ARCHS. Si estuviera escribiendo asm en línea solo para ciertas arquitecturas, puede cambiar VALID_ARCHS para reflejar que su código ya no está destinado a ninguna otra arquitectura que no sea esa. Sin embargo, en su mayoría, es solo una señal para ti de Xcode que indica para qué arquitecturas puede construir, y eliges desde allí para tus ARCHS.
Jeremy W. Sherman
4

Por el documento de Apple, sabemos que el Xcode binario que se generará es la lista Valid Architectures con la que se cruza Architectures.

Entonces, no creo que la respuesta de Jeremy sea correcta, como él dice:

Entonces, tal vez solo desee construir su binario para armv7s, pero el mismo código fuente se
compilaría bien para armv7 y armv6. Entonces VALID_ARCHS = armv6 armv7 armv7s, pero configura ARCHS = armv7s porque eso es todo lo que realmente quiere construir con su código.

Cuando configura VALID_ARCHS = armv6 armv7 armv7sy configura ARCHS = armv7s, el resultado de la construcción binaria de Xcode es armv7s, no podría ser compatible con armv6 / armv7.

Y si desea que sea compatible con armv6 / armv7 / armv7s, debe configurar VALID_ARCHS = armv6 armv7 armv7sy ARCHS = armv6. De esta manera, el resultado del Xcode binario se construirá es armv6, y puede funcionar bien tanto en armv6 / armv7 / armv7s como el procesador arm es compatible con versiones anteriores .

neblina
fuente
1
Tenía razón: "porque eso es todo lo que realmente quieres construir con tu código".
Laszlo