从foo.c
建立foo.o
,本地:
foo.o: foo.c
$(CC) -c $< -o [email protected]
为了做同样的,但在src/
任何需要的头文件:
SRC := src
foo.o: foo.c
$(CC) -I$(SRC) -c $< -o [email protected]
做相同,但与源文件在src/
:
SRC := src
foo.o: $(SRC)/foo.c
$(CC) -I$(SRC) -c $< -o [email protected]
要做到这一点,但放在obj/
对象文件:
SRC := src
OBJ := obj
$(OBJ)/foo.o: $(SRC)/foo.c
$(CC) -I$(SRC) -c $< -o [email protected]
图案规则将做任何这样的目标文件(obj/foo.o
,obj/bar.o
,...):
SRC := src
OBJ := obj
$(OBJ)/%.o: $(SRC)/%.c
$(CC) -I$(SRC) -c $< -o [email protected]
要创建所需的对象列表:
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 [email protected]
$(OBJ)/%.o: $(SRC)/%.c
$(CC) -I$(SRC) -c $< -o [email protected]
注意,这有一个大的缺点:是不跟踪头文件的依赖性。这可以自动完成,但这是一个微妙的伎俩;它可以等到你掌握了这么多。
谢谢你的精彩答案。最后的代码片段实际上并不会构建可执行文件,但添加了这个代码并没有问题,并且所有的文件都是我想让它们成为的地方:) – Max
最后一个模式规则可能会看起来更好,因为静态模式规则是可以接受的。 – bobbogo
@bobbogo:我同意,但我试图简单。 – Beta