2012-12-25 27 views
17

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 srcobj 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ì?

Trả lời

19

ví dụ đầu tiên của bạn là gần như có:

SRC = $(wildcard src/*.cpp) 
OBJ = $(patsubst src/%.cpp, obj/%.o, $(SRC)) 

prog: $(OBJ) 
    $(CC) $(CFLAGS) $(LDFLAGS) $(LIBS) $(OBJ) -o prog 

obj/%.o: src/%.cpp 
    $(CC) $(CFLAGS) -c $< -o [email protected] 
+1

'SRC = $ (wildcard src/**/cpp *.) 'Cho mã nguồn ngồi trong thư mục con của' src' – checksum

Các vấn đề liên quan