首页 > 解决方案 > 从 Make 中的文件列表中编译每个文件

问题描述

问题如下。我有几个目录中的 .c 文件列表,我希望将这些文件一个一个地编译成一个位于 BUILD_DIR 文件夹中的 .o 文件,以便稍后链接。它们附加到 SOURCE_FILES_FREERTOS 变量。尝试执行此操作的 Makefile 代码部分是:

OBJ_FILES_FREERTOS = $(SOURCE_FILES_FREERTOS:%.c=$(BUILD_DIR)/%.o)

# Build the Operating System Library
freertos: ${OBJ_FILES_FREERTOS}

${BUILD_DIR}/%.o : $(dir ${SOURCE_FILES_FREERTOS})/%.c
    -mkdir -p ${BUILD_DIR}
    $(CC) $(CFLAGS) ${INCLUDE_DIRS} -MMD -c $< -o $@

但是,它不起作用,说第一个目标文件没有规则:

make: *** No rule to make target 'build/../../../FreeRTOS/Source/stream_buffer.o', needed by 'freertos'.  Stop.

似乎是什么问题?

标签: cmakefile

解决方案


从自上而下的角度来看,我们首先将对象声明为库的一部分:

OBJECT_FILES_FREERTOS := $(patsubst ...)
libfreertos.a: $(OBJECT_FILES_FREERTOS)

我无法OBJECT_FILES_FREERTOS从问题中的变量创建。您必须添加更多内容或自己弄清楚。下面我假设所有目标文件都具有$(BUILD_DIR)/-prefix 和与其派生源相同的目录结构(这很痛苦,因为 Make 不会为您创建必要的目录层次结构,但这就是 Make 的滚动方式)。

Make 现在尝试从源文件构建目标文件。默认情况下,在与预期目标文件所在的目录相同的目录中搜索源文件。这就是它变得棘手的地方,因为源文件(通过查看您的错误)不在源代码树中,因此创建了一个天知道在哪里的相对路径。您需要一个不同的源到对象映射,这里使用静态规则:

$(OBJECT_FILES_FREERTOS): $(BUILD_DIR)/%.o: $(FREERTOS_SRC_DIR)/%.c

No rule to make target意味着它找不到构建文件的规则,最常见的原因是源文件丢失并且 Make 不知道如何从无到有构建它。


推荐阅读