终端执行编译命令无法更新可执行文件,始终提示目标为最新状态
问题核心原因
你执行的操作链路存在两个完全错位的匹配关系,直接导致make始终判定目标文件为最新状态:
- 手动执行的
gcc shell2.c -lreadline没有指定输出文件名,gcc默认会把编译结果输出为当前目录下的a.out,全程没有覆盖原有旧的shell可执行文件;而原有shell文件的修改时间如果比所有关联依赖都新,make自然会直接返回已最新的提示,根本不会触发重新编译。 - 当前目录下的
shell目标和你编辑的shell2.c没有建立构建关联:如果Makefile中定义shell目标时,依赖的源文件不是shell2.c(比如是旧的shell.c),哪怕你反复修改shell2.c的内容,make检测不到依赖文件的时间戳更新,就会一直判定shell不需要重新构建。
可直接落地的解决步骤
- 先核查当前目录下各文件的时间戳,执行
ls -l shell shell2.c,对比两者的修改时间差,确认原有shell是否是早于你源码修改时间的旧文件 - 手动指定gcc的输出路径,将
shell2.c的编译结果直接写入目标文件:gcc shell2.c -lreadline -o shell,这一步会直接覆盖旧的可执行文件,完成目标更新 - 检查Makefile中
shell目标的配置规则,确保依赖项正确指向shell2.c,示例规则格式如下:shell: shell2.c gcc shell2.c -lreadline -o shell - 如果确认Makefile配置正确但仍触发"up to date"提示,可跳过时间戳检查强制构建:执行
make -B shell,该参数会无视文件新旧状态,完整重新编译目标文件
注意:不要在gcc编译时漏掉
-o参数,缺少该参数时生成的可执行文件永远不会匹配你实际要更新的目标名称。
内容的提问来源于stack exchange,提问作者Waleed
相关产品推荐
相关产品推荐

