web-dev-qa-db-fra.com

Problèmes liés aux symboles en double

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?

61
drewww

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)

235
Shameem

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.

31
maxpower

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. 

5
Ram

Assurez-vous que delegate.m n’est répertorié qu’une fois dans les sources de compilation.

4
Muhammad Irfan

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 !!!

3
Rafael Reis

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.

1
psychotik

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.

Solution :

Cliquez sur le fichier .m pour accéder à l'inspecteur de fichiers et désélectionner une cible supplémentaire. 

enter image description here

0
rohan-patel