¿Por qué Xcode está comstackndo todo mi código dos veces, lo que resulta en errores de linker para cualquier grupo global?

Cuando miro mi window Resultados de compilation, hay inputs duplicadas para cada Compile .m, Precompile .pch y Link.

Cada vez que trato de agregar un global, incluso como una constante estática, obtengo un error vinculador.

En la etapa de enlace, puedo ver que una ejecución es para armv6 y la otra es para armv7 (cuando se comstack para un dispositivo iOS).

Sin embargo, no se producen duplicaciones ni errores de vinculación al comstackr para el simulador de iOS.

¿Esto es un problema (más allá del problema obvio de los errores del linker)? Si es así, ¿causará problemas de performance? ¿Cómo puedo rectificar esto?

Estoy bastante seguro de que los posts dobles son causados ​​por la compilation de Universal App.

La respuesta corta es, no use globals. : D Busca el uso extern con el objective c , puede ayudarte a crear un global. Si está construyendo para arm6 y arm7, tendrá inputs de compilation duplicadas ya que son sets diferentes.

Probablemente lo que sucede cuando se crea una static const como global es que se define en cada file. Póngalo en un file .m y agregue la palabra key extern en los demás. Sin embargo, puede estar mal, ya que no uso globals. (y tampoco deberías: D)

No debe poner definiciones en un file de encabezado.

Las declaraciones son cosas como int add(int a, int b); y extern int c; .

Las definiciones son cosas como int add(int a, int b) { return a+b; } int add(int a, int b) { return a+b; } e int c; .

Si define la variable global int c; en un file de encabezado, cada file fuente que # lo incluya definirá un símbolo llamado "c". Al linker no le gusta: hay 2 (o 3, o 4 …) cosas diferentes llamadas c pero todas deben apuntar a la misma. ¿Cuál debería usar? (Es equivalente a definir dos funciones (no estáticas) con el mismo nombre, o dos classs con el mismo nombre).

En cambio, pegue extern int c; en el file de encabezado e int c; en un file fuente.

(Las comstackciones "duplicadas" para armv6 y armv7 son perfectamente normales. Las dos architectures se comstackn y se enlazan por separado y luego se comstackn en un ejecutable "gordo". Sin embargo, armv6 se ejecuta en dispositivos "antiguos" (pre-3GS) y se ejecuta armv7 Dispositivos "nuevos" (3GS +). Los dispositivos "nuevos" también pueden ejecutar armv6, pero armv7 es mucho más rápido).