alin的学习之路(Linux系统编程:三)(vim,gcc,库,gdb)
1.vim的使用
vim有三种模式:命令模式,末行模式,编辑模式
-
光标的移动【命令模式】
- h 向左 ,j 向下,k 向上,l 向上
- 移动到行首:^ 移动到行末:$
- 移动到屏幕顶部:H 移动到屏幕中间:M 移动到屏幕底部:L
- 移动到文件顶部:gg 移动到文件底部:G
-
**自动调整格式:**G=gg
-
剪切粘贴【命令模式】
- dd剪切一行,p粘贴到光标所在的下一行
- ndd 剪切多行,p粘贴到光标所在的下一行
- 选中剪切
- 选中多行:大写 V 选中后按d剪切,p 粘贴到光标所在的下一行
- 选中多个字符:小写 v 选中后按d剪切,p 粘贴到光标所在的下一行
- 取消选中:ESC
-
撤销与反撤销【命令模式】
- 撤销:u
- 反撤销:Ctrl+r
-
拷贝粘贴【命令模式】
- yy 拷贝一行,p粘贴到光标所在的下一行
- nyy 拷贝多行,p粘贴到光标所在的下一行
- 选中拷贝
- 选中多行:大写 V 选中后按d剪切,p 粘贴到光标所在的下一行
- 选中多个字符:小写 v 选中后按d剪切,p 粘贴到光标所在的下一行
- 取消选中:ESC
-
查找替换【末行模式】
- 查找替换规则:{范围}s/{被替换内容}/{替换成为的内容}/替换标志
- 范围:行范围。表示:1,10 表示第一行到第10行,%表示整个文件,点(.)表示当前行
- 替换及被替换内容:字符串
- 替换标志:不写替换标志模式替换每行的第一个对应字符串,替换标志 g 表示替换每行的全部对应字符串
- 末行模式输入
noh+回车
取消高亮
- 查找替换规则:{范围}s/{被替换内容}/{替换成为的内容}/替换标志
-
代码注释【命令模式】
- 方法1:
- 添加注释:V 选中要添加注释的行,按gc完成添加注释
- 取消注释:V 选中要添加注释的行,按gc完成取消注释
- 方法2:
- 添加注释:按 Ctrl+v 进入视图模式,竖着选择要添加的行的行首,按 I (大写字母 i )后输入//,按ESC
- 取消注释:按 Ctrl+v 进入视图模式,竖着选择要取消注释行的 // ,按d删除//即可
- 方法1:
-
分屏
- 同时打开多个文件并分屏
- vim -O 文件名 文件名 …… :水平打开显示多个文件
- vim -o 文件名 文件名 …… :垂直打开显示多个文件
- 在编辑过程中,通过分屏打开新的文件【末行模式】
- sp 文件名:垂直打开/创建另一个文件
- vsp 文件名:水平打开/创建另一个文件
- 使用可分屏显示的终端
- 同时打开多个文件并分屏
2.gcc
-
概述
- GCC 原名叫做 GNU C Compliler
- GNU:GNU is no Unix
- GCC 理解的误区:gcc 只能编译c代码,g++只能编译cpp程序。
- 如果你的程序是C文件,gcc 就会当做c文件编写,g++会把该文件当做cpp文件编译。
- 如果是CPP文件,gcc 和 g++ 都会当做 c++文件编写。
- g++在编译程序文件时,会先调用 gcc 进行编译,最后链接的时候使用 g++完成链接。
-
gcc 重要选项
- 预处理:-E 条件编译,头文件展开,删除注释,生成扩展名 .i 的C文件
- 编译:-S 语法检查,生成扩展名为 .s 汇编文件
- 编译:-c 将汇编文件转换为二进制指令文件,生成扩展名为 .o 的目标文件
- 链接:寻找库代码,链接库代码,给程序添加启动代码
- -o 编译后的文件名
-
其他重要选项
- -g 生成调试信息,添加后可以使用 gdb 调试工具,例如:gcc -g main.c
- -w 不显示警告信息
- -Wall 显示全部警告信息
- -I(大写的字母 i )指定包含的头文件的路径
- -D 编译时指定一个宏定义、宏常量,例如:gcc main.c -D DEBUG
- -std 设置编译时的语言版本
- C: c89/c90、c99、c11
- C++90、c++11、C++17
- gcc -std=c90 main.c gcc -std=c99 main.c gcc -std=c++11 main.c
g++ -std=c++11 main.c
3.静态库和动态库的制作和使用
库主要分为两类:静态库、动态库(共享库)。
- 静态库在编译的时候,需要将库中的代码拷贝到可执行文件中。动态库并不需要将代码拷贝可
执行文件中,运行时,需要保证库的存在。 - 如果一个软件使用的静态库,那么当库更新时,整个程序都需要重新编译,对于用户而言,就
需要重新下载程序安装。动态库相反。
1.静态库
-
命名规则:lib+静态库名+.a,例如:库名cal,libcal.a
-
静态库的制作过程:
- 先将 .c 代码编译成 .o 文件 :
gcc -c *.c
- 将 .o 文件使用特殊的方式压缩到一起生成静态库文件:
ar rcs 库的名字 *.o
- r 表示把.o文件插入库中
- c表示创建库文件
- s创建文件索引,创建较大的库时可以加快速度
- 查看库中的模块:ar -t 库名:
ar -t libcal.a
- 先将 .c 代码编译成 .o 文件 :
-
静态库的使用:
在静态库创建后,要将静态库和头文件一并交给用户
- 在源文件中包含头文件
- 在链接时指定静态库即可
- 例如:
gcc main.c -o main -I include/ -lcal -L mylib/
- -l(小写字母 l)紧跟库名(区别lib和.a),-I 指定头文件路径,-L指定静态库库的路径
- 生成的可执行文件可以正常运行并输出结果则成功
2.动态库
动态库命名规则:lib+动态库名+.so
-
动态库的制作过程:
- 将 .c 文件编译成 .o 文件,生成与位置无关的代码:
gcc -c *.c -fPIC -I include/
- 使用 .o 文件生成动态库:
gcc -shared -o libcal.so *.o
- nm -D libcal.so 查看动态库的符号表
- 将 .c 文件编译成 .o 文件,生成与位置无关的代码:
-
动态库的使用:
- 在源文件中包含头文件
- 源文件编译的时候要指定动态库:
gcc main.c -I mylib/include/ -lcal -L mylib/
- 查看可执行程序所依赖的库:
ldd 可执行程序
,可以查看该可执行文件的依赖库有哪
些,并且查看是否能够连接到。 - 编译的时候指定了动态库,只是检查动态库是否存在
- 程序运行时,必须告诉程序动态库在哪个目录下(即配置动态库路径),才能正常运行
-
配置动态库路径:
-
方法1:去环境变量:LD_LIBRARY_PATH 所保存的目录中查找动态库。
- 在终端执行命令: export LD_LIBRARY_PATH=/home/itcast/mylib:$LD_LIBRARY_PATH ,只会
临时有效,下次登录进来该变量就会被删除。 - .bashrc 是用户的配置文件,该文件在每次登录时都会被执行一遍。在该文件中最
后增加配置内容: export LD_LIBRARY_PATH=/home/itcast/mylib:$LD_LIBRARY_PATH ,然
后使用 source ./.bashrc,使得该配置文件有效。
- 在终端执行命令: export LD_LIBRARY_PATH=/home/itcast/mylib:$LD_LIBRARY_PATH ,只会
-
方法2:在另外一个文件中配置
-
在 /etc/ld.so.conf.d/ 目录中创建一个 任意名.conf 文件(需要root借用权限)
-
在该文件中写下动态库的绝对路径
-
sudo ldconfig 使文件生效
-
动态库的默认搜索路径是:/lib /usr/lib。将动态库文件拷贝到这两个目录其中一个下亦可
-
4.gdb调试
GDB 是在 Unix Like 下的代码调试工具,可以使得代码单行调试。
使用前如未安装需要安装:sudo apt install gdb
-
调试前的准备工作:在调试前要对源文件进行编译形成可执行文件,且要让可执行文件包含调试信息,使用 gcc 的 -g 选项
gcc -g -Wall main.c -o main
-
启动调试:
gdb 可执行文件
,只是准备开始调试,并未开始调试 -
添加断点和删除断点:
- 添加断点:break 可简写为 b 。break 行号、break 文件:行号、break 函数名
- 查看断点:info break 可简写为
i b
- 删除断点:delete 断点编号,可简写为 del 断点编号。clear 行号,clear 函数名。delete 删除所有断点
-
使程序运行起来,开始调试:
- run 执行到一个断点
- start 在程序的第一行添加一个断点,使程序停在第一行
- quit 退出调试
-
代码执行:
- 逐语句:step 可简写为 s , 遇到函数会进入函数,包括printf函数也会进入
- 逐过程:next 可简写为 n ,遇到函数不进入,直接执行
- 逐断点:continue 可简写为 c ,直接执行到下一个断点
- 跳出:finish 可简写为 fin,直接执行到函数结束并跳到上一级函数
- gdb 清屏:Ctrl+l (小写字母 l )
- 显示当前调试行前后的代码:list 可简写为 l
-
调试过程中查看变量的值
-
print 变量名 ,打印变量当前的值
-
print &变量名,打印变量的地址
-
display 变量:对变量添加监控,代码执行一次,该变量的值就打印一次
-
undisplay 变量编号:取消变量监控
-
查看监控变量编号:info display
-
带字符图形界面的gdb调试
- 启动调试
gdbtui 可执行文件
或gdb -tui 可执行文件
进入调试界面 - 当调试的时候会出现:gdb 的输出和程序的输出占用同一个终端界面,导致字符界面扭曲。将
gdb 和程序输出转向到另外一个终端窗口中即可。- 首先,开启一个新的终端,并在终端中输入命令:tty,该命令会显示窗口标识。
- 在 run 和 start 执行之前,输入命令:tty 【另外一个窗口的标识】,将该窗口输出内容
重定向到另外一个窗口。