2010-04-18 36 views
12

My Makefile là:làm luôn xây dựng lại

OBJS = b.o c.o a.o 
FLAGS = -Wall -Werror 
CC = gcc 

test: $(OBJS) 
    $(CC) $(FLAGS) $(OBJS) -o test 
b.o: b.c b.h 
    $(CC) $(FLAGS) -c b.c 
a.o: a.c b.h c.h 
    $(CC) $(FLAGS) -c a.c 
c.o: c.c c.h 
    $(CC) $(FLAGS) -c c.c 
clean: 
    rm a 
    rm *.o 
all: test 

Nếu tôi làm make sau đó make một lần nữa, nó luôn luôn tái thiết 'test'. tại sao nó làm vậy?

Thậm chí nếu tôi làm: make a.o nó giúp rebuild ... Im trên linux nếu giúp.

Trong cửa sổ nếu tôi thay đổi 'test' của 'test.exe' và 'test -o' bằng '-o test.exe', nó hoạt động tốt. Vì vậy, tôi đoán rằng đối với một số lý do 'làm' trong linux của tôi không thể kiểm tra các datestamps của các tập tin của tôi trong thư mục.

tôi FIXED IT! .c được tạo trong Windows. Tôi mở tất cả .c và .h trong vi, và không làm gì cứu được những thay đổi, và tất cả đều hiệu quả. Tôi nghĩ rằng điều datestamp đã được cố định làm điều này.

+0

Bạn có thể làm việc trong trường hợp thử nghiệm đơn giản hơn không? (Chẳng hạn như ít tệp hơn, có lẽ là chương trình kiểu hello-world, vì vậy bạn có thể bao gồm mọi thứ trong câu hỏi.) Bạn đã thay đổi cách quy tắc * test * hoạt động trong bản chỉnh sửa gần đây và tôi nghi ngờ có sự khác biệt đáng kể khác từ những gì đã được đăng. –

+0

Tôi nghĩ rằng vấn đề của nó là linux. Nếu trong đó makefile tôi thay đổi 'thử nghiệm' bởi 'text.exe' và trong quy tắc của nó '-o text.exe', nó hoạt động tốt. – fsdfa

+0

Cũng giống như một sang một bên, bạn có lẽ không nên gọi thực thi 'thử nghiệm' của bạn. Hầu hết các UNIX đều có chương trình 'thử nghiệm' thực sự. – paxdiablo

Trả lời

14

Nguyên tắc đầu tiên của bạn là:

test: $(OBJS) 

Điều đó có nghĩa nếu một file có tên 'test' không tồn tại, sự cai trị nên chạy và tạo ra nó. Vì 'test' không bao giờ tồn tại (quy tắc đó không thực sự tạo ra một tệp có tên 'test'), nó chạy mỗi lần. Bạn nên thay đổi 'test' thành 'a', đầu ra thực tế của quy tắc đó

Để tham khảo sau này, nếu quy tắc không thực sự tạo điều ở bên trái, bạn nên đánh dấu nó bằng:

.PHONY: test 
+0

Xin lỗi, đó là lỗi đánh máy của tôi ..theo cách đó trong Makefile – fsdfa

2

Bạn cần phải xác định rằng kiểm tra là một phony target:

OBJS = b.o c.o a.o 
CFLAGS = -Wall -Werror 
CC = gcc 

.PHONY: all test clean 
# 'all' and 'clean' are also phony 

all: test 
test: a 

a: $(OBJS) 
    $(CC) $(CFLAGS) $(OBJS) -o a 

b.o: b.c b.h 
a.o: a.c b.h c.h 
c.o: c.c c.h 

clean: 
    rm a 
    rm *.o 

tôi đã đặt tất cả đầu tiên để nó là mục tiêu mặc định (đó là phổ biến), loại bỏ các lệnh cho biên soạn (chắc đã có những built-in), và thay đổi FLAGS-CFLAGS (đó là tên gọi chung cho cờ biên dịch C và sử dụng bởi các quy tắc built-in làm của).

+0

Nó tiếp tục xây dựng lại tất cả. – fsdfa

2

Như một phương sách cuối cùng bạn có thể chạy Make trong chế độ gỡ lỗi (chắc -d) và chải qua đầu ra. Trước khi cố gắng đó, tôi đề nghị bạn thêm một dòng vào "kiểm tra" quy tắc để xem nếu có bất kỳ điều kiện tiên quyết mà Hãy nghĩ đòi hỏi việc xây dựng lại thử nghiệm (và sử dụng một số biến tự động trong lệnh biên dịch, như một thói quen tốt).

test: $(OBJS) 
    @echo prereqs that are newer than test: $? 
    $(CC) $(FLAGS) $^ -o [email protected] 
Các vấn đề liên quan