Bonjour
J'ai un code avec une vingtaine de fichiers et fonctions. Si je le compile en faisant un bête et méchant :
gcc -lm -I../include/ -o exec *.c
je n'est aucun message d'erreur. Par contre l'utilisation de ce makefile produit des erreurs après l'édition de liens.
Dans mon code allocation.c qui contient la fonction allocation() est le premier fichier par ordre alphabétique. Quand je compile avec le makefile il me dit pour toutes mes fonctions :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95 # ------------------------------------------------------------------- # options modifiables # ------------------------------------------------------------------- # Nom de l'executable : EXECUTABLE = cargol # Choix du compilateur : COMPILATEUR = gcc # Options de compilations : COPTIONS = -O3 -Wall -Wextra LOPTIONS = -lm # ------------------------------------------------------------------- # Emplacement des sources et des objets # ------------------------------------------------------------------- # Dossier racine du code : CODE := $(shell pwd) # Adresse des sources, des objets et des includes : INCDIR = $(CODE)/include SRCDIR = $(CODE)/src OBJDIR = $(CODE)/obj EXISTE := $(wildcard $(OBJDIR)) # Liste des fichiers sources : SRC = $(wildcard $(SRCDIR)/*.c) #SRC = $(foreach nom, $(SRCDIR), $(wildcard $(nom)/*.c)) # Liste des fichiers objets : NOM = $(basename $(notdir $(SRC))) OBJ = $(addprefix $(OBJDIR)/, $(addsuffix .o, $(NOM))) # ------------------------------------------------------------------- # compilation # ------------------------------------------------------------------- # regle par defaut defaut: dev # regle edition de liens install: dir $(OBJ) $(COMPILATEUR) -o $(EXECUTABLE) $(LOPTIONS) $(OBJ) # regle edition de liens dans le cas dev dev: dir $(OBJ) $(COMPILATEUR) -o $(EXECUTABLE)_dev $(LOPTIONS) $(OBJ) # regle de compilation des sources $(OBJ): $(SRC) $(COMPILATEUR) -c $(COPTIONS) -I$(INCDIR) -o $@ $< # $@ = nom de la regle # $< = nom de la cible # ------------------------------------------------------------------- # regles suplementaires # ------------------------------------------------------------------- .PHONY: clean help dir purge # creation du dossier obj si besoin : ifeq ($(strip $(EXISTE)), ) dir: mkdir $(OBJDIR) else dir: endif # pour effacer tous les objet : clean: rm -rf $(OBJDIR) # pour effacer tous les objet et les executables : purge: rm -rf $(OBJDIR) $(EXECUTABLE) $(EXECUTABLE)_dev # aide : help: @echo @echo " Programme Cargol" @echo @echo "--------------------------------------------------------------------------" @echo " Options disponibles" @echo @echo " install : compilation et creation de l'executable cargol" @echo " dev : compilation et creation de l'executable cargol_dev (defaut)" @echo " clean : effacement des fichiers objets" @echo " purge : effacement des fichiers objets et des executables" @echo "--------------------------------------------------------------------------" @echo
Puis encore pour toutes mes fonctions :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 /programme/cargol/comp/obj/commande.o: In function `allocation': allocation.c:(.text+0x0): multiple definition of `allocation' /programme/cargol/comp/obj/allocation.o:allocation.c:(.text+0x0): first defined here /programme/cargol/comp/obj/defaut.o: In function `allocation': allocation.c:(.text+0x0): multiple definition of `allocation' /programme/cargol/comp/obj/allocation.o:allocation.c:(.text+0x0): first defined here /programme/cargol/comp/obj/dynamique.o: In function `allocation': allocation.c:(.text+0x0): multiple definition of `allocation'
Si vous voulais je peux fournir le code et le makefile par un zip.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 /programme/cargol/comp/obj/allocation.o: In function `allocation': allocation.c:(.text+0x2f): undefined reference to `nat' allocation.c:(.text+0x36): undefined reference to `nomfonction' allocation.c:(.text+0x42): undefined reference to `nomfonction' allocation.c:(.text+0x49): undefined reference to `nomfonction' allocation.c:(.text+0x55): undefined reference to `nat' allocation.c:(.text+0x61): undefined reference to `frcx' allocation.c:(.text+0x6d): undefined reference to `nat' allocation.c:(.text+0x79): undefined reference to `frcy' allocation.c:(.text+0x85): undefined reference to `nat' .... toutes les variables de la fonction allocation()
Merci d'avance
Partager