实验新手常见问题
修改源码后,编译或测试结果没有变化
编辑器中的代码、磁盘上的源文件和编译生成的程序不一定同步。遇到运行结果没有反映源码修改时,可以依次检查以下事项。基本命令的用法见实验入门手册,具体编译和测试方式以对应实验文档为准。
1. 确认修改已经保存
在 VS Code 中按 Ctrl+S 保存当前文件;修改了多个文件时,可以使用“文件 → 全部保存”。
编译工具读取的是磁盘上的源文件。尚未保存的编辑内容不会参与编译,因此屏幕上虽然显示了新代码,生成的程序仍可能使用旧代码。
2. 确认编辑、编译和运行针对的是同一份项目
查看正在编辑的文件的完整路径,与终端当前目录对照。同一实验存在多份副本时,不能只核对文件名。使用 WSL 或远程连接时,还要确认操作发生在同一个环境中。
运行测试时,也要确认测试使用的是这份项目中构建的程序。
3. 确认保存后已经成功重新编译
按对应实验文档执行编译和测试,并检查编译输出。如果编译失败,目录中可能仍留有旧程序;直接运行旧程序不能验证本次修改。
如果 make 提示无需重建,请参考下文理解该提示,再检查修改的文件是否属于当前目标的依赖。
4. 必要时,尝试清理后重新构建
如果以上检查均无问题,但仍怀疑程序复用了旧构建产物,可以在确认项目提供 clean 目标、了解它会删除哪些文件后,尝试 make clean,再按实验文档重新编译和测试。
make clean 通常会删除目标文件、可执行程序等构建产物,使下一次构建重新生成它们。例如,依赖声明不完整或文件时间戳异常,可能使增量构建遗漏本应执行的步骤;清理后重建有时能排除旧产物的影响。
它不是每次修改后的必需步骤,也不能保存尚未保存的文件、修复代码逻辑或纠正构建规则。如果清理重建后仍有问题,应继续检查原因,并向助教提供相关输出。
背景:make 如何判断是否需要重新构建
Makefile 描述构建目标、依赖关系和生成目标的命令。对于普通文件目标,make 通常在目标不存在,或某个已声明的依赖比目标更新时,重新生成目标。因此,能否触发重建既取决于磁盘上文件的修改时间,也取决于构建规则是否正确声明了依赖。
如果编辑内容没有保存,磁盘上的文件不会因这次编辑而更新;如果修改的是另一份项目中的文件,当前项目也不会因此触发重建。
终端有时会显示:
这表示按照当前构建规则,make 判断 all 目标没有需要执行的构建步骤。all 是常见的目标名称,具体包含什么由项目的 Makefile 决定。
这不代表代码正确或测试通过,也不能单凭它断定文件没有保存。 文件已经保存且此前已完成编译时,同样可能出现这条提示。