Tôi đang cố gắng viết một tệp Makefile với các tệp nguồn và đối tượng được tách riêng và tôi dường như không tìm ra cách thích hợp để thực hiện việc này. Tôi có hai phương pháp làm việc nhưng tôi hy vọng một người nào đó có thể chỉ cách "đúng" để làm điều này.Phương pháp thích hợp cho các mục tiêu ký tự đại diện trong GNU Hãy
Dự án của tôi được tách thành một thư mục src
và obj
với Makefile ở cùng cấp như vậy.
Phương pháp đầu tiên sử dụng hàm ký tự đại diện để tìm tệp nguồn trong src
sau đó sử dụng thay thế văn bản để xác định tệp đối tượng tương ứng.
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)
Điều này dường như hoạt động, tuy nhiên, mỗi lần tôi chạy make prog
nó biên dịch lại tất cả các tệp đối tượng. Biến số OBJ
phải có src/
trước tất cả các đối tượng hoặc nếu không tôi sẽ nhận được "không có quy tắc để thực hiện mục tiêu". Về mặt cộng, tôi có thể dễ dàng sử dụng patsubst trong mục tiêu prog
để chỉ định các tệp đối tượng.
Phương pháp thứ hai cũng tương tự nhưng sử dụng vpaths và văn bản thay thế trên OBJ
biến:
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)
này giúp loại bỏ các biên dịch lại các tập tin đối tượng, nhưng đòi hỏi tôi phải thêm một biến POJB
cho mục tiêu prog
(kể từ khi tôi không thể làm bất kỳ patsubst trên chỉ là các tập tin đối tượng mà không có một người thừa kế).
Cả hai phương pháp đều hoạt động và mỗi phương pháp đều có ưu điểm so với phương pháp khác nhưng phương pháp nào là phương pháp "đúng" và nếu không, cách thích hợp để đạt được loại tòa nhà này là gì?
'SRC = $ (wildcard src/**/cpp *.) 'Cho mã nguồn ngồi trong thư mục con của' src' – checksum