/ / Makefile générique ne montrant aucune règle pour faire l'erreur de cible - c ++, c, makefile

Makefile générique ne montrant aucune règle pour faire l'erreur de cible - c ++, c, makefile

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 par main.out. Arrêtez.

Réponses:

1 pour la réponse № 1

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