gpt4 book ai didi

c - Makefile : Automatically compile all c files, 将 .o 文件保存在单独的文件夹中

转载 作者:太空狗 更新时间:2023-10-29 16:46:08 25 4
gpt4 key购买 nike

我有一个包含 3 个子目录的目录。 src/用于 .c 和 .h 文件,bin/编译的可执行文件应该去的地方和 obj/我想要 .obj 文件去的地方。

现在我希望 makefile 编译来自 src 的每个 .c 文件(我不必在 makefile 中列出它们)并将 .o 文件放入 obj 中,并将从 foo.c 构建的可执行文件保存为 bin/foo。

有人能帮帮我吗?每当我使用通配符时,make 都会提示规则不存在,而当我使用隐式规则时,它不会将目标文件放在单独的文件夹中。

最佳答案

在本地从 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.oobj/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 $@

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

关于c - Makefile : Automatically compile all c files, 将 .o 文件保存在单独的文件夹中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40621451/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com