建造foo.o
from foo.c
,本地:
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 $@
请注意,这有一个很大的缺点:is 不跟踪头文件的依赖关系。这可以自动完成,但这是一个微妙的技巧;可以等到你掌握了这么多之后再做。