多目录C项目Makefile编译提示无ota.o生成规则报错如何解决?
报错原因
- OBJS变量定义时换行未加续行符
\,导致变量赋值不完整,生成的目标文件路径不符合预期。 - 目标文件生成规则
$(BUILD_DIR)/%.o: %.c %.h强制要求每个.c源文件必须存在同名的.h头文件才会匹配规则。当前项目中src/ota.c没有对应的ota.h,只有inc/log.h,所以这条规则无法匹配生成build/ota.o的需求,make找不到对应生成规则就抛出报错。
修复方案
- 修正OBJS变量的定义,要么合并为一行,要么换行处增加续行符
\ - 调整目标文件生成规则,去掉强制依赖同名
.h的要求,单独声明源文件对应的头文件依赖即可 - 可选增加build目录自动创建逻辑,避免手动创建目录或者清理后目录不存在的报错
修改后的完整Makefile如下:
vpath %.h inc vpath %.c src RED = \033[1;31m GREEN = \033[1;32m YELLOW = \033[1;33m BLUE = \033[1;34m RESET = \033[1;0m INC_DIR = inc SRC_DIR = src BUILD_DIR = build CC = gcc CFLAGS = -Wall -I$(INC_DIR) RM = rm -rf # 调整通配符路径,避免匹配到非预期目录下的源文件 SRCS = $(wildcard $(SRC_DIR)/*.c) INCS = $(wildcard $(INC_DIR)/*.h) # 修正OBJS定义,合并为一行避免续行问题 OBJS = $(patsubst %,$(BUILD_DIR)/%,$(patsubst %.c,%.o,$(notdir $(SRCS)))) TARGET = OTA $(BUILD_DIR)/$(TARGET): $(OBJS) @mkdir -p $(BUILD_DIR) @echo "$(YELLOW)Linking ...$(RESET)" $(CC) $(CFLAGS) -o $@ $^ @echo Finished! # 去掉强制依赖同名.h的要求 $(BUILD_DIR)/%.o: %.c @echo "$(GREEN)Compiling objects ...$(RESET)" $(CC) $(CFLAGS) -c $< -o $@ # 单独声明头文件依赖,log.h改动后会自动触发ota.c重编译 ota.o: log.h .PHONY: clean clean: @echo "$(RED)Cleaning build files$(RESET)" $(RM) $(BUILD_DIR)/*
内容的提问来源于stack exchange,提问作者Văn Minh Lý
相关产品推荐
相关产品推荐

