2010-11-23 2 views
3

Lorsque je regarde ma fenêtre de résultats de construction, il y a des entrées en double pour chaque compilation .m, Precompile .pch et Link.Pourquoi Xcode compile-t-il deux fois mon code, entraînant des erreurs de liens pour les globals?

Chaque fois que j'essaie d'ajouter une constante globale, même statique, j'obtiens une erreur de l'éditeur de liens. Dans la phase de liaison, je peux voir qu'une exécution est pour armv6 et l'autre pour armv7 (lors de la compilation pour un périphérique iOS).

Toutefois, il n'y a pas de duplication ou d'erreur de lien lors de la compilation pour le simulateur iOS.

Est-ce un problème (au-delà du problème évident des erreurs de l'éditeur de liens)? Si oui, cela va-t-il causer des problèmes de performance? Comment puis-je rectifier cela?

Répondre

0

La réponse courte est: n'utilisez pas de globaux. : D Look up extern use with objective-c, il peut vous aider à créer un global. Si vous construisez pour arm6 et arm7, vous aurez des entrées de construction en double car ce sont des assemblages différents.

Probablement ce qui se passe lorsque vous créez un static const en tant que global est qu'il est défini dans chaque fichier. Mettez-le dans un fichier .m et ajoutez le mot-clé extern dans les autres. Cela peut être faux, cependant, car je n'utilise pas de globals. (et vous ne devriez pas non plus: D)

+0

Il n'y a rien de mal avec les constantes globales, juste des variables globales. Je préfère utiliser une const statique pour ces constantes globales plutôt que #define, car elle permet de définir le type. – Jordan

+0

Cependant, je pensais que le mot-clé statique empêcherait le global d'être défini dans d'autres fichiers? – Jordan

+0

@Jordan, je ne pense pas que 'static' le rende meilleur. Vous devez faire const globalement comme le fait 'C', avec' extern' –

2

Je suis assez sûr que les doubles messages sont causés par la compilation Universal App.

0

Vous ne devez pas mettre de définitions dans un fichier d'en-tête. Les déclarations sont des choses comme int add(int a, int b); et extern int c;. Les définitions sont des choses comme int add(int a, int b) { return a+b; } et int c;.

Si vous définissez la variable globale int c; dans un fichier d'en-tête, chaque fichier source #incluant celui-ci définira un symbole appelé "c". Le lieur ne l'aime pas: Il y a 2 (ou 3, ou 4 ...) choses différentes appelées c mais elles doivent toutes pointer vers la même chose. Lequel devrait-il utiliser? (Il est équivalent à définir deux (fonctions non statiques) avec le même nom, ou deux classes avec le même nom.)

Au lieu de cela, bâton extern int c; dans le fichier d'en-tête et int c; dans un fichier source. (Les compilations de "duplicate" pour armv6 et armv7 sont parfaitement normales.Les deux architectures sont compilées et reliées séparément puis compilées dans un "gros" exécutable.Allablement, armv6 fonctionne sur des "anciens" périphériques (pré-3GS) et armv7 fonctionne sur les "nouveaux" périphériques (3GS +). Les nouveaux périphériques peuvent également exécuter armv6, mais armv7 est beaucoup plus rapide.)

Questions connexes