编译C语言文件夹,Makefile:自动编译所有c文件,将.o文件保存在单独的文件夹中...

要从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 $@

请注意,这有一个很大的缺点:是不跟踪头文件的依赖性.这可以自动完成,但这是一个微妙的技巧;它可以等到你掌握了这么多.