第一次跟着老师做项目,老师布置了几个学习任务,这么好的学习笔记,我私吞了多不好,于是又来分享学习笔记啦!
初次接触虚拟机,Linux内核的Ubuntu系统
虚拟机当然是为了模拟Ubuntu系统,用Ubuntu是因为它基于Linux内核,而用Linux内核的优势是支持的体系结构多,也就是移植性强,应用广泛。用来开发代码的自由度高,开发工具丰富。
vi是Ubuntu里的一种文本编辑器,优点是页面及其简洁,跟命令行界面差不多简洁,而且光标移动能力十分强大,另外,操作熟悉的话复制,删除代码也超级方便。
gcc是编译.c文件的编译工具,带有多种功能。
gdb是调试工具,也有非常强大的功能哦。
之后这个makefile了解到是用来同时编译多个代码文本的工具,至于其他的,下边再说。
下面就说说我学习过程遇到的问题跟思考:
虚拟机和Ubuntu都是在官网找的,主要是在b站跟csdn找怎么安装,遇到一个bug,安装.ubuntu的时候界面显示不全,然后安装不了,最后是按tab键盲猜下边的继续键在哪里才安装好,不过最好也找到了按window键再拖动鼠标能解决,才算真的解决了这个问题。
特别提醒:记得安装vmware tools哦,能在电脑全屏使用虚拟机,另外还能在虚拟机和主机之间传输文件。
vi
vi我是先看了几个csdn上边的文章,在Ubuntu上边安装vi之后照着一篇文章试了一下,很多功能跟文章讲的不一样,比如ctrl+u ctrl+d说反了,b的作用说错了,还有一些里边有介绍我操作不了的。Vi上边几乎每个按键都有用,而且很多重复的,总的来说要熟练掌握四种操作:
- 移动光标
- 删除
- 复制粘贴
- 转插入
- 撤销与反撤销
- 末行模式
- 移动光标
- 删除
- 复制粘贴
- 转插入
- 撤销与反撤销
- 末行模式
- 移动光标:
- h j k l为上下左右(直接方向键也可)
- H M G是整篇文档的最开头,最中间跟结尾
- CTRL+ b / u / f / d 分别表示向上一页,向上半页(后两个为向下)
- Shift+$/^ 表示当行最后/最前
- w e表示下一行行首与下一行行末,b表示上一行行末
- 删除:
- dd表示删除该行 ndd表示向下删除n行
- x/X表示删除删除一个字符,nx/nX表示向后/向前删除n个字符
- 复制粘贴:
- 小写v按字符选择,大写V按行选择,CTRL+V按模块选择,再用上边移动光标的方法选定后,y复制,p粘贴。
- 用鼠标选定后,y复制,p粘贴
- yw(复制一个字符) yy(复制一行)yG(复制至文末)
- 转插入:
- 有a ,I(小写) ,o,O(表示向下/向上插入一行)
- s/r表示下一个输入替换,且进入插入模式,R会一直替换输入,直到按下esc键。
- 撤销与反撤销:
- u撤销一次,n+u撤销n次,ctrl+r反撤销
- 末行模式:
- 在命令行模式按下 : 进入末行模式
- w保存 q退出 wq保存并退出 q!强制退出
- “/+搜索的内容” 或“?+搜索的内容” 都能搜索
- set number & set nonumber 表示显示行号与取消显示行号
- %s/要替换的字符/替换后的字符/g 能替换文本,如:
%s/s1/s2/g //g表示在全局文件替换,即一次更换文件所有要替换的地方, 换成 /c 则表示每次替换之前让用户替换。
GCC
基本模式是 gcc test.c -o test
这其中省略了几个过程,包括预处理(-E),编译(-S),汇编(-c),链接(-o),这是直接一步到位,但是因为这样写,在makefile的时候出了问题。
除了这个基本模式,还能添加各种指令,最常见的是-g添加调试指令。 -Wall能尽可能多的提供警告。 -Werror能将警告当作error处理,在遇到警告时停止编译。-On 是编译方式,n为等级,可以取0~3的整数,-O2最常用,不过可能会改变代码,所以调试的时候别用。
GDB
基本模式是 gdb test (-q)
要执行这个之前要先用gcc添加调试信号。
进入gdb后有很多命令:
- 断点
- 变量
- 执行
- 断点:
- break(b)+location设置断点,location可以是
- 行数
- 文件名:行数 表示哪个文件的第n行
- 函数名
- 文件名:函数名 会在函数的开头设置断点
- “+ n ”/“- n ”在当前暂停位置向后/向前n行设置断点
- 条件断点:break location if cond
- tbreak 设置断点只会存在一次
- delete(d) + (n)加n表示删除第n行断点,不加n删除所有断点
- clear +location 删除该位置的断点
- info breakpoints 查看断点信息
- disable n1 n2 ... & enable n1 n2 ...表示禁用跟恢复第n行断点,其中n可以有多个
- break(b)+location设置断点,location可以是
- 变量:
- print (p) 能打印某个变量或表达式的值(一次)
- display 打印某个变量或表达式的值(每次暂停时都会打印)undispaly解除
- watch 变量/表达式 能够跟踪某个变量或者表达式,下次这个变量(或表达式)的值改变时会停下并显示含量(表达式)的值
- 执行:
- run(r)/start开始运行
- continue(c)在暂停时继续执行
- step(s) & next(n) 单步运行代码,区别是step会进入函数next不会
- until 每篇文章都说它能快进至结束循环(在循环最后一行时),但是我自己试是不可以的,可以用设置断点跟continue代替。另外until n是执行到第n行,也可以解决上边的问题。
- return 在其他函数里边跟踪的时候,return能立刻停止函数并返回当前函数值
- finish(不能简写成f!)能正常执行至函数结束(不可用于最外层函数)
- jump +location 直接跳到某位置继续执行代码
Makefile
先是看了一波视频,顺便学了一点脚本语言,自己写makefile和基本用法还是没问题的。
一个makefile里边大概分为三个部分:
- 变量设置
- 编译依赖文件成目标文件
- 定义其他指令
- 变量设置:
- = 的意思就是定义
- +=追加定义
- 在此部分
- 定义一个变量 OBJ为.o文件的总称 (便于修改)
- 定义CC=gcc (这是考虑到有的操作系统不是用gcc编译,移植后修改此处即可)
- 定义目标文件 TAG
- 编译
- 这个就是将gcc的编译放进来 略有不同,例如
目标文件:依赖文件
(tab)gcc -g test.c -o test
2. 如果直接用1的语句编译,用gdb并不能调试,会显示没有调试信号,于是要改为两部完成: 从.c文件到.o文件,再从.o文件链接成可执行文件,如:
目标文件:依赖文件
(tab)gcc -g test.o -o test
%.o:%.c
(tab) gcc -g test.c -o test.o
之后再用各种替换,如通识符$^替换所有依赖文件 $@替换所有目标文件 以及上边定义的变量都换进去
- 定义其他指令:
- 顶格输入“.PHONY:”
- 再换行输入指令的名称加”:”,如“clear:”
- (tab)指令
- 删除指令为” rm -rf 文件”
- 多文件一起编译:
- 这个就是模块化代码后,在上边编译部分修改变量OBJ就好啦



