C项目Makefile非首源文件修改不触发重编译求助
Makefile问题:除首个源文件外,其余修改不触发重编译
C项目Makefile出现异常:仅SRC变量中第一个源文件(main.c)修改后能触发make重编译,修改其他源文件(如utils.c、geometry.c)时,make无法检测到变更,不会重新编译。项目采用源文件、目标文件、依赖文件的标准配置,objs文件夹已正确生成所有目标文件和.d依赖文件,且修改后.o和.d的时间戳已更新,调整SRC文件顺序后问题依然存在。
当前Makefile代码片段
SRC = $(SRCDIR)main.c $(SRCDIR)utils.c $(SRCDIR)geomtery.c ... (other source files) ... OBJ = $(SRC:$(SRCDIR)%.c=$(OBJDIR)%.o) DEP = $(OBJ:.o=.d) -include $(DEP) CC = gcc CFLAGS = -Wall -Wextra -Werror -O3 # -g -g3 -fsanitize=address LFLAGS = -lm -lft -lmlx -framework OpenGL -framework AppKit DEP_FLAGS = -MMD -MP all: start_compilation $(NAME) end_compilation start_compilation: @printf "\n$(YELLOW)Compiling...$(WHITE)\n" end_compilation: @printf "$(GREEN)Compilation succesfull!$(WHITE)\n" $(OBJDIR)%.o: $(SRCDIR)%.c @mkdir -p $(OBJDIR) $(CC) $(CFLAGS) $(DEP_FLAGS) -I $(INCLUDES) -c $< -o $@ $(NAME): $(OBJ) $(LIBFT) $(MLX) @printf "\n$(CYAN)Generating project executable...$(WHITE)\n" $(CC) $(CFLAGS) $(LFLAGS) $(OBJ) -L $(LFT_PATH) -L $(MLX_PATH) -o $(NAME)
已尝试操作
- 验证每个.c文件对应的.d文件已生成且依赖关系正确
- 检查.o和.d文件的时间戳,确认修改后已更新
- 调整SRC中源文件的顺序,问题仍存在
问题原因与解决方法
问题核心是SRC变量的换行续行写法错误:Makefile中拆分变量定义到多行时,除最后一行外,每行末尾必须添加反斜杠\,否则后续行不会被纳入变量内容。原写法中SRC仅包含第一个源文件,OBJ变量也只对应一个目标文件,导致只有main.c的修改会触发$(NAME)重编译,其他源文件不在依赖链中,自然无法被检测到变更。
修正后的SRC变量定义:
SRC = $(SRCDIR)main.c \ $(SRCDIR)utils.c \ $(SRCDIR)geomtery.c \ ... (other source files) ...
内容的提问来源于stack exchange,提问作者G. Delvigne
相关产品推荐
相关产品推荐

