Ich versuche, ein Makefile mit meiner Quelle und Objektdateien getrennt zu schreiben, und ich kann nicht scheinen, den richtigen Weg, um dies zu erreichen. Ich habe zwei Methoden, die funktionieren, aber ich hoffe, dass jemand den "richtigen" Weg zeigen kann, dies zu tun.Richtige Methode für Wildcard-Ziele in GNU Make
Mein Projekt ist in einem src
und obj
Ordner mit dem Makefile auf dem gleichen Niveau wie diese getrennt.
Die erste Methode verwendet die Wildcard-Funktion, um die Quelldateien in src
zu finden, und verwendet dann Textersetzung, um die entsprechenden Objektdateien zu bestimmen.
SRC = $(wildcard src/*.cpp)
OBJ = $(SRC:.cpp=.o)
prog: $(OBJ)
$(CC) $(CFLAGS) $(LDFLAGS) $(LIBS) -o prog $(patsubst src/,obj/,$(OBJ))
%.o: %.cpp
$(CC) $(CFLAGS) -c $< -o $(COMPILE)/$(@F)
Dies scheint jedoch zu arbeiten, jedes Mal wenn ich make prog
laufen sie alle Objektdateien neu kompiliert. Die OBJ
Variable muss die src/
vor allen Objekten haben, sonst bekomme ich die "no rule to make target". Auf der positiven Seite kann ich einfach die patsubst im prog
Ziel verwenden, um die Objektdateien anzugeben.
Die zweite Methode ist ähnlich, aber verwendet vpaths und Ersetzen von Text auf den OBJ
Variable:
vpath = %.cpp src
vpath = %.o obj
SRC = $(wildcard src/*.cpp)
OBJ = $(subst src/,,$(SRC:.cpp=.o))
POBJ = $(patsubst src/,obj/$(SRC:.cpp=.o))
prog: $(OBJ)
$(CC) $(CFLAGS) $(LDFLAGS) $(LIBS) -o prog $(POBJ)
%.o: %.cpp
$(CC) $(CFLAGS) -c $< -o $(COMPILE)/$(@F)
Das die Neukompilierung von Objektdateien beseitigt, erfordert aber mich eine andere Variable POJB
für das prog
Ziel hinzuzufügen (da ich kann keinen patsubst nur auf den Objektdateien ohne basedir durchführen).
Beide Methoden funktionieren und jede hat ihre Vorteile gegenüber der anderen, aber welche ist der "richtige" Ansatz und wenn keine, was ist der richtige Weg, um diese Art von Gebäude zu erreichen?
'SRC = $ (. Wildcard src/**/* CPP)' für die Code-Quelle im Unterverzeichnis von 'src' sitzen – checksum