Thật thú vị, tôi không biết make sẽ mặc định sử dụng trình biên dịch C đưa ra các quy tắc liên quan đến các tệp nguồn.
Dù sao, một giải pháp đơn giản thể hiện các khái niệm Makefile đơn giản sẽ là:
HEADERS = program.h headers.h
default: program
program.o: program.c $(HEADERS)
gcc -c program.c -o program.o
program: program.o
gcc program.o -o program
clean:
-rm -f program.o
-rm -f program
(lưu ý rằng thực hiện yêu cầu tab thay vì thụt lề không gian, vì vậy hãy chắc chắn khắc phục điều đó khi sao chép)
Tuy nhiên, để hỗ trợ nhiều tệp C hơn, bạn phải tạo quy tắc mới cho mỗi tệp. Do đó, để cải thiện:
HEADERS = program.h headers.h
OBJECTS = program.o
default: program
%.o: %.c $(HEADERS)
gcc -c $< -o $@
program: $(OBJECTS)
gcc $(OBJECTS) -o $@
clean:
-rm -f $(OBJECTS)
-rm -f program
Tôi đã cố gắng làm điều này đơn giản nhất có thể bằng cách bỏ qua các biến như $ (CC) và $ (CFLAGS) thường thấy trong tệp tạo tệp. Nếu bạn quan tâm đến việc tìm ra điều đó, tôi hy vọng tôi đã cho bạn một khởi đầu tốt về điều đó.
Đây là Makefile tôi muốn sử dụng cho nguồn C. Hãy sử dụng nó:
TARGET = prog
LIBS = -lm
CC = gcc
CFLAGS = -g -Wall
.PHONY: default all clean
default: $(TARGET)
all: default
OBJECTS = $(patsubst %.c, %.o, $(wildcard *.c))
HEADERS = $(wildcard *.h)
%.o: %.c $(HEADERS)
$(CC) $(CFLAGS) -c $< -o $@
.PRECIOUS: $(TARGET) $(OBJECTS)
$(TARGET): $(OBJECTS)
$(CC) $(OBJECTS) -Wall $(LIBS) -o $@
clean:
-rm -f *.o
-rm -f $(TARGET)
Nó sử dụng các tính năng ký tự đại diện và patsubst của tiện ích make để tự động bao gồm các tệp .c và .h trong thư mục hiện tại, nghĩa là khi bạn thêm các tệp mã mới vào thư mục của mình, bạn sẽ không phải cập nhật Makefile. Tuy nhiên, nếu bạn muốn thay đổi tên của các cờ thực thi, thư viện hoặc trình biên dịch được tạo, bạn chỉ có thể sửa đổi các biến.
Trong cả hai trường hợp, đừng sử dụng autoconf. Tôi đang cầu xin bạn! :)