J'ai trois fichiers: program.c
, program.h
et headers.h
.
program.c
inclut program.h
et headers.h
.
J'ai besoin de compiler ceci sur Linux en utilisant le compilateur gcc. Je ne sais pas comment faire ça. Netbeans en a créé un pour moi, mais c'est vide.
Intéressant, je ne savais pas que make utiliserait par défaut le compilateur C avec des règles concernant les fichiers source.
Quoi qu'il en soit, une solution simple qui illustre les concepts simples de Makefile serait:
HEADERS = program.h headers.h
default: program
program.o: program.c $(HEADERS)
gcc -c program.c -o program.o
program: program.o
gcc program.o -o program
clean:
-rm -f program.o
-rm -f program
(rappelez-vous que make requiert des tabulations au lieu de l'indentation d'espace, veillez donc à corriger cela lors de la copie)
Toutefois, pour prendre en charge davantage de fichiers C, vous devez créer de nouvelles règles pour chacun d’eux. Ainsi, pour améliorer:
HEADERS = program.h headers.h
OBJECTS = program.o
default: program
%.o: %.c $(HEADERS)
gcc -c $< -o $@
program: $(OBJECTS)
gcc $(OBJECTS) -o $@
clean:
-rm -f $(OBJECTS)
-rm -f program
J'ai essayé de rendre cela aussi simple que possible en omettant des variables telles que $ (CC) et $ (CFLAGS) qui sont généralement visibles dans les makefiles. Si cela vous intéresse, j'espère vous avoir donné un bon départ.
Voici le Makefile que j'aime utiliser pour la source C. Sentez-vous libre de l'utiliser:
TARGET = prog
LIBS = -lm
CC = gcc
CFLAGS = -g -Wall
.PHONY: default all clean
default: $(TARGET)
all: default
OBJECTS = $(patsubst %.c, %.o, $(wildcard *.c))
HEADERS = $(wildcard *.h)
%.o: %.c $(HEADERS)
$(CC) $(CFLAGS) -c $< -o $@
.PRECIOUS: $(TARGET) $(OBJECTS)
$(TARGET): $(OBJECTS)
$(CC) $(OBJECTS) -Wall $(LIBS) -o $@
clean:
-rm -f *.o
-rm -f $(TARGET)
Il utilise les fonctionnalités génériques et patsubst de l'utilitaire make pour inclure automatiquement les fichiers .c et .h dans le répertoire en cours, ce qui signifie que lorsque vous ajoutez de nouveaux fichiers de code à votre répertoire, vous n'avez pas à mettre à jour le fichier Makefile. Toutefois, si vous souhaitez modifier le nom de l'exécutable généré, des bibliothèques ou des indicateurs de compilateur, vous pouvez simplement modifier les variables.
Dans les deux cas, n'utilisez pas autoconf, s'il vous plaît. Je t'en supplie! :)
Par exemple, ce Makefile simple devrait suffire:
CC = gcc CFLAGS = -Wall Tout: programme Programme: programme.o Programme.o: programme .c programme.h en-têtes.h clean: rm -f programme program.o exécuter: programme ./programme
Notez qu'il doit y avoir <tab>
sur la ligne suivante après clean et run, pas d'espaces.
UPDATE Commentaires ci-dessous appliqués
all: program
program.o: program.h headers.h
est assez. le reste est implicite
Le fichier le plus simple peut être
all : test
test : test.o
gcc -o test test.o
test.o : test.c
gcc -c test.c
clean :
rm test *.o
En fonction du nombre d'en-têtes et de vos habitudes de développement, vous pouvez explorer gccmakedep. Ce programme examine votre répertoire actuel et ajoute à la fin du makefile les dépendances d'en-tête pour chaque fichier .c/cpp. C'est exagéré lorsque vous avez 2 en-têtes et un fichier de programme. Toutefois, si vous avez plus de 5 petits programmes de test et que vous modifiez l’un des 10 en-têtes, vous pouvez alors faire confiance pour reconstruire exactement les programmes qui ont été modifiés par vos modifications.