J'ai écrit un fichier makefile pour compiler et lier tous les fichiers de mon projet. À l'heure actuelle, je n'ai que 2 fichiers cpp: src/main.cpp
et src/DBEngine/benchmark/ssb/ssb_main.cpp
.
Mon contenu de makefile est:
CPP_FILES := $(wildcard src/*.cpp) $(wildcard src/DBEngine/benchmark/ssb/*.cpp)
OBJ_FILES := $(addprefix bin/obj/,$(notdir $(CPP_FILES:.cpp=.o)))
DEBUG_OBJ_FILES := $(addprefix bin/debug/,$(notdir $(CPP_FILES:.cpp=.o)))
CC_FLAGS := -I${PWD}
main.out: $(OBJ_FILES)
g++ -o $@ $(OBJ_FILES)
bin/obj/%.o: src/%.cpp
g++ -c -o $@ $< (CC_FLAGS) -w
Mais quand je fais un make, ça donne l'erreur:
make: *** Aucune règle à faire cible
bin/debug/ssb_main.o
, nécessaire parmain.out
. Arrêtez.
Réponses:
1 pour la réponse № 1Version abrégée: votre règle de modèle est développée comme suit pour les fichiers objet de DBEngine
bin/obj/ssb_main.o: src/ssb_main.cpp
Vous pouvez voir comment cela ne fonctionnera pas, je suis sûr.
Vous pouvez ajouter une autre règle de modèle pour résoudre ce problème.
bin/obj/%.o: src/DBEngine/benchmark/ssb/%.cpp
g++ -c -o $@ $< $(CC_FLAGS) -w
Une méthode plus simple consiste toutefois à mettre en miroir votre source, à créer des arbres et à utiliser vpath
, assurez-vous qu’il existe un répertoire appelé DBEngine/benchmark/ssb
dans le répertoire makefile également, et utilisez ce qui suit:
CPP_FILES := $(wildcard src/*.cpp) $(wildcard src/DBEngine/benchmark/ssb/*.cpp)
OBJ_FILES := $(CPP_FILES:src/%.cpp=%.o)
CPPFLAGS := -I${PWD}
CXXFLAGS := -w
vpath %.cpp src
main: $(OBJ_FILES)
Les règles intégrées gèrent le reste.
Notes de côté: -I${PWD}
est superflu, et -w
est généralement une mauvaise idée.
1 pour la réponse № 2
Dans la règle de compilation, vous avez spécifié que leles fichiers source sont dans le répertoire "src". Mais d'après votre description, il semble que le fichier ssb_main.cpp se trouve dans le dossier "src / DBEngine / benchmark / ssb /", donc faire ne trouve pas la dépendance pour compiler ssb_main.o.
Vous pouvez utiliser la variable VPATH pour spécifier les dossiers où make doit rechercher vos fichiers source.
0 pour la réponse № 3
Puisque vous avez un sous-dossier est votre dossier src, vous pouvez essayer d’utiliser
CPP_FILES := $(shell ls -pR ./src | grep -v /)
Il listera tous les fichiers cpp sous src et ses sous-dossiers à l’exclusion. et .. .