c - 从 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.
似乎是什么问题?
解决方案
从自上而下的角度来看,我们首先将对象声明为库的一部分:
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 不知道如何从无到有构建它。
推荐阅读
- python - 尝试按 X 步对 C3.JS 散点图 Y 值进行分组
- swift - Swift 类型擦除尝试:“引用无效的关联类型”
- proxy - 用于特定网站的 Squid 代理
- macos - 詹金斯 Docker 套接字
- python - 得到一个错误''float' object is not iterable'
- swift - 以编程方式在一个 UIVIewController 中添加两个 UITableView,并希望使用 UISegmentedControl 更改控制器的视图
- c++ - 使用 Euler 方法创建 C++ 程序来求解运动方程
- sql - SQL - 如何指定结果
- linux - 如何使用 x86 NASM 显示日期?
- python - 将按位求逆与按位或相结合