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é.
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.