You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 04:05:10