web-dev-qa-db-fra.com

Makefile: compile automatiquement tous les fichiers c, en gardant les fichiers .o dans un dossier séparé

Ce que j'ai, c'est un répertoire avec 3 sous-répertoires. src/pour les fichiers .c et .h, bin/où l'exécutable compilé est censé aller et obj/où je veux que les fichiers .obj aillent.

Maintenant, je veux que le makefile compile tous les fichiers .c de src (sans que je doive tous les lister dans le makefile) et place les fichiers .o dans obj et l'exécutable construit à partir de foo.c enregistré sous bin/foo.

Est-ce que quelqu'un peut m'aider? Chaque fois que j'utilise des caractères génériques, make se plaint de l'absence de règles et lorsque j'utilise des règles implicites, il ne place pas les fichiers objets dans un dossier séparé.

11
Max

Construire foo.o de foo.c, localement:

foo.o: foo.c
    $(CC) -c $< -o $@

Pour faire de même, mais avec tous les fichiers d'en-tête nécessaires dans src/:

SRC := src

foo.o: foo.c
    $(CC) -I$(SRC) -c $< -o $@

Pour faire de même, mais avec le fichier source dans src/:

SRC := src

foo.o: $(SRC)/foo.c
    $(CC) -I$(SRC) -c $< -o $@

Pour ce faire, mais placez le fichier objet dans obj/:

SRC := src
OBJ := obj

$(OBJ)/foo.o: $(SRC)/foo.c
    $(CC) -I$(SRC) -c $< -o $@

Une règle de modèle qui le fera pour n'importe quel fichier objet (obj/foo.o, obj/bar.o, ...):

SRC := src
OBJ := obj

$(OBJ)/%.o: $(SRC)/%.c
    $(CC) -I$(SRC) -c $< -o $@

Pour créer la liste des objets souhaités:

SOURCES := $(wildcard $(SRC)/*.c)
OBJECTS := $(patsubst $(SRC)/%.c, $(OBJ)/%.o, $(SOURCES))

Et une règle pour les couvrir tous:

all: $(OBJECTS)

Tout mettre ensemble:

SRC := src
OBJ := obj

SOURCES := $(wildcard $(SRC)/*.c)
OBJECTS := $(patsubst $(SRC)/%.c, $(OBJ)/%.o, $(SOURCES))

all: $(OBJECTS)
    $(CC) $^ -o $@

$(OBJ)/%.o: $(SRC)/%.c
    $(CC) -I$(SRC) -c $< -o $@

Notez que cela a un gros défaut: is ne suit pas les dépendances sur les fichiers d'en-tête. Cela peut être fait automatiquement, mais c'est une astuce subtile; il peut attendre que vous maîtrisiez autant.

25
Beta