Bootstrap

Linux中基础开发工具(yum,vim,gcc/g++,git,gdb/cgdb)

软件包管理器

包管理器类似于我们手机的应用商店,会自动解决包的依赖的问题!
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(以单词为单位,向前移动)
  • 删除文字
    • 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
;