Mon répertoire de projet ressemble à ceci:
/project
Makefile
main
/src
main.cpp
foo.cpp
foo.h
bar.cpp
bar.h
/obj
main.o
foo.o
bar.o
Ce que je voudrais que mon makefile fasse serait de compiler tous les .cpp
fichiers du /src
dossier vers des .o
fichiers du /obj
dossier, puis de lier tous les .o
fichiers /obj
dans le binaire de sortie dans le dossier de niveau supérieur /project
.
Je n'ai pratiquement aucune expérience avec Makefiles, et je ne sais pas vraiment quoi rechercher pour y parvenir.
Est-ce également une «bonne» façon de faire cela, ou y a-t-il une approche plus standard de ce que j'essaie de faire?
c++
build-process
makefile
Austin Hyde
la source
la source
Réponses:
Makefile partie de la question
C'est assez facile, sauf si vous n'avez pas besoin de généraliser, essayez quelque chose comme le code ci-dessous (mais remplacez l'indentation de l'espace par des tabulations près de g ++)
Génération automatique de graphiques de dépendances
Une fonctionnalité "incontournable" pour la plupart des systèmes de marque. Avec GCC in peut être fait en une seule passe comme effet secondaire de la compilation en ajoutant un
-MMD
drapeau àCXXFLAGS
et-include $(OBJ_FILES:.o=.d)
à la fin du corps du makefile:Et comme les gars l'ont déjà mentionné, ayez toujours GNU Make Manual à portée de main , c'est très utile.
la source
OBJ_FILES = $(patsubst src/%.cpp,obj/%.o,$(CPP_FILES))
.$<
devrait être$^
pour la règle de main.exe et je pense qu'il y a une faute de frappe avecobj/%.o: src/%cpp
.make: *** No rule to make target '/main.o', needed by 'bin/main'. Pare.
Wildcard fonctionne aussi pour moi, mais je voudrais donner une note latérale pour ceux qui utilisent des variables de répertoire. Utilisez toujours la barre oblique pour l'arborescence des dossiers (pas la barre oblique inverse), sinon cela échouera:
la source