123 votes

Comment créer un fichier makefile simple pour gcc sur Linux ?

J'ai trois fichiers: program.c, program.h et headers.h.

program.c inclut program.h et headers.h.

Je dois compiler cela sur Linux en utilisant le compilateur gcc. Je ne suis pas sûr(e) comment faire. Netbeans en a créé un pour moi, mais il est vide.

187voto

Joey Adams Points 13049

Intéressant, je ne savais pas que make utiliserait par défaut le compilateur C en fonction des règles concernant les fichiers source.

Quoi qu'il en soit, une solution simple qui démontre 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

(gardez à l'esprit que make nécessite une indentation par tabulation au lieu d'espaces, assurez-vous de corriger cela en copiant)

Cependant, pour supporter plus de fichiers C, vous devriez 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 vues dans les Makefiles. Si vous êtes intéressé à comprendre cela, j'espère vous avoir donné un bon départ sur ce sujet.

Voici le Makefile que j'aime utiliser pour les sources C. N'hésitez pas à 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 wildcard et patsubst de l'utilitaire make pour inclure automatiquement les fichiers .c et .h dans le répertoire actuel, ce qui signifie que lorsque vous ajoutez de nouveaux fichiers de code à votre répertoire, vous n'aurez pas à mettre à jour le Makefile. Cependant, si vous souhaitez modifier le nom de l'exécutable généré, des bibliothèques ou des indicateurs de compilation, vous pouvez simplement modifier les variables.

En tout cas, ne utilisez pas autoconf, s'il vous plaît. Je vous en supplie! :)

25voto

Viliam Points 2219

Par exemple, ce Makefile simple devrait être suffisant :

CC=gcc
CFLAGS=-Wall

all: programme
programme: programme.o
programme.o: programme.c programme.h headers.h

clean:
    rm -f programme programme.o
run: programme
    ./programme

Notez qu'il doit y avoir sur la ligne suivante après "clean" et "run", pas d'espaces.

MISE À JOUR Commentaires ci-dessous appliqués

14voto

anonymous Points 121
tout : programme
programme.o : programme.h en-têtes.h

est suffisant. le reste est implicite

10voto

Indrakumar Points 21

Le fichier make le plus simple peut être

tout : test

test : test.o
        gcc -o test test.o 

test.o : test.c
        gcc -c test.c

nettoyer :
        rm test *.o

1voto

En fonction du nombre d'en-têtes et de vos habitudes de développement, vous souhaiterez peut-être enquêter sur gccmakedep. Ce programme examine votre répertoire actuel et ajoute à la fin du fichier make les dépendances d'en-tête pour chaque fichier .c/cpp. Cela est exagéré lorsque vous avez 2 en-têtes et un fichier de programme. Cependant, si vous avez 5+ petits programmes de test et que vous modifiez l'un des 10 en-têtes, vous pouvez alors faire confiance à make pour reconstruire exactement les programmes qui ont été modifiés par vos modifications.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X