Richtige Methode für Wildcard-Ziele in GNU Make

Ich versuche, ein Makefile mit getrennten Quell- und Objektdateien zu schreiben, und es scheint mir nicht möglich zu sein, den richtigen Weg zu finden, um dies zu erreichen. Ich habe zwei Methoden, die funktionieren, aber ich hoffe, dass jemand den "richtigen" Weg weisen kann, dies zu tun.

Mein Projekt ist in einesrc undobj Ordner mit dem Makefile auf der gleichen Ebene wie diese.

Die erste Methode verwendet die Platzhalterfunktion, um die Quelldateien in zu findensrc verwendet dann die 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 
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)  
lt; -o $(COMPILE)/$(@F)

Dies scheint jedoch jedes Mal zu funktionieren, wenn ich rennemake prog Es kompiliert alle Objektdateien neu. DasOBJ Variable muss die habensrc/ vor allen objekten sonst bekomme ich die "no rule to make target". Positiv zu vermerken ist, dass ich den patsubst in der leicht benutzen kannprog Ziel, um die Objektdateien anzugeben.

Die zweite Methode ist ähnlich, verwendet jedoch vpaths und das Ersetzen von Text auf derOBJ 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 
 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)  
lt; -o $(COMPILE)/$(@F)

Dadurch entfällt das erneute Kompilieren von Objektdateien, ich muss jedoch eine weitere Variable hinzufügenPOJB für dieprog target (da ich ohne basedir kein patsubst nur für die objektdateien machen kann).

Beide Methoden funktionieren und jede hat ihre Vorteile gegenüber der anderen, aber welche ist die "richtige" Herangehensweise und wenn keine, wie lässt sich diese Art von Gebäude am besten erreichen?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage