Ich versuche ein einfaches Makefile zu erstellen, um ein einfaches Projekt zu erstellen, das nicht zu schwer zu pflegen ist.Makefile Mustererkennung funktioniert nicht so wie ich es erwartet habe
Ich möchte Muster-Matching-Regeln verwenden, z. %.o : %.c ; g++ ...
wo ich alle Objektdateien habe, die ich kompilieren möchte, abgeleitet von Wildcard-Matched-Quelldateien.
Die Verzeichnisstruktur ist
./src
./include
./build/bin
./build/objs
Gerade jetzt mein Problem sieht ungefähr so aus.
INCL_DIR = ./include
SRC_DIR = ./src
BUILD_DIR = ./build
BIN_DIR = $(BUILD_DIR)/bin
OBJ_DIR = $(BUILD_DIR)/objs
SRCS = $(notdir $(wildcard $(SRC_DIR)/*.cc))
OBJS = $(addprefix $(OBJ_DIR)/, $(SRCS:%.cc=%.o))
$(BIN_DIR)/program : $(OBJS)
$(CXX) $(CXXFLAGS) -I $(INCL_DIR) $^ -o [email protected]
$(OBJS):%.o : %.cc
$(CXX) $(CXXFLAGS) -I $(INCL_DIR) -c $< -o [email protected]
In der Zeile $(OBJS):%.o : %.cc
ein Beispiel Erweiterung von Ziel Regel würde ./build/objs/a.o
, die Datei ist in ./src/a.cc
auf ./build/objs/a.cc
aber die Quelle abhängt.
Also dachte ich, ich könnte das Abhängigkeitsformat wegstreifen, um zu versuchen, ./src/a.cc
zu entsprechen, aber die Utilities für Textmanipulationen scheinen nicht auf der Abhängigkeitsseite einer Regel zu arbeiten.
Ich habe versucht, so etwas wie
$(OBJS):%.o : $(SRC_DIR)/$(notdir %.cc)
oder
$(OBJS):%.o : $(SRC_DIR)/$(*F).cc
wo $(*F)
-a
in dem früheren Beispiel Fall erweitern würde, aber es dehnt sich nicht auf etwas, wenn sie als Abhängigkeit aufgeführt.
Ich habe keine Erfahrung mit Makefiles und bin mir nicht sicher, warum meine Versuche nicht funktionieren und würde gerne eine Lösung hören, die mein Problem lösen könnte.
Danke.
Wenn ich verstehe, was Sie fragen, was mir nicht ganz klar ist, können Sie die Pattern-Matching-Regeln nicht wirklich verwenden - Sie müssen die integrierten String-Manipulationsfunktionen verwenden, um Listen von Abhängigkeiten zu erstellen. Ich habe ein paar Artikel über generische Makefiles unter https://latedev.wordpress.com/2014/11/08/generic-makefiles-with-gcc-and-gnu-make/, die helfen können oder nicht. –
Suchen Sie nach etwas wie: '$ (OBJ_DIR) /%. O: $ (SRC_DIR) /%. C'? – blackghost
@John Ich glaube, das würde zu './build/test.o: ./src/./ build/test.cc' expandieren, sollte aber von'./Src/test.cc' abhängig sein. Außerdem würde ich '$ (OBJS) /%. O: ...' bevorzugen, weil ich vielleicht Dateien in weiteren verschachtelten Verzeichnissen in OBJS hinzufügen möchte. – jezzi23