一.Vim编辑器
1.简单了解
vim的操作模式:12种(6种基本模式、6种条件模式)
三种最常用的操作模式:普通模式、插入模式、底行模式
插入模式
底行模式
模式切换:
普通——>插入
i 从光标所在位置开始插入
a 光标后一个字符处插入
o 光标下一行行首i女性插入
普通——>底行 :
插入/底行——>普通 esc
1.普通模式:完成基本的基本命令
光标移动以及复制粘贴操作。
文件打开默认处于普通模式
2.插入模式:向文件中插入数据
3.底行模式:退出/保存编辑 vim设置
2.操作
1.普通模式下的操作:
(1)光标移动:hjkl 左、下、上、右
w/b 向右/向左移动一个单词
G 移动到文章末尾
gg 移动到文档首行
(2)复制/粘贴
复制:
yy 复制光标所在行的数据
nyy 复制多行内容
比如:3yy 复制3行
粘贴:
p 向光标下行粘贴
P 向光标上方行粘贴
删除/剪切:
x 删除光标所在处字符
dw 删除光标后方的单词
dd 删除光标所在行
撤销:u
回退:ctrl+r
2.底行模式操作
q 退出
wq 保存并退出
q! 不保存退出
修改vim配置文件
在/etc/vimrc目录下
或者~/.vimrc下(针对每一个用户)
二.gcc编译器
编译过程:
(1)预处理:展开所有代码。
(2)编译:语义语法纠错,若无误则将高级语言代码编译生成汇编代码。
(3)汇编:将生成的汇编代码生成机器指令。
(4)链接:将所有的目标文件以及外部库链接到一起,生成可执行程序。
库文件:
动态库:libc.so (Linux下gcc默认链接动态库)
静态库:libc.a
静态链接:生成可执行程序时,链接静态库,(将库中的代码直接写入到可执行程序中)
优点:程序运行时,不依赖静态库的存在
缺点:浪费资源,造成大量的代码冗余。
动态链接:生成可执行程序时链接动态库(只是写入了库中函数的符号位置信息)。
ldd 文件名 查看可执行程序的依赖项
优点:充分利用资源。
缺点:运行时依赖动态库的存在。
-E 只进行预处理
-S 只进行编译
-static 对生成的文件采用静态链接
-g 生成调试信息(生成debug版本)
三.gdb调试器
gcc默认之生成release版本的程序,但是我们要调试程序时,需要用到的是debug版本的程序
加载程序:gdb ./可执行程序 或者gdb进入后 file ./可执行程序
调试程序:
r 接收参数,运行程序
start 开始单步调试
l 默认查看调试行附近代码
l file:line 指定文件指定行代码查看
n 下一步,但是不进入函数
s 下一步,进入函数体内
until file:line 直接运行到指定文件指定行
打断点:b file line 在file文件第line行打断点
b func 给func函数打断点
查看调试信息:i
查看断点信息:i b 查看断点信息
删除断点:d (默认删除所有断点)
d b_id 删除指定断点
打印变量内容:p 变量名
继续运行:c 从停止处,继续运行
变量监控:watch 变量名
查看函数调用栈信息:bt
四.Linux项目自动化构建工具make/Makefile
Makefile——普通文件——用来定义项目整体的构建编译规则
make程序是一个解释器,到当前目录下来寻找Makefile文件,对Makefile中记录的项目构建规则,逐行解释执行,完成项目的自动化构建。
Makefile编写规则:
依赖对象的作用:可有可无,主要是为了判断项目是否需要重新构建
执行规则:到Makefile中寻找目标对象,为了生成目标对象,执行Makefile中写的命令。
1.到Makefile中寻找目标对象,判断目标对象是否已经存在,
若已经存在:对目标对象以及依赖对象进行最后一次修改时间比对。若目标对象时间戳大于以来对象时间,则认为项目构建后,源码没有被修改过,不需要重新编译;否则重新编译。
若不存在:直接执行构建规则,生成目标对象。
2.到Makefile中找寻目标对象,判断依赖对象是否存在,
若依赖对象存在:则通过依赖对象最后一次修改时间判断向木是否需要重新构建
若依赖对象不存在:继续在Makefile中所定义的规则找寻是否有生成依赖对象的构建规则。
预定义变量:
$@: 目标对象
$^:所有依赖对象
$<:依赖对象中的第一个
make在执行命令的时候指定查找到的目标对象。
上述Makefile还可以这样编写
当我们想让每次make的结果都是全部重新编译而不是声明队形已经是最新的时候,我们可以来声明伪对象来进行操作
伪对象:不管目标对象是否存在,不管目标对象是否最新,每次都要重新执行生成规则。
通常伪对象是这样用的:
我们时要执行make来删除test.o文件,这是声明了为对象后的结果
当未声明时:make就会认为这是最新的目标对象,不用再次构建了。(删除失败)
更加方便的使用:
wildcard:获取指定没目录下的文件名
patsubst:字符串替换