# Compilation fichier .c et .h dans un Makefile

**URL:** <https://www.debian-fr.org/t/compilation-fichier-c-et-h-dans-un-makefile/15304>\
**Category:** Programmation\
**Created:** [Février 20, 2016, 6:05 UTC](https://www.debian-fr.org/t/compilation-fichier-c-et-h-dans-un-makefile/15304 "2016-02-20T18:05:52Z")\
**Posts on this page:** 13\
**Page:** 1

<div class="post-metadata">

**Author:** ![Kriss](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/k/e56c9b/32.png) [@Kriss](https://www.debian-fr.org/u/Kriss)\
**Post date:** [Février 20, 2016, 6:05 UTC](https://www.debian-fr.org/t/compilation-fichier-c-et-h-dans-un-makefile/15304/1 "2016-02-20T18:05:52Z")

</div>

Bonjour, voila j’aimerai simplement savoir comment on fait pour compiler un fichier .c et .h ensemble dans le makefile, et a quoi ça sert car je nage…

Voici mon Makefile

OBJS = main.o  
LINKOBJET = main.o  
BIN = Xbot  
CC = gcc  
CFLAGS =-W -Wall -ansi -pedantic -D\_REENTRANT -std=c99  
LDFLAGS=-lcrypt  
RM = rm -f  
ECHO = echo

all: $(BIN) clean

clean:  
@$(ECHO) Effacement des fichiers temporaires.  
${RM} $(OBJS) \*.c~ a.out Makefile~ \*~ _.save include/_~

.c.o:  
$(CC) $(CFLAGS) -c $\<

$(BIN): $(OBJS)  
$(CC) $(LINKOBJET) -o $(BIN) $(LDFLAGS)

je sais pas si je suis suffisament clair sur le sujet…

merci d’avance.

---

<div class="post-metadata">

**Author:** ![dmon](https://www.debian-fr.org/user_avatar/www.debian-fr.org/dmon/32/5587_2.png) [@dmon](https://www.debian-fr.org/u/dmon)\
**Post date:** [Février 20, 2016, 6:06 UTC](https://www.debian-fr.org/t/compilation-fichier-c-et-h-dans-un-makefile/15304/2 "2016-02-20T18:06:02Z")

</div>

`$ make`Et ça compile.  
Maintenant s’il y s des erreurs envoie les nous et on te dira si ça vient du Makefile, de tes sources, ou de ta configuration. De même que le résultat de la commande ls pouvoir les fichiers qu’il a pu générer.

[Compilation séparée et Make](http://www.april.org/groupes/doc/make/make.html)

---

<div class="post-metadata">

**Author:** ![Kriss](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/k/e56c9b/32.png) [@Kriss](https://www.debian-fr.org/u/Kriss)\
**Post date:** [Février 20, 2016, 6:06 UTC](https://www.debian-fr.org/t/compilation-fichier-c-et-h-dans-un-makefile/15304/3 "2016-02-20T18:06:04Z")

</div>

nan mais mon make compile bien le programme mais cela mais arrivé de voir des makefile qui son écrit comme cela :

main.o: main.c main.h  
$(CC) $(FLAGS) main.c

et je me demande a quoi sert le fichier main.h dans la procédure.

---

<div class="post-metadata">

**Author:** ![mattotop](https://www.debian-fr.org/user_avatar/www.debian-fr.org/mattotop/32/3942_2.png) [@mattotop](https://www.debian-fr.org/u/mattotop)\
**Post date:** [Février 20, 2016, 6:06 UTC](https://www.debian-fr.org/t/compilation-fichier-c-et-h-dans-un-makefile/15304/4 "2016-02-20T18:06:04Z")

</div>

le main.h qui apparait comme dépendance de construction de main.o signifie juste que main.o doit être reconstruit si main.h a été modifié. Ce qui est à droite des : dans la définition d’une cible de make correspond aux fichiers dont la modification doit provoquer la recompilation.

Mais ta mêmoire doit être approximative, car c’est à priori une idotie dans le cas général (ou une hérésie dans la manière de nommer les fichiers), parcequ’un .o ne dépend pas normalement de son .h, et que make sait détecter seul les .h dont un .o dépend.

---

<div class="post-metadata">

**Author:** ![Kriss](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/k/e56c9b/32.png) [@Kriss](https://www.debian-fr.org/u/Kriss)\
**Post date:** [Février 20, 2016, 6:06 UTC](https://www.debian-fr.org/t/compilation-fichier-c-et-h-dans-un-makefile/15304/5 "2016-02-20T18:06:05Z")

</div>

merci pour cette explication précise. Enfaite dans mon projet j’ai un dossier pour les .h et le reste des .c son dans le répertoire courant et quand je mettais en include dans mon fichier .c " #include “…/main.h” " lors du make la console me disait qui ne trouvé pas “…/main.h” mais quand je met " #include “headers/main.h” (headers est le répertoire ou je met les .h)" la il le trouve, alors je croyais que inclure dans le makefile le .h avec le .c et .o ensemble aurais pu changer ça mais apparament non…

---

<div class="post-metadata">

**Author:** ![mattotop](https://www.debian-fr.org/user_avatar/www.debian-fr.org/mattotop/32/3942_2.png) [@mattotop](https://www.debian-fr.org/u/mattotop)\
**Post date:** [Février 20, 2016, 6:06 UTC](https://www.debian-fr.org/t/compilation-fichier-c-et-h-dans-un-makefile/15304/6 "2016-02-20T18:06:05Z")

</div>

Clairement non: l’interprétation des directives de préprocesseur dans ton code n’a rien à voir avec ce que tu mets dans ton makefile. La preuve, c’est que tu peux compiler toi même étape par étape (ou provoquer les mêmes erreurs si ton code est pourri) sans utiliser de makefile. Le makefile est juste une description des conditions+méthodes nécessaires à une recompilation automatique de ton projet qui sert à make pour (en gros) lancer les bonnes commandes “cc …”.  
Par contre, tu peux mettre dans ton makefile des paramètres pour cc, genre CFLAGS=-I headers/, et faire des #include “truc.h”, il les trouvera au moment de la compil par la manière d’appeler cc.

Mais c’est totalement anormal d’avoir un main.h, c’est plutot le main.c qui fait appel aux .h des autres .o que tu linke avec, théoriquement.

---

<div class="post-metadata">

**Author:** ![Kriss](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/k/e56c9b/32.png) [@Kriss](https://www.debian-fr.org/u/Kriss)\
**Post date:** [Février 20, 2016, 6:06 UTC](https://www.debian-fr.org/t/compilation-fichier-c-et-h-dans-un-makefile/15304/7 "2016-02-20T18:06:06Z")

</div>

j’en apprend des choses didonc. Merci en tout cas pour tes réponses et tes explications détaillés.

passe une bonne soirée, enfin plutot une bonne nuit 🙂

---

<div class="post-metadata">

**Author:** ![kna](https://www.debian-fr.org/user_avatar/www.debian-fr.org/kna/32/5623_2.png) [@kna](https://www.debian-fr.org/u/kna)\
**Post date:** [Février 20, 2016, 6:06 UTC](https://www.debian-fr.org/t/compilation-fichier-c-et-h-dans-un-makefile/15304/8 "2016-02-20T18:06:28Z")

</div>

J’ai fait un tuto là dessus si ca t’interesse :  
[http://www.siteduzero.com/tutoriel-3-31992-compilez-sous-gnu-linux.html](http://www.siteduzero.com/tutoriel-3-31992-compilez-sous-gnu-linux.html)

---

<div class="post-metadata">

**Author:** ![Kriss](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/k/e56c9b/32.png) [@Kriss](https://www.debian-fr.org/u/Kriss)\
**Post date:** [Février 20, 2016, 6:06 UTC](https://www.debian-fr.org/t/compilation-fichier-c-et-h-dans-un-makefile/15304/9 "2016-02-20T18:06:44Z")

</div>

pas mal ton lien, trés bien expliqué. Merci.

---

<div class="post-metadata">

**Author:** ![Kriss](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/k/e56c9b/32.png) [@Kriss](https://www.debian-fr.org/u/Kriss)\
**Post date:** [Février 20, 2016, 6:06 UTC](https://www.debian-fr.org/t/compilation-fichier-c-et-h-dans-un-makefile/15304/10 "2016-02-20T18:06:45Z")

</div>

parcontre je ne comprend pas quelque chose dans ton tuto. A propos des biblio dynamic pk utiliser le patch pour utiliser la biblio alors que on peut tout simplement l’appler avec dlopen() ?

---

<div class="post-metadata">

**Author:** ![kna](https://www.debian-fr.org/user_avatar/www.debian-fr.org/kna/32/5623_2.png) [@kna](https://www.debian-fr.org/u/kna)\
**Post date:** [Février 20, 2016, 6:06 UTC](https://www.debian-fr.org/t/compilation-fichier-c-et-h-dans-un-makefile/15304/11 "2016-02-20T18:06:46Z")

</div>

Tout simplement : je ne connais pas dlopen !  
Mais les grands esprits se rencontrent : d’après le man, si la biblio passé en argument n’est pas un chemin absolu, dlopen recherche dans les mêmes chemins que ldconfig : /lib, /usr/lib, les chemins indiqués dans /etc/ld.so.conf et LD\_LIBRARY\_PATH !

Mais du coup je parlerais sûrement de dlopen quand je remanierai le tuto…

---

<div class="post-metadata">

**Author:** ![Kriss](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/k/e56c9b/32.png) [@Kriss](https://www.debian-fr.org/u/Kriss)\
**Post date:** [Février 20, 2016, 6:07 UTC](https://www.debian-fr.org/t/compilation-fichier-c-et-h-dans-un-makefile/15304/12 "2016-02-20T18:07:01Z")

</div>

enfaite dans ton tuto tu intégres directement la lib dans l’executable, Donc il n’y a pas besoin de l’appler par la suite. Donc tu évite le dlopen, Ce qui est une bonne idée faut dire.

en tout cas je conseille le tuto a tous!

Cordialement.

---

<div class="post-metadata">

**Author:** ![kna](https://www.debian-fr.org/user_avatar/www.debian-fr.org/kna/32/5623_2.png) [@kna](https://www.debian-fr.org/u/kna)\
**Post date:** [Février 20, 2016, 6:09 UTC](https://www.debian-fr.org/t/compilation-fichier-c-et-h-dans-un-makefile/15304/13 "2016-02-20T18:09:58Z")

</div>

Ouaip, et puis j’évite de rentrer dans le code, vu que les Makefiles peuvent être utilisés avec des langages différents…

Il s’avère qu’un membre du même site s’apprete à rédiger un tuto sur les autotools et la création de paquet debian. Je remanierai de façon à ce qu’on ait une certaine cohérence.

Donc on fera un “gros” tuto super complet. Comprenant gcc, makefiles, autotools, .deb et je vais peut être m’attaquer aux .tgz (slackware) aussi. Avec des petits TPs-exemples et tout…

Sûrement que j’en reparlerais dans ce forum quand il sera fini, histoire de recueillir vos commentaires.

Enfin, tel que c’est parti, c’est pas pour demain non plus…
