Próbuję napisać plik Makefile z moimi plikami źródłowymi i obiektowymi oddzielonymi i nie mogę znaleźć właściwego sposobu, aby to osiągnąć. Mam dwie metody, które działają, ale mam nadzieję, że ktoś może wskazać "prawidłowy" sposób, aby to zrobić.Właściwa metoda dla obiektów wieloznacznych w GNU Make
Mój projekt jest podzielony na foldery src
i obj
z plikiem Makefile na tym samym poziomie, co te.
Pierwsza metoda używa funkcji wieloznacznej do znalezienia plików źródłowych w pliku src
, a następnie używa zastępowania tekstu do określenia odpowiednich plików obiektów.
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)
To wydaje się działać, jednak za każdym razem biegnę make prog
to recompiles wszystkich plików obiektowych. Zmienna OBJ
musi mieć przed wszystkimi obiektami obiekt src/
, inaczej otrzymam "brak reguły do wykonania celu". Na plus, mogę łatwo użyć patsubst w celu prog
, aby określić pliki obiektów.
Druga metoda jest podobna, ale wykorzystuje vpaths i tekst zastępczy na OBJ
zmiennej:
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)
Eliminuje to rekompilacji plików obiektowych, ale wymaga ode mnie, aby dodać kolejną zmienną POJB
za cel prog
(od I nie może zrobić żadnego patsubst na plikach obiektów bez bazodruku).
Obie metody działają, a każda ma swoje zalety w stosunku do drugiej, ale która z nich jest "poprawnym" podejściem, a jeśli nie, jaki jest właściwy sposób na osiągnięcie tego typu budynku?
'src = $ (. Wieloznaczny src/**/* cpp)' do kodu źródłowego siedzi w podkatalogu 'src' – checksum