Linux中基础开发工具(yum,vim,gcc/g++,git,gdb/cgdb)
基础开发工具
- 软件包管理器
- yum具体操作
- 查看软件包
- 安装软件
- 卸载软件
- vim编译器
- vim的基本操作
- 命令模式
- 底行模式
- gcc/g++编译器
- gcc编译选项
- 预处理(进行宏替换/去注释/条件编译/头文件展开等)
- 编译(生成汇编)
- 汇编(生成机器可识别代码)
- 链接(生成可执行文件或库文件)
- 动静态库
- git
- 调试器-gdb/cgdb使用
- 铺垫
- 常见使用
- 常见技巧
- watch
- 条件断点
软件包管理器
包管理器类似于我们手机的应用商店,会自动解决包的依赖的问题!
yum(Centos) apt.apt-get(ubuntu)
1.网络下载
2.安装(就是拷贝):必须使用root权限
,安装到系统里,只安装一次,任何人都能使用
yum具体操作
查看软件包
通过yum list 命令
可以罗列出当前一共有哪些软件包。由于包的数量可能非常多,我们需要使用grep命令
只筛选出我们关注的包:
#Centos
$ yum list | grep lrzsz
lrzsz.x86_64 0.12.20-36.el7 @base
#Ubuntu
$ apt search lrzsz
Sorting... Done
Full Text Search... Done
cutecom/focal 0.30.3-1build1 amd64
Graphical serial terminal, like minicom
lrzsz/focal,now 0.12.21-10 amd64 [installed]
Tools for zmodem/xmodem/ymodem file transfer
$ apt show lrzsz
Package: lrzsz
Version: 0.12.21-10
Priority: optional
Section: universe/comm
Origin: Ubuntu
...
安装软件
通过yum
,我们可以通过很简单的一条命令完成gcc
的安装
# Centos
$ sudo yum install -y lrzsz
# Ubuntu
$ sudo apt install -y lrzsz
注意事项:
- 安装软件一般需要
sudo
或者root账户
下完成安装 yum/apt
安装软件只能一个装完了再装另一个
卸载软件
# Centos
$ sudo yum remove [-y] lrzsz
# Ubuntu
$ sudo apt remove [-y] lrzsz
vim编译器
vim的基本操作
- 进入vim,在系统提示符号输入vim及文件名称,就进入vim全屏幕编辑画面
$ vim test.c
进入vim后,是处于命令模式,要切换到插入模式才能输入文字
- 命令模式 ->插入模式
输入
a
进入插入模式后,是从目标光标所在位置的下一个位置开始输入文字
输入
i
进入插入模式后,是从光标当前位置开始输入文件
输入
o
进入插入模式后,是插入新的一行,从行首开始输入文字
- 插入模式->命令模式
ESC
- 命令模式->底行模式
shift+;
其实就是输入:
- 退出vim及保存文件,在命令模式下,按:进入底行模式
:w(保存当前文件)
:wq(保存并退出vim)
:q!(不保存,强制退出vim)
命令模式
- 移动光标
- vim可以直接用键盘上的光标上下左右移动,但正规的vim是用小写英文字母
h、i、j、k
分别控制光标左、下、上、右
移动一格 gg
(快速回归光标)G
(快速定位结尾)数字+G
(定位任意一行)$
(定位一行结尾)^
(定位一行开头)数字+w
(以单词为单位,向后移动)数字+b
(以单词为单位,向前移动)
- vim可以直接用键盘上的光标上下左右移动,但正规的vim是用小写英文字母
- 删除文字
x
(每按一次,删除光标所在位置的一个字符)X
(每按一次,删除光标所在位置的“前面”一个字符)dd
(删除光标所在行)
- 复制
yy
(复制光标所在行到缓冲区)p
(将缓冲区内的字符贴到光标所在位置。注意:所有与“y“有关的复制命令都必须与”p“配合才能完成复制与粘贴功能)
- 撤销(注意:一旦退出文件编辑,无法再进行撤销了,但至少保存,没有进行退出,可以撤销)
u
(撤销历史操作)ctrl+r
(撤销u操作)
- 替换
r
(替换光标所在字符,r->目标字符)数字+r
(替换n个字符)R
(替换光标所在之处的字符,直到按下ESC为止
- 大小写切换
shift+~
底行模式
- 保存文件 w
- 退出
- q(退出)
- q!(强制退出)
- shift+zz(快速退出)
set nu/nonu
(设置/取消行号)%s /printf/cout/
(批量化操作。将文件中的printf全部换成cout)ctrl+ww
(光标切换到另一个终端)vs新文件名
(打开分屏)- 跳到文件中的某一行
- #(#表示一个
数字
,在冒号后输入一个数字,再按回车键就会跳到该行了,如输入数字15,再回车,就会跳到文章的第15行)
- #(#表示一个
- 查找字符
/关键字
(先按/,再输入你想要寻找的字符,会向上搜索,如果第一次找的关键字不是你想要的,可以一直按n会往后寻找你要的关键字)?关键字
(先按?,再输入你想要寻找的字符,会向下搜索,如果第一次找的关键字不是你想要的,可以一直按n会往前寻找你要的关键字)
gcc/g++编译器
gcc编译选项
gcc [选项] 要编译的文件 [选项] [目标文件]
预处理(进行宏替换/去注释/条件编译/头文件展开等)
- 预处理指令是以
#
开头的代码行 - 实例:
gcc -E test.c -o test.i
- 选项
“-E”
:开始进行程序翻译,在预处理做完就停下 - 选项
“-o”
:是指目标文件,".i"
文件为已经预处理的cC原始程序
编译(生成汇编)
- 在这个阶段中,
gcc
首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc
把代码翻译成汇编语言 - 实例:
gcc -S test.i -o test.s
- 选项
"-S"
:只进行编译而不进行汇编,生成汇编代码
汇编(生成机器可识别代码)
- 汇编阶段是把编译阶段生成的
".s"
文件转成目标文件 - 在此时可使用选项
"-c"
将汇编代码转化成".o"
的二进制目标代码 - 实例:
gcc -c test.s -o test.o
链接(生成可执行文件或库文件)
- 在成功编译之后,就进入链接阶段
- 实例:
gcc test.o -o test
动静态库
动态库:linux(.so) windows(.dll)
静态库:linux(.a) windows(.lib)
动静态库对比
- 动态库形成的可执行程序体积很小
- 可执行程序对静态库的依赖性小(静态库只有在链接时有用,一旦形成可执行程序,就不需要了),动态库不能缺失
- 程序运行,需要加载到内存,静态库会在内存中出现大量重复的代码
- 动态链接,比较节省内存和磁盘资源
#打印程序或者库文件所依赖的共享库列表
$ ldd test
linux-vdso.so.1 (0x00007ffe5ac9e000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fc7d0f4b000)
/lib64/ld-linux-x86-64.so.2 (0x00007fc7d114c000)
#检查文件的路径以及名称
$ file test
test: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=ef0fbb96fabb036c5e3cbb7dc3009579628a9e48, for GNU/Linux 3.2.0, not stripped
git
git命令行安装
sudo apt install -y git
sudo yum install -y git
git 三板斧
git add 文件名/.
git commit -m "新增文件”
git push
补充:
- git status (查看当前状态)
- git log (查看日志)
- git pull (从远端拉下来)
- git提交的时候,只会提交变化的部分!
调试器-gdb/cgdb使用
铺垫
- 程序的发布方式有2种,
debug模式
和release模式
,linux gcc /g++
出来的二进制程序,默认是release
模式 - 要使用
gdb调试
,必须在源代码生成二进制程序的时候,加上-g
选项,如果没有添加,程序无法被编译
gdb下载
Ubuntu:sudo apt-get install -y cgdb
Centos: sudo yum install -y cgdb
$ gcc test.c -o test #默认模式,不支持调试
$ gcc test.c -o test -g #debug模式
常见使用
- 开始:
gdb binFile/可执行文件名
- 退出:
ctrl+d 或 quit 调试命令
常见技巧
watch
如果有一些变量不应该修改,但是你怀疑它修改导致了问题,你可以watch
它,如果变化了,就会通知你
(gdb) watch 变量名
条件断点
- 条件断点添加常见的两种方式:1.新增 2.给已有断点追加
新增
语法:b 行号/文件名:行号/函数名 if i==30(条件)
给已有追加
语法:condition 1 i==30
,其中1是已有断点编号,没有if