Lors d'un refactor d'un projet iOS, je suis tombé sur cet ours d'un bug. Pendant la phase de liaison, je reçois ce message:
ld: symbole en double _OBJC_IVAR _ $ _ TinCanViewController.currentViewController dans /path/to/TinCanViewController-E98A666B7AF2673A.o et /path/to/TinCanViewController-E98A666B7AF2673A.o
Autant que je sache, il semble que TinCanViewController-E98A666B7AF2673A.o
déclare le symbole spécifié deux fois; les deux chemins pointent vers le même fichier .o. J'ai exécuté nm
sur ce fichier spécifique et il n'a inclus ce symbole qu'une seule fois:
00008150 S _OBJC_IVAR _ $ _ TinCanViewController.currentViewController
J'ai exécuté nm
sur tous les autres fichiers .o du répertoire pour voir s'ils déclaraient également ce symbole, mais ce n'est pas le cas. Cela arrive à tout membre que j'ajoute à la classe TinCanViewController - ce n'est pas spécifique à currentViewController.
J'ai le sentiment que je dois être en quelque sorte contre la classe deux fois, mais j'ai assez assidûment vérifié et vérifié toutes les références à cette classe. Dans la version refactorisée, il n'y en a fondamentalement aucun. AppDelegate l'inclut, mais pour le moment, il ne s'agit essentiellement que d'une classe intermédiaire qui charge un autre ViewController au début. Aucune autre classe du projet ne l'inclut.
Des suggestions sur ce qui pourrait causer ceci ou comment je pourrais mieux le déboguer?
J'ai eu ce problème sur le dernier Xcode 4. Cause: j'ai inclus file.m
au lieu de file.h
Peut-être que vous avez inclus TinCanViewController.m
(devrait être TinCanViewController.h
)
Cela arrivait, mais mon problème était lié à la fusion des problèmes de notre rapport. Le fichier .m a été répertorié deux fois à un endroit où il ne devrait l'avoir été qu'une seule fois (dans le projet, mais pas dans la structure de fichier/groupe, de sorte que vous ne pouviez pas voir le problème dans Xcode, uniquement l'erreur). Le correctif consiste à ouvrir le fichier .pbxproj dans votre fichier de projet et à localiser l'entrée en double dans ce fichier. Après avoir supprimé le duplicata, le projet est bien construit.
Il m'est arrivé d'inclure le fichier .h et le fichier .m à deux reprises dans le projet. Une fois que j'ai enlevé la deuxième copie, l'erreur a disparu.
Assurez-vous que delegate.m n’est répertorié qu’une fois dans les sources de compilation.
Ce problème est résolu ici lorsque j'ai supprimé (à l'aide de Xcode) tous les fichiers .m et .h du dossier Class, puis j'ai nettoyé Projet (Commande + Maj + K) et créé à nouveau. Je fais donc de nouveau glisser les fichiers du Finder vers le dossier de la classe dans Xcode. Enfin, j'ai nettoyé et construit mon projet à nouveau ...
Bonne chance !!!
Je pense que c'est un bug avec le dernier éditeur de liens d'Apple lors de la création de bibliothèques statiques universelles. Je ne parviens pas à trouver le numéro de bogue pour le moment, mais cela se produit car il génère incorrectement armv6 et armv7 sans les désambiguïser.
Pour vérifier si c'est le cas, modifiez la configuration pour ne créer que armv6 ou amv7, et vous n'aurez pas ce problème.
Cela peut également se produire si vous avez un projet à plusieurs cibles et si deux cibles ont le même fichier, tel que abc.m
, et que abc.m
est sélectionné pour les deux cibles.
Ce qui s’est passé dans mon cas, c’est que j’avais deux cibles nommées ABC
et XYZ
et que chacune d’elles avait son propre fichier DiagramViewController.m
, censé exécuter du code pour leurs cibles. J'ai accidentellement eu DiagramViewController.m
of target ABC
avait également sélectionné target pour XYZ
.
Cliquez sur le fichier .m
pour accéder à l'inspecteur de fichiers et désélectionner une cible supplémentaire.