CodeBlocks Duplicate Symbol

Résolu/Fermé
coralie_CNAM Messages postés 2 Date d'inscription lundi 22 février 2016 Statut Membre Dernière intervention 24 février 2016 - 22 févr. 2016 à 13:12
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 - 24 févr. 2016 à 14:31
Bonjour,

J'ai à chaque compilation le message suivant:

Pour un fichier .c créé, comme ici AutreTest.c,

duplicate symbol _main in:

obj/Debug/AutreTest.o

obj/Debug/main.o

ld: 4 duplicate symbols for architecture x86_64

clang: error: linker command failed with exit code 1 (use -v to see invocation)

IL semble qu'un fichier main soit créé à chaque fois. Ca empêche la compilation. Je l'ai supprimé une première fois, j'ai pu compiler. Le même problème s'est reproduit, mais avec une nouvelle suppression, j'ai eu un nouveau message:


Linking stage skipped (build target has no object files to link)
Nothing to be done (all items are up-to-date).

Quelqu'un a-t-il une idée?

Merci
A voir également:

2 réponses

[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié par [Dal] le 24/02/2016 à 10:59
Bonjour coralie_CNAM,

Ce message signifie qu'il y a plusieurs fonctions
main()
dans ton projet, ce qui n'est pas légal en C, la fonction
main()
étant le point d'entrée et devant être unique au travers des différents fichiers compilés composant le projet.

Il se peut que tu aies ajouté au projet un fichier
AutreTest.c
pour y mettre ta fonction
main()
, alors que le wizard de Codeblocks t'avait déjà créé un fichier
main.c
avec une fonction
main()
.

Si tu crées ton projet au moyen du wizard Codeblocks, les choses se produisent effectivement selon le déroulé suivant :

click sur : Create a new project - Console application [Go] - [Suivant]- Sélectionner le langage C [Suivant] - écrire le "Project title" par exemple "AutreTest05" et faire [Suivant] sans rien changer d'autre - puis [Finir]

Cela te crée un projet nommé "AutreTest05" dans lequel tu as un dossier "Sources". En double cliquant sur le dossier "Sources" tu vois qu'il contient un fichier
main.c
déjà créé par le wizard.

Si tu doubles cliques sur
main.c
, Codeblocks ouvre le fichier source
 main.c
, et tu peux voir qu'il contient un code d'exemple de type "Hello world" avec une fonction
main()
.

Si le nom de ce fichier ne te convient pas, tu peux retirer
main.c
(en faisant un clic droit dessus à partir de Codeblocks et "Remove file from project") et créer un nouveau
fichier.c
en faisant Fichier - New - ... avec le nom qui te convient, destiné à contenir la fonction
main()
.

Mais le nom de ce fichier importe peu, car Codeblocks générera l'exécutable en le nommant selon le nom que tu auras choisi pour le projet ("AutreTest05.exe" par exemple) et non pas selon le nom du fichier source contenant la fonction
main()
.

Lorsque tu ajoutes ou retires des fichiers sources, fais le toujours à partir de Codeblocks, pas à partir du disque dur, ainsi tu t'assures que Codeblocks gère effectivement les fichiers composant le projet.

Un projet C peut contenir de nombreux fichiers .c et .h, pas uniquement un seul. Mais il ne doit y avoir d'une seule fonction
main()
.

Dal
0
coralie_CNAM Messages postés 2 Date d'inscription lundi 22 février 2016 Statut Membre Dernière intervention 24 février 2016
24 févr. 2016 à 13:39
Bonjour Dal,

Merci beaucoup pour cette explication. Mon prof nous avait dit que par défaut, on commençait les programmes avec cette ligne de code:
int main()

{
/* corps du programme*/
}


sans nous expliquer pourquoi.
J'ai effectivement modifié le nom de cette variable, et je n'ai plus eu de problème.
Donc, ça correspond bien à ce que tu décris.
Je crois qu'il y a une préférence pour autoriser d'avoir plusieurs variables avec le même nom dans un même programme, mais je vais éviter.

Néanmoins, je rencontre un autre problème, que je contourne en effaçant chacun des programmes que j'exécute à chaque nouvel exercice:
Si j'ai plusieurs fichiers dans un même projet, quand j'en exécute un, C::B exécute le premier fichier qui a été ouvert dans mon dossier source, et ce même si je le ferme....
Enfin, là c'est encore une autre histoire;

Quoi qu'il en soit, c'est toujours le même problème quand les profs n'expliquent pas les choses en profondeur. En plus, on travaille sur PC, alors que je suis sur Mac. J'ai eu le même problème que celui que j'ai signalé au début avec un autre PC.
...
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié par [Dal] le 24/02/2016 à 14:38
Mon prof nous avait dit que par défaut, on commençait les programmes avec cette ligne de code:
int main()

{
/* corps du programme*/
}


oui, même si pour être plus rigoureux cela devrait être :

int main(void)
{
    /* corps du programme */

    return 0;
}


J'ai effectivement modifié le nom de cette variable, et je n'ai plus eu de problème.
Donc, ça correspond bien à ce que tu décris.


"main()" n'est pas une "variable", c'est une fonction. Cela n'a rien à voir. Vois ton cours. Relis aussi ce que j'ai écris, car ce n'est pas du tout cela.

Je crois qu'il y a une préférence pour autoriser d'avoir plusieurs variables avec le même nom dans un même programme, mais je vais éviter.


Il doit y avoir une et une seule fonction main() dans un programme C.

Néanmoins, je rencontre un autre problème, que je contourne en effaçant chacun des programmes que j'exécute à chaque nouvel exercice:
Si j'ai plusieurs fichiers dans un même projet, quand j'en exécute un, C::B exécute le premier fichier qui a été ouvert dans mon dossier source, et ce même si je le ferme....
Enfin, là c'est encore une autre histoire;


Non.

Crée un projet par programme (c'est à dire par exercice, si tu veux), en faisant Create a new project - Console application ... à chaque nouvel exercice et en travaillant seulement sur le fichier source main.c créé par défaut par Codeblocks (que tu modifies pour faire ton exercice).

Quand tu as fini, fais File - Close all projects (ou Close project).

Quand tout est propre et que Codeblocks est vierge de tout projet, passe à l'exercice suivant en créant un autre projet.

etc.

Tu peux ouvrir plusieurs projets simultanément sous Codeblocks, mais tu as l'air assez embrouillée comme cela. Avant de créer un projet (un programme) assure toi que rien d'autre n'est ouvert et que le "Workspace" de Codeblocks est vide.

Quoi qu'il en soit, c'est toujours le même problème quand les profs n'expliquent pas les choses en profondeur.

Il y a des limites à ce que les enseignants peuvent expliquer

En plus, on travaille sur PC, alors que je suis sur Mac.

Je suis sous Linux. Codeblocks étant multiplateforme, il y a de fortes chances que les problèmes d’utilisation que tu rencontres sous Mac soient les mêmes.

J'ai eu le même problème que celui que j'ai signalé au début avec un autre PC.


sans doutes parce que tu utilisais Codeblocks de la même façon erronée.


Dal
0