从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 $@
请注意,这有一个很大的缺点: 是不跟踪对头文件的依赖关系。这可以自动完成,但这是一个微妙的技巧。它可以等到你掌握了这么多。