有趣的是,我不知道 make 会默认使用 C 编译器给定有关源文件的规则。
无论如何,演示简单 Makefile 概念的简单解决方案是:
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
(请记住,make 需要制表符而不是空格缩进,因此请务必在复制时修复该问题)
但是,要支持更多 C 文件,您必须为每个文件制定新规则。因此,要改进:
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
我试图通过省略通常在 makefile 中看到的 $(CC) 和 $(CFLAGS) 等变量来尽可能简单地做到这一点。如果您有兴趣弄清楚这一点,我希望我已经为您提供了一个良好的开端。
这是我喜欢用于 C 源代码的 Makefile。随意使用它:
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)
它使用 make 实用程序的通配符和 patsubst 功能在当前目录中自动包含 .c 和 .h 文件,这意味着当您向目录中添加新代码文件时,您无需更新 Makefile。但是,如果要更改生成的可执行文件、库或编译器标志的名称,只需修改变量即可。
在任何一种情况下,请不要使用 autoconf。我求你! :)