Dupliquer des symboles lors de la liaison

J’essaye de comstackr mon programme avec ce makefile mais l’éditeur de liens me donne des histoires en disant qu’il y a des symboles en double. J’ai essayé de jouer avec ce makefile mais je n’ai pas eu beaucoup de chance. Mon programme ne contient que trois fichiers, pdp429.c, instructions.c et global.h. Toute aide est la bienvenue, merci!

Voici les erreurs (il y a 46 erreurs “” symbole de duplication “)” symbole de duplication _MASK_IN dans: pdp429.o instructions.o ld: 46 symboles de duplication pour l’architecture x86_64 collect2: ld a renvoyé 1 état de sortie make: *** [ pdp429] erreur 1 ”

CFLAGS = -O0 -pg -ggdb3 -Wall all: pdp429 pdp429: pdp429.o instructions.o gcc $(CFLAGS) pdp429.o instructions.o -o pdp429 pdp429.o: pdp429.c global.h gcc $(CFLAGS) pdp429.c -c instructions.o: instructions.c global.h gcc $(CFLAGS) instructions.c -c clean: rm -f *.o pdp429 

Vous ne fournissez pas certaines informations critiques, mais la supposition immédiate que vous avez réussi à définir certaines entités avec un lien externe (c’est-à-dire des variables ou des fonctions) dans votre fichier d’en-tête globals.h . Puisque globals.h est probablement inclus dans vos deux fichiers *.c , vous vous retrouvez avec une erreur de définition multiple.

Le MASK_IN est le candidat évident, à en juger par les messages d’erreur. Qu’est-ce que MASK_IN et comment et où est-il défini?

EDIT: Alors, voilà. Votre MASK_IN est défini dans globals.h comme étant short MASK_IN = 0x0001; . Cela provoquera certainement l’erreur de définition multiple. On dirait que vous avez réellement essayé de définir une constante nommée. Si tel est le cas, le langage C utilisera généralement #define pour définir les constantes manifestes, i, .e. faire

 #define MASK_IN 0x0001 

mais si vous voulez vraiment utiliser un object nommé, alors la meilleure approche serait de faire

 static const short MASK_IN = 0x0001; 

dans le fichier d’en-tête.

Si votre MASK_IN est censé être une variable globale (et non une constante), votre seule option est d’utiliser

 extern short MASK_IN; 

dans le fichier d’en-tête et

 short MASK_IN = 0x0001; 

dans un (et un seul) des fichiers .c .

Vous n’avez toujours pas fourni les informations que les gens ont demandées, mais je vais m’avancer et dire:

  1. Vous avez défini _MASK_IN dans global.h
  2. Vous avez inclus global.h dans plusieurs fichiers source.

Cela conduirait à la multiplication du symbole. Vous devez extern short _MASK_IN; dans votre en-tête et définissez-le réellement dans un fichier source avec short _MASK_IN = 0x0001; . Ou mieux encore, en supposant que ce soit constant, il suffit de # le définir dans un fichier d’en-tête.

Les #ifndef gardes que votre commentaire dit que vous utilisez ne vous aident pas car d’un fichier source à l’autre, ces gardes sont effacés. Le #define n’est valide que dans la source compilée à tout moment.