Biểu tượng% trong Makefile có nghĩa là gì


10

Tôi đang chơi xung quanh với makefiles và tôi đã bắt gặp % .o hoặc % .c . Từ những gì tôi hiểu, nó chỉ định tất cả các tập tin c hoặc o . Nhưng tại sao điều này hoạt động:

%.o: %.c
        $(CC) -c $^  -o $@  

và điều này không hoạt động

SOURCE := $(wildcard *.c)

$(SOURCE:.c=.o): SOURCE
        $(CC) -c $^  -o $@

Cả hai biểu thức chỉ định tất cả các tập tin. Vì vậy, % .o: biểu tượng trong tập tin làm gì?

Câu trả lời:


9

Cả hai biểu thức chỉ định tất cả các tập tin.

Không, quy tắc đầu tiên cho biết makelàm thế nào để có được một .otập tin cho .ctập tin tương ứng . Lưu ý số ít: một tập tin duy nhất.

Quy tắc thứ hai (yêu cầu) cho biết makelàm thế nào để có được một loạt các .otệp, được cung cấp một loạt các .ctệp tương ứng . Lưu ý số nhiều: tất cả .ccác tập tin kết quả từ *.cGlobing.

Trên một lưu ý phụ, %.o: %clà một phần mở rộng GNU.

Mặt khác, bạn sẽ không học cách sử dụng maketrên StackOverflow. Bạn nên xem xét việc đọc một cuốn sách thay thế.


11

Xay dung:

%.o: %.c
        $(CC) -c $^  -o $@  

là một quy tắc mẫu , là một loại quy tắc ngầm. Nó chỉ định một mục tiêu và một phụ thuộc và gây ra một lệnh gọi $(CC)cho mỗi mục tiêu. Trong khi điều này:

SOURCE := $(wildcard *.c)

$(SOURCE:.c=.o): SOURCE
        $(CC) -c $^  -o $@

là một quy tắc chuẩn nhưng nó có (có thể) nhiều mục tiêu và nhiều phụ thuộc. Tuy nhiên, đối với tất cả điều đó, nó sẽ chỉ gọi $(CC)một lần.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.