2010-04-02 8 views
0

Je construis un projet C avec Xcode et chaque fois que je le construis, il me donne cette erreur:GCC 4.2 Build erreur

ld: duplicate symbol _detectLinux in /Users/markszymanski/Desktop/Programming/C/iTermOS/build/iTermOS.build/Debug/iTermOS.build/Objects-normal/i386/linuxDetect.o and /Users/markszymanski/Desktop/Programming/C/iTermOS/build/iTermOS.build/Debug/iTermOS.build/Objects-normal/i386/iTermOS.o

Merci!

Répondre

1

Cela signifie que vous avez défini le même symbole avec une portée globale (au moins) deux fichiers sources différentes - soit une fonction ou une variable globale appelée _detectLinux, et apparemment dans les fichiers linuxDetect.c et iTermOS.c.

Comment réparer cela dépend de la façon dont vous avez l'intention d'utiliser ce symbole:

  • Si vous vouliez définir dans un fichier et l'utiliser dans l'autre fichier, déclarer extern dans l'autre fichier.

  • Si vous souhaitez uniquement utiliser le symbole dans le fichier dans lequel il a été déclaré, vous pouvez le déclarer static.

  • Si le symbole est défini dans les deux fichiers, vous pouvez renommer le symbole dans un fichier (ou les deux).

+0

Je l'ai déclaré comme «statique» et cela fonctionne maintenant, merci! –

0

Eh bien, ce n'est pas beaucoup d'informations pour continuer. Comme le dit l'erreur, le symbole _detectLinux est inclus à la fois dans linuxDetect.o et iTermsOS.o et lorsque vous essayez de les lier ensemble, il y a un conflit puisque l'éditeur de liens ne sait pas lequel des deux symboles utiliser. Cela peut arriver si vous avez, par exemple, une variable globale portant ce nom dans un fichier .h qui est utilisé pour générer les deux fichiers au lieu de le déclarer au même endroit et de le déclarer comme "extern" dans le fichier .h. Ce que vous devez faire est de regarder où le symbole _detectLinux est déclaré à l'origine, puis de suivre les dépendances pour linuxDetect.o et iTermOS.o pour voir pourquoi il est inclus publiquement dans les deux.

1

Si _detectLinux est une fonction, une façon courante d'obtenir ce problème est de le définir dans un fichier d'en-tête, mais oubliez de le marquer en ligne. Cela l'amènerait à générer le code de fonction dans chaque fichier incluant l'en-tête (vraisemblablement _detectLinux.c et iTermsOS.c).

Alternativement peut-être vous avez copié-collé le corps entier de la fonction entre les deux fichiers source au lieu de simplement déclarer la fonction dans iTermsOS.c où je m'attends à ce qu'il soit appelé.

Questions connexes