Compilation fichier .c et .h dans un Makefile

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.

$ makeEt ç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

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.

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.

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…

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.

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 :slightly_smiling:

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

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

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() ?

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…

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.

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…