要从foo.c构建foo.o,在本地:
foo.o: foo.c
$(CC) -c $< -o $@
要做同样的事情,但在src /中需要任何头文件:
SRC := src
foo.o: foo.c
$(CC) -I$(SRC) -c $< -o $@
要做同样的事情,但使用src /中的源文件:
SRC := src
foo.o: $(SRC)/foo.c
$(CC) -I$(SRC) -c $< -o $@
为此,但将目标文件放在obj /中:
SRC := src
OBJ := obj
$(OBJ)/foo.o: $(SRC)/foo.c
$(CC) -I$(SRC) -c $< -o $@
对任何此类对象文件(obj / foo.o,obj / bar.o,…)执行此操作的模式规则:
SRC := src
OBJ := obj
$(OBJ)/%.o: $(SRC)/%.c
$(CC) -I$(SRC) -c $< -o $@
要创建所需对象的列表:
SOURCES := $(wildcard $(SRC)/*.c)
OBJECTS := $(patsubst $(SRC)/%.c, $(OBJ)/%.o, $(SOURCES))
并且规则涵盖所有:
all: $(OBJECTS)
把它们放在一起:
SRC := src
OBJ := obj
SOURCES := $(wildcard $(SRC)/*.c)
OBJECTS := $(patsubst $(SRC)/%.c, $(OBJ)/%.o, $(SOURCES))
all: $(OBJECTS)
$(CC) $^ -o $@
$(OBJ)/%.o: $(SRC)/%.c
$(CC) -I$(SRC) -c $< -o $@
请注意,这有一个很大的缺点:是不跟踪头文件的依赖性.这可以自动完成,但这是一个微妙的技巧;它可以等到你掌握了这么多.