2012-08-14 22 views
14

Là một phần của makefile, tôi muốn tạo phiên bản gỡ lỗi hoặc phát hành của đích.Đặt cảnh báo tệp, ghi đè các lệnh cho mục tiêu

Về mặt chức năng, tất cả mọi thứ đang làm việc Tuy nhiên, tôi đang nhận được cảnh báo khi chạy làm

12 SRC := $(shell echo src/*.cpp) 
13 SRC += $(shell echo $(TEST_ROOT)/*.cpp) 
14 
15 D_OBJECTS = $(SRC:.cpp=.o)  # same objects will need to be built differently 
16 R_OBJECTS = $(SRC:.cpp=.o)  # same objects will need to be built differently 

22 all: $(TARGET) 
23 
25 $(TARGET): $(D_OBJECTS) 
26 $(CC) $(D_OBJECTS) -o $(TARGET) 
27 
28 $(D_OBJECTS) : %.o: %.cpp      # ----- run with debug flags 
29 $(CC) $(COMMON_FLAGS) $(DEBUG_FLAGS) -c $< -o [email protected] 
30 
31 release: $(R_OBJECTS) 
32 $(CC) $(R_OBJECTS) -o $(TARGET) 
33 
34 $(R_OBJECTS) : %.o: %.cpp      # ----- run with release flags 
35 $(CC) $(COMMON_FLAGS) $(RELEASE_FLAGS) -c $< -o [email protected] 

Khi tôi make tôi nhận được phiên bản debug, khi tôi make release tôi nhận được phiên bản phát hành.

Nhưng tôi cũng nhận được cảnh báo:

Makefile:35: warning: overriding commands for target `src/Timer.o' 
Makefile:29: warning: ignoring old commands for target `src/Timer.o' 
Makefile:35: warning: overriding commands for target `test/TimerTest.o' 
Makefile:29: warning: ignoring old commands for target `test/TimerTest.o' 

Với điều này 2 câu hỏi:

  1. Bất kỳ cách nào để bỏ qua những lời cảnh báo
  2. Am i làm điều đúng? Cần thay đổi gì?

Trả lời

10

Một trong những cách phổ biến nhất để thực hiện việc này là đặt các đối tượng phát hành và các đối tượng gỡ lỗi vào các thư mục con riêng biệt. Bằng cách đó bạn không nhận được định nghĩa lại cho các quy tắc cho một đối tượng, vì chúng sẽ có các tên khác nhau. Một cái gì đó như thế này:

D_OBJECTS=$(SRC:%.cpp=debug/%.o) 
R_OBJECTS=$(SRC:%.cpp=release/%.o) 

RTARGET = a.out 
DTARGET = a.out.debug 

all : dirs $(RTARGET) 

debug : dirs $(DTARGET) 

dirs : 
    @mkdir -p debug release 

debug/%.o : %.c 
    $(CC) $(DEBUG_CFLAGS) -o [email protected] -c $< 

release/%.o : %.c 
    $(CC) $(RELEASE_CFLAGS) -o [email protected] -c $< 

$(DTARGET) : $(D_OBJECTS) 
    $(CC) $(DEBUG_CFLAGS) -o [email protected] $(D_OBJECTS) 

$(RTARGET) : $(R_OBJECTS) 
    $(CC) $(RELEASE_CFLAGS) -o [email protected] $(R_OBJECTS) 
+1

Bạn có biết cách thực hiện điều đó trong netbeans tự động tạo Makefile không? –

+0

hoặc tạo thư viện nếu bạn có cùng mã cho nhiều tệp nhị phân – baptx

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