2008-11-17 10 views
1

J'ai un projet composé de deux fichiers, main.c et logoff.c. Lorsque je tente de les compiler je reçois cette erreur:Erreur étrange ld à propos du symbole en double

gcc -c -g -Wall main.c 
gcc -c -g -Wall logoff.c 
gcc -o main -g -Wall main.o logoff.o 
ld: duplicate symbol _logoff in logoff.o and main.o

J'ai une fonction nommée dans logoff logoff.c, mais je l'ai recherché main.c pour le texte « Logoff » et ai rien trouvé (la fonction est pas encore appelé!).

Si je change le nom de la fonction en log_off cela fonctionne. Il y a une deuxième fonction dans le fichier qui provoque alors la même erreur à moins que son nom ne soit changé aussi.

Y a-t-il une raison pour que cela se produise? J'ai ce problème sur deux systèmes différents. Une chose qui pourrait être pertinente est que j'ai utilisé le même fichier logoff.c dans un autre projet mais il n'est pas connecté à celui-ci.

+0

par curiosité, avez-vous #include logoff.c dans main.c? –

+0

C'est votre problème alors. Déplacez les déclarations dans un fichier d'en-tête comme logoff.h et il se compilera correctement. –

Répondre

2

Créez un fichier logoff.h avec seulement la déclaration de fonction de fermeture de session, comme

void logoff(void);

Puis, en main.c inclure avec #include "logoff.h". N'incluez pas logoff.c, car le compilateur compilera la fonction deux fois, et l'éditeur de liens verra alors deux fonctions de ce nom.

Cela semble fonctionner si vous le remplacez par log_off, puis ne recompilez que l'un d'entre eux. L'autre fichier objet contiendra toujours l'ancienne fonction de déconnexion. Ainsi, l'éditeur de liens voit un log_off et un logoff. C'est la raison pour laquelle cela a semblé fonctionner pour vous avec ce nom.

+0

Il semble si évident maintenant ... merci. – titaniumdecoy

2

Est-ce que #include ou #import logoff.c dans main.c?

Vous avez - bien, il y a votre problème. logoff.c est inclus dans main.c, donc main définit _logoff et _main. Vous compilez maintenant logoff.c, qui définit _logoff. Ensuite, vous essayez de lier les deux, ce qui signifie que le binaire résultant comprend les symboles _main, _logoff et _logoff, ce qui est exactement ce que l'éditeur de liens vous dit.