web-dev-qa-db-fra.com

Comment créer un fichier Make simple pour gcc sous Linux?

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.

119
user69514

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! :)

187
Joey Adams

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

24
Viliam
all: program
program.o: program.h headers.h

est assez. le reste est implicite

13
anonymous

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
9
Indrakumar

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.

0
ThomasS