前情提要(偏题):开学第一周费尽周折选上了学校的ICS(计算机系统导论) 课。此课无比硬核,以著名神书 《CSAPP》 为教材,PPT及部分资料均为全英文;学习了国内外多门著名相似主题高质量课程的成功经验,涉及内容广博无比(光是还未接触到课程核心内容的Lab0,就涉及到无数极其有用的知识:从手把手安装Linux到命令行基本操作,从双系统安装到WSL部署,从sshvim再到makegdb……几乎无所不包);而搭建课程网站以及编写课程配套的textbook等工作,均由往届选过此课并愿意作为助教的前辈们承担;同时,课程还使用Piazza这种国际化的平台作为答疑沟通渠道。正是在这门课的attacklab中的实践推动了我主动去使用gdbmake命令。
整个课程是我所见在西交最洋气,最现代化,最与时代接轨,含金量最高的一门计算机专业课,不过同时也确实带给了我很多压力。不过学点好东西,吃点细糠总是令人愉快的。希望十几周后的我依然能够跟上这门课程的进度并取得一个好结果吧。以下回归正题……

本人折腾WSL2已经好几个月了。前几天突发奇想,在写面向对象程序设计的作业时,要将主要代码环境转移到我的WSL2上。于是便用起了vscodeRemote SSH插件,连接WSL2,创建文件并开始敲代码。

然而问题来了。在我好不容易敲完一个程序后,突然想起来在WSL2并没有配置好关于C/C++的编译和运行/调试选项。到处乱设置一通仍然无法跑通。本人初下载vscode时在配环境这件事上消耗了大量时间,已经对之有了心理阴影;而如果利用g++gdb的命令行操作来执行各个步骤的话,又实在繁琐得很。正巧最近在ICS课上接触到了make的相关操作,看到使用一行make命令就可以利用makefile秒运行,效果堪比直接按下(配置好)的调试按钮。于是决定放弃配置vscode的一大坨json文件,而尝试使用make命令来跑代码。在一通学习过后,本人写出了人生中的第一个makefile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
CC = g++ #设置编译器
CFLAGS = -g
default_name = program
TARGET = ${f}

f ?= ${default_name} #f代表文件名,如果不设置值就会采用"program.cpp"作为默认代码文件的名字
#make f=...
${TARGET}: ${TARGET}.cpp
${CC} ${CFLAGS} ${TARGET}.cpp -o ${f} #g++ -g test.c -o test 也就是表示这种命令

# debug
debug: ${TARGET}
gdb ${TARGET} -ex "run" #gdb test然后再执行run运行命令

# clean
clean:
rm -f ${TARGET}

有了这个makefile,在运行程序的时候,只要在命令行输入make f=文件名 debug就可以一键进入gdb来运行,运行完成后按q即可退出。而如果涉及到对程序的改动需要重新编译,只需要先输入make f=文件名 clean再重新执行上面一条命令就可以。示例:如果我有程序名为test.cpp,我只需要输入make f=test debug,就会自动对test.cpp编译生成test可执行文件并进入运行/调试状态。

总之,虽然并不是什么大工作,但是毕竟是初次接触,还是有一点点成就感的。如有朋友正好刚入门,可以参考这一小段代码,至少应付日常写leetcode、做课程OJ题等任务是足够了。