1、vim的三种模式
vim是从vi发展过来的一款文本编辑器
(1)安装vim
sudo apt-get install vim
(2)三种模式
1| 命令模式
打开文件后,默认进入命令模式(打开文件命令:vi + 文件名)。
2| 编辑模式
需要输入一些命令,切换到编辑模式。
3| 末行模式
在末行模式下可以输入一些命令。
4| 有关关系
<1> 命令模式 加冒号 进入末行模式 加w 完成保存文字 自动切换到命令模式
<2> 命令模式 加冒号 进入末行模式 按两下ESC键进入(或者执行一个末行命令) 命令模式
2、vi中的光标位置删除、撤销操作
(1)移动光标
1| h : 向左移动
2| j: 向下移动
3| k: 向上移动
4| l: 向右移动
5| 数字0:移动到本行首部
6| $: 移动到本行尾部
7| gg: 移动到当前文件开头
8| G:移动到当前文件尾部
9| 行数 + G: 移动到指定的行数
(2)删除操作
1| 删除光标后面字符: x(小写)
2| 删除光标前面字符: X(大写)
3| 删除光标所在光标的单词: dw (如果光标在此单词的中间,则删除光标后面的单词相关内容)
4| 删除光标到行首的字符串: d + 数字0
5| 删除光标到行尾的字符串: D (或者d + $)
6| 删除光标当前行: dd
7| 删除多行: ndd (n代表行数)
8| 撤销: u(小写)
3、vim中的复制和粘贴
(1)复制
1| 复制一行
yy
2| 复制多行
nyy (n代表行数)
(2)粘贴
1| 粘贴到光标所在行的下一行
p(小写)
2| 粘贴到光标所在行
P(大写)
(3)剪切 == 删除
4、vim可视模式和查找
(1)可视模式
1| 切换到可视模式: v
2| 选择内容: 方向键(h、j、k、l)
3| 有关操作: y(进行复制) d (进行删除)
(2)查找操作
1| / + 查找内容 (例如:/hello) —————— 从光标位置向下查找,到最下边之后,返回到头部
2| ? + 查找内容 (例如:?hello) —————— 从光标位置向上查找,到最上边之后,返回到尾部
3| # —————— 把光标移动到查找单词的身上,按#
4| 遍历的时候使用快捷键: N/n
5| 替换当前字符: r —————— 只能替换单个字符
6| 查看man文档
光标移到到某个指定的单词中
shift + k(小写k)
或者 直接输入大写的K
5、命令模式切换到文本模式
a —————— 在光标所在位置后面插入 A —————— 在当前行尾部插入
i —————— 在光标所在位置前面插入 I —————— 在光标所在行的行首插入
o —————— 在光标所在行的下边开辟一个新的行 O —————— 在光标所在行的上边开辟一个新的行
s —————— 删除光标后面的字符 S —————— 删除光标所在行
6、末行模式相关操作
(1)查找
1| s / 查找内容 / 替换内容 / g —————— 通行全部替换
2| s / 查找内容 / 替换内容 —————— 光标所在行的仅第一次出现查找内容的替换
3| %s / 查找内容 / 替换内容 / g —————— 替换所有的查找内容
4| 20.25 / 查找内容 / 替换内容 / g —————— 替换20-25行所有查找内容
(2)保存退出
1| 退出: q 退出不保存: q! 仅保存: w 保存退出: wq
2| 在命令模式下保存并且退出: ZZ(大写)
7、vi分屏
(1)水平分屏
1| 分屏当前文件 :号 + sp
2| 分屏指定文件 :号 + sp + 文件名
3| 在两个屏幕间进行切换: CTRL + ww
4| 保存并退出所有屏幕: :号 + wq + all
5| 保存并退出单个屏幕: 移动光标到需要关闭的屏幕中然后加冒号 + wq
(2)垂直分屏
1| 分配当前文件: :号 + vsp
2| 分屏当前文件和指定文件: :号 + vsp + 文件名
3| 在两个屏幕间进行切换: CTRL + ww
4| 保存并退出所有屏幕: :号 + wq + all
5| 保存并退出单个屏幕: 移动光标到需要关闭的屏幕中然后加冒号 + wq
8、vim的配置文件
vim打造IDE
系统级配置文件目录: /etc/vim/vimre
用户级配置文件目录: "/.vim/vimre
9、gcc的编译过程和一些参数
(1)安装
sudo + apt-get + install + gcc
(2)编译
<1> gcc + 编译文件(格式为:xxx.c)+ -o + 编译新文件
<2> 开始执行: ./ + <1>中生成的新文件
(3)有关参数
<1> 如果当前目录下没有头文件,则需要指定头文件目录
gcc + xxx.c + -I(大写) + 绝对路径 + -o(小写) + xxx
<2> 编译时指定宏
gcc + xxx.c + -I(大写) + 绝对路径 + -o(小写) + xxx + -D(大写) + 宏名
<3> 只执行预处理、编译、汇编和生成.o文件
- c(小写)
<4> 只执行预处理和编译并且生成.s文件
- S(大写)
<5> 只执行预处理不生成文件,需要重新定向到一个输出文件中
- E(大写)
<6> 生成文件的名字
- o(小写)
<7> 头文件路径
- I(大写)
<8> 宏
- D(大写)
<9> 添加gdb调试信息
- g(小写)
<10> 警告信息
- Wall
<11> 优化代码
- O (大写) + 1/2/3
10、静态库的制作和使用
(1)命名规则
lib + 库的名字 + .a
(2)制作静态库
<1> 生成对应的.o文件
<2> 将生成的.o文件打包
ar + rcs + 静态库名字(libmytest.a)+ 生成所有的.0文件(*.o)
<3> 调用静态库
gcc + hello.c + lib/libmytest.a + -o + hello + -I /include
(3)发布和使用静态库
gcc + hello.c + lib/libmytest.a + -o + hello + -I + /include
11、静态库的优缺点
(1)优点
<1> 发布程序时,不需要提供对应的库
<2> 库的加载速度相对较快
(2)缺点
<1> 库被打包到应用程序中,导致库的体积很大
<2> 库发生改变,需要重新编译
12、动态库(共享库)的制作
(1)命名规则
lib + 库的名字 + .so
(2)制作步骤
<1> 生成与位置无关的代码(生成于位置无关的.o)
gcc + -fPIC + -c + *.c + -I + /include
<2> 将.o文件打包为共享库
gcc + -shared + -o + 动态库名 + *.o + -I + /include
<3> 调用动态库
gcc + hello.c + lib/libmytest.so + -o + hello + -I + /include
13、共享库的使用
1| gcc + main.c + lib/libmytest.so + -o app + -I + /include
2| gcc + main.c + -I + include -L./lib + -I + mytest -o app
14、解决动态库链接失败的问题
(1)放到系统库目录中 —— 当造成与系统目录重名就不弄使用
(2)临时测试
<1> 环境变量
LD_LIBRARY_PATH=动态库中的路径设置给该变量
<2> 将设置的值导入到系统环境变量中
export LD_LIBRARY_PATH=动态库中的绝对路径
<3> 当终端关闭,设置会失效
(3)永久设置(不常用的方法)
<1> 在家目录下的.bashrc文件中添加一句话
export LD_LIBRARY_PATH=动态库目录的绝对目录
<2> .bashrc修改完成,需要重启终端
(4)其他的注意事项
<1> 需要找动态连接器的配置文件: /etc/ld.so.conf
<2> 动态库的路径写到配置文件中 —————— 路径为绝对路径
<3> 更新: sudo ldconfig -v
15、动态库的优缺点
(1)优点
<1> 执行程序的体积小
<2> 动态库更新的时候,不需要重新编译程序 —————— 前提条件:函数接口不能变
(2)缺点
<1> 发布程序的时候,需要将动态库提供给用户
<2> 动态库没有被打包到应用程序中,加载速度较慢
16、gdb的调试
(1)启动gdb
<1> start : 只执行一步
<2> n(next) : 单步走,无法进入函数内
<3> s(step) : 单步走,可以进入函数内
<4> c(continue) : 直接停在断点处
(2)查看代码
<1> gdb + l
<2> gdb + l + 行数或者函数名 —————— 查看当前文件相关代码
<3> gdb + 文件名 + 行数或者函数名 —————— 查看指定文件相关代码
(3)设置断点
<1> 设置当前文件的断点
b(break) + 函数名或者行号
<2> 设置指定文件断点
b(break) + 文件名 + 行号或者函数名
<3> 设置条件断点
b(break) + 行号 + if + 条件(例如:a==20)
<4> 删除断点
d(delete) + 断点的编号
获取编号: i(info) + break(b)
(4)查看设置的断点
i(info) + break(b)
(5)单步调试
<1> 从函数内部跳出:finish
<2> 不进入函数体内部:n
<3> 退出当前循环:u
(6)查看变量的值
p(print) + 变量名
(7)查看变量的类型
ptype + 变量名
(8)设置变量的值
set + var + 变量名 = 赋值
(9)设置追踪变量
1| 设置:d(display) + 变量
2| 取消追踪变量:undisplay + 变量编号
获取变量编号:i(info) + d(display)
(10)退出gdb
quit
17、编写一个最简单的makefile
(1)认识makefile
make是一个命令工具,它解释Makefile 中的指令(应该说是规则)。在Makefile文件中描述了整个工程所有文件的编译顺序、编译规则。Makefile 有自己的书写格式、关键字、函数。像C 语言有自己的格式、关键字和函数一样。而且在Makefile 中可以使用系统shell所提供的任何命令来完成想要的工作。Makefile(在其它的系统上可能是另外的文件名)在绝大多数的IDE 开发环境中都在使用,已经成为一种工程的编译方法。总的来说,makefile是一个管理程序源代码的工具。
(2)makefile的命名
1| 首先建立一个makefile
方法为:直接输入命令—— vi makefile
2| 在makefile中写入相关内容,保存并且退出
3| 输入make命令执行
(3)makefile的规则
三要素:目标、依赖、指令
(4)makefile中的三个自动变量
1| $<:依赖中的第一个元素
2| $@:当前规则的目标
3| $^:依赖中所有元素
(5)简单的makefile
app:main.c add.c sub.c mul.c
(TAB缩进) gcc main.c add.c sub.c mul.c -o app
(6)第二个版本
app:main.o add.o sub.o mul.o
(TAB缩进) gcc main.o add.o sub.o mul.o -o app
main.o:main.c
(TAB缩进) gcc -c main.c
add.o:add.c
(TAB缩进) gcc -c add.c
sub.o:sub.c
(TAB缩进) gcc -c sub.c
mul.o:mul.c
(TAB缩进) gcc -c mul.c
(7)第三个版本
obj = main.o add.o sub.o mul.o
target = app
CC(大写) = gcc —————— makefile中自己的维护变量
CPPFLAGS = -I —————— makefile中自己的维护变量
$(target):$(obj) —————— $:取值符号
(TAB缩进) $(CC) $(obj) -o $(target)
%.o:%.c
(TAB缩进) $(CC) -c $< -o $@
来源:CSDN
作者:A浅末年华*¥
链接:https://blog.csdn.net/a2439943021/article/details/104024634