【发布时间】:2018-07-03 11:31:38
【问题描述】:
我想创建一个 make 文件,它获取多个 src 子目录中的所有文件,并将它们每个都直接编译到一个单独的构建目录中。
即我有例如
- src/main.c
- src/i2c/i2c.c
- src/i2c/i2c.h
作为输出,我想要目标文件以及最终的二进制文件 - 构建/main.o - 构建/i2c.o - 构建/发布.elf
我设法将所有源文件作为一个列表及其各自的子目录路径放入一个变量中,并且我还设法获取所有输出文件的列表,但是当我尝试创建一个目标来构建该构建中的所有 .o 文件时目录它与对应的 .c 文件与 .o 文件不匹配。在这里我只是不确定如何将这两者联系起来。
尝试将 main.o 与 i2c.c 匹配时失败。
这是 Makefile 的“相关”部分:
TARGET = $(lastword $(subst /, ,$(CURDIR)))
BUILD_DIR := buildDir
SOURCES = $(wildcard src/*.c src/*/*.c)
BROKENOBJECTS = $(SOURCES:.c=.o)
LESSBROKEN = $(notdir $(BROKENOBJECTS))
OBJECT_FILES = $(addprefix $(BUILD_DIR)/, $(LESSBROKEN))
$(BUILD_DIR)/%.o: $(SOURCES) $(BUILD_DIR)
$(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@ $<
$(BUILD_DIR)/$(TARGET).elf: $(OBJECT_FILES)
$(CC) $(LDFLAGS) $(TARGET_ARCH) $^ $(LDLIBS) -o $@
$(BUILD_DIR) :
mkdir -p $@
compile : $(BUILD_DIR)/$(TARGET).elf
我将如何解决这个问题,从 $(SOURCES) 运行每个 .c 文件的配方,然后在 buildDir/ 中创建相应的 .o 文件?
【问题讨论】:
-
您的所有
*.c文件都有唯一的名称吗?即如果在目录src/i2c中有一个文件i2c.c,那么没有其他源目录将有一个名为i2c.c的文件。 -
暂时不会。在遥远的将来,我可能会遇到一个案例,我想将不同的实现链接到该案例,但在那种情况下,我认为我会“只是”将具有该特定实现的不同源文件夹包含在其中。或专门添加该源文件。现在应该包括所有现有的东西。