Bootstrap

Linux:基础开发工具

目录

软件包管理器yum

什么是软件包?

查看软件包

安装软件

卸载软件

vim

vim的基本操作

gcc/g++使用

预处理

编译

汇编

连接

make/Makefile

.PHONY伪目标

 定义使用变量

版本控制器Git

安装git

git的使用

git add

git commit

git push

git pull

git status

git log

调试器 - gdb/cgdb使用

基本使用 

watch

set var 

条件断点


软件包管理器yum

什么是软件包?

在Linux下我们该怎么下载安装软件?

一个常用的方法就是下载到程序的源代码,然后进行编译就能得到可执行程序

但是这样做太过麻烦了,于是就有一些人把一些常用的软件提前编译好做成软件包(windows的安装程序)放在一个服务器上,通过包管理器就可以很方便的获取到这个编译好的软件包,则可以直接进行安装

软件包和软件包管理器的关系类似于:

App和应用商店

 而yum就是在Linux下常用的一种包管理器,主要用于Centos,RedHat,Fedora等发行版上

注意: 

关于yum的所有操作必须保证主机网络畅通

可以通过ping指令验证

ping www.baidu.com

查看软件包

我们可以使用一个指令查看所有的软件包

yum list

但是由于软件包特别多,建议用grep过滤后再查看, 例如查看lrzsz

yum list | grep lrzsz

安装软件

 通过yum,我们可以用一行简单的命令来完成对软件包的安装(以安装lrzsz为例)

root用户:

yum install lrzsz

普通用户

sudo yum install lrzsz

这时候要输入root的密码,也就是说只有root才能对系统安装软件

因为按照这些软件也许是需要在根目录进行安装的,而有根目录安装权限的只有root

接下来yum会自动找到有哪些软件包需要安装,这时候需要敲"y"(yes)确认安装,也可以敲"n"(no)不安装

出现complete则表示安装完成

卸载软件

root用户:

yum remove lrzsz

普通用户

sudo yum remove lrzsz

具体原理和上面的安装软件类似

vim

vim的基本操作

【正常模式】切换至【插入模式】

输入a/i/o进入【插入模式】

  • 按「i」切换进入插入模式「insert mode」,按“i”进入插入模式后是从光标当前位置开始输入文件
  • 按「a」进入插入模式后,是从目前光标所在位置的下一个位置开始输入文字
  • 按「o」进入插入模式后,是插入新的一行,从行首开始输入文字

移动光标

  • vim可以直接用键盘上的光标来上下左右移动,但正规的vim是用小写英文字母「h」、「j」、「k」、
  • l」,分别控制光标左、下、上、右移一格
  • 按「G」:移动到文章的最后
  • 按「 $ 」:移动到光标所在行的行尾
  • 按「^」:移动到光标所在行的行首
  • 按「w」:光标跳到下个字的开头
  • 按「e」:光标跳到下个字的字尾
  • 按「b」:光标回到上个字的开头
  • 按「#l」:光标移到该行的第#个位置,如:5l,56l
  • 按[gg]:进入到文本开始
  • 按[shiftg]:进入文本末端
  • 按「ctrl+b」:屏幕往移动一页
  • 按「ctrl+f」:屏幕往移动一页
  • 按「ctrl+u」:屏幕往移动半页
  • 按「ctrl+d」:屏幕往移动半页

删除文字

  • x」:每按一次,删除光标所在位置的一个字符
  • #x」:例如,「6x」表示删除光标所在位置的后面(包含自己在内)”6个字符
  • X」:大写的X,每按一次,删除光标所在位置的前面一个字符
  • #X」:例如,「20X」表示删除光标所在位置的前面”20个字符
  • dd」:删除光标所在行
  • #dd」:从光标所在行开始删除#

 复制

  • yw」:将光标所在之处到字尾的字符复制到缓冲区中
  • #yw」:复制#个字到缓冲区
  • yy」:复制光标所在行到缓冲区
  • #yy」:例如,「6yy」表示拷贝从光标所在的该行往下数”6行文字
  • p」:将缓冲区内的字符贴到光标所在位置。注意:所有与“y”有关的复制命令都必须与“p”配合才能完成复制与粘贴功能

替换

  • r」:替换光标所在处的字符
  • R」:替换光标所到之处的字符,直到按下「ESC」键为止

撤销上一次操作

  • u」:如果您误执行一个命令,可以马上按下「u」,回到上一个操作。按多次“u”可以执行多回复
  • ctrl + r: 撤销的恢复

更改

  • cw」:更改光标所在处的字到字尾处
  • c#w」:例如,「c3w」表示更改3个字

跳至指定的行

  • ctrl+g」列出光标所在行的行号
  • #G」:例如,「15G」,表示移动光标至文章的第15行行首

【正常模式】切换至【末行模式】

输入[shift + :]也就是[:]进入【末行模式】

列出行号

  • set nu: 输入「set nu」后,会在文件中的每一行前面列出行号

跳到文件中的某一行

  • #:#」号表示一个数字,在冒号后输入一个数字,再按回车键就会跳到该行了,如输入数字15, 再回车,就会跳到文章的第15

查找字符

  • /关键字」: 先按「/」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按n」会往后寻找到您要的关键字为止。
  • ?关键字」:先按「?」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直 按「n」会往前寻找到您要的关键字为止

保存文件

  • w: 在冒号输入字母「w」就可以将文件保存起来

离开vim

  • q」:按「q」就是退出,如果无法离开vim,可以在「q」后跟一个「!」强制离开vim
  • wq」:一般建议离开时,搭配「w」一起使用,这样在退出的时候还可以保存文件

【插入模式】/ 【末行模式】切换至【正常模式】

输入ESC即可切换回正常模式

gcc/g++使用

格式:

gcc [选项] 要编译的文件 [选项] [目标文件]

 gcc选项

  • -E 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面
  • -S  编译到汇编语言不进行汇编和链接
  • -c  编译到目标代码
  • -o 文件输出到文件
  • -static 此选项对生成的文件采用静态链接
  • -g 生成调试信息,GNU调试器可利用该信息
  • -shared 此选项将尽量使用动态库,所以生成文件比较小,但是需要系统由动态库.
  • -O0
  • -O1
  • -O2
  • -O3 编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高
  • -w  不生成任何警告信息
  • -Wall 生成所有警告信息

我们知道一段代码要生成可执行程序需要分四个阶段:预处理、编译、汇编、连接,我们可以使用上面对应的选项生成

口诀:ESc

预处理

gcc –E hello.c –o hello.i

编译

gcc –S hello.i –o hello.s

汇编

gcc –c hello.s –o hello.o

连接

gcc hello.o –o hello

make/Makefile

make是一个命令,makefile是一个文件

makefile带来的好处就是自动化编译,一旦makefile里面的内容写好,只需要一个make命令就可以让整个工程完成自动编译,极大的提高了软件开发的效率

例如:

code:code.c
    gcc -o code code.c

第一行表示依赖关系,第二行表示依赖方法

code是目标文件,code.c是源文件

code依赖于code.c

而所以code生成的方法就是第二行的gcc命令

这就是一段简单的makefile文件的内容,后续我们只需要在命令行输入一个make,即可自动生成code可执行程序

这里也有段简单的写法

code:code.c
    gcc -o $@ $^

$@表示目标文件(:左边的文件),$^表示源文件(:右边的文件) 

.PHONY伪目标

code:code.c
    gcc -o code code.c

.PHONY:clean
clean:
    rm -f code

上面两行和上面一样,可以make生成code

工程是需要清理的

最后两行多出的功能是在命令行中输入make clean可以自动执行rm -f code

像clean这种没有被第一个目标文件直接或间接联系,那么它后面所定义的命令不会被自动执行,但是我们可以显示要make执行(make clean),以此来清楚所有的目标文件,以便重编译

但是一般这种clean的目标文件,我们可以将它设置为伪目标(倒数第三行)

伪目标的特性是:总是被执行的

一串命令并不是一定会被执行的,例如gcc -o code code.c命令

系统会根据code.c的修改时间和code的生成时间进行比较,若code.c的修改时间比code早,那么再次gcc可能不会重新生成code

为什么我们要重新生成code?

就像编译器中的重新生成解决方案的功能类似

若是我们给code也带上伪目标呢?

.PHONY:code
code:code.c
    gcc -o code code.c

那么code就可以"总是被执行",系统就不会根据这些时间关系来决定是否要重新生成方案

 定义使用变量

BIN=proc.exe
CC=gcc
SRC=myproc.c
FLAGS=-o
RM=rm -f

$(BIN):$(SRC)
@$(CC) $(FLAGS) $@ $^
@echo "linking ... $^ to $@"
.PHONY:
clean:
@$(RM) $(BIN)
@echo "remove ... $(BIN)"

这些都是定义变量,这里定义了5个变量

使用方法:$(变量名)

这样也可以做到一样的效果,具体好处就和平时写代码的宏定义差不多

版本控制器Git

我们在编写文档的时候,为了防止文档丢失,更改失误后能够回到原来的版本,我们需要在原来的版本的时候复制一个文档出来

为了能够更方便我们管理这些不同版本的文件,便 有了版本控制器

目前主流的版本控制器就是Git

Git可以控制电脑上所有格式的文件,用Git就可以帮助我们管理软件开发项目中的源代码文件

安装git

// centos等
yum install git
// ubuantu等
apt install git

git的使用

首先我们需要在gitee或者github创建一个仓库 

在仓库内我们需要拿到仓库的链接(点击克隆/下载)

第一行https就是我们需要的链接 

接下来需要在Linux本地创建好一个放置代码的目录

 

将刚刚的仓库克隆过来

git clone [url]

 url是我们刚刚复制的仓库链接

这样我们目录下就多了我们的仓库,就能看到我们仓库目前已有的内容了

如果我们想将文件上传到git备份,我们需要先将文件拷贝到我们刚刚克隆过来的目录下,然后使用下面的三板斧即可 

git add

git add [⽂件名]

将需要用git管理的文件告知git 

git commit

git commit -m "XXX"

commit相当于我们对刚刚add的文件进行一个描述(提交日志)

描述的内容就是""内的内容,该内容应当详细 

git push

git push

同步到远端服务器上

git pull

git pull

当我们的仓库在别处上传了文件但当前目录下并没有此文件时,我们push文件的时候就会出错

原因是我们目前的仓库和在git管理的仓库已经发生了改动,我们这时候就需要pull拉取仓库更新的内容,这样就能恢复正常使用了

git status

git status

如果我们忘记了当前git做到了哪一步,我们可以使用git status来看当前git的状态

git log

git log

log就是日志

我们可以用它来看当前仓库曾经的各种上传记录及描述

调试器 - gdb/cgdb使用

gdb和cgdb调试器的用法几乎相同,但cgdb的使用比较方便,可以可视化代码

首先需要先安装cgdb

sudo yum install -y cgdb
sudo apt-get install -y cgdb

当我们生成了一个可执行程序文件时,我们就可以用gdb/cgdb来调试该代码了

注意:

该代码编译时必须使用-g选项生成调试信息,否则会按照relese来编译,就无法调试

gcc -o test -g test.c
g++ -o test -g test.cpp

基本使用 

开始:

// binfile表示可执行程序
gdb binfile
cgdb binfile

退出:

Ctrl + d 或 quit调试命令

 

命令
作⽤
样例
list/l
显⽰源代码,从上次位置开始,每次列出
10⾏
list/l 10
list/l 函数名
列出指定函数的源代码
list/l main
list/l ⽂件名:⾏号
列出指定⽂件的源代码
list/l mycmd.c:1
r/run
从程序开始连续执⾏
run
n/next
单步执⾏,不进⼊函数内部        
next
s/step
单步执⾏,进⼊函数内部
step
break/b [⽂件名:]⾏号
在指定⾏号设置断点
break 10
break test.c:10
break/b 函数名
在函数开头设置断点
break main
info break/b
查看当前所有断点的信息
info break
finish
执⾏到当前函数返回,然后停⽌
finish
print/p 表达式
打印表达式的值
print start+end
p 变量
打印指定变量的值
p x
set var 变量=值
修改变量的值
set var i=10
continue/c
从当前位置开始连续执⾏程序
continue
delete/d
breakpoints
删除所有断点
delete breakpoints
delete/d
breakpoints n
删除序号为n的断点
delete breakpoints 1
disable breakpoints
禁⽤所有断点
disable breakpoints
enable breakpoints
启⽤所有断点
enable breakpoints
info/i breakpoints
查看当前设置的断点列表
info breakpoints
display 变量名
跟踪显⽰指定变量的值(每次停⽌时)
display x
undisplay 编号
取消对指定编号的变量的跟踪显⽰
undisplay 1
until X ⾏号
执⾏到指定⾏号
until 20
backtrace/bt
查看当前执⾏栈的各级函数调⽤及参数
backtrace
info/i locals
查看当前栈帧的局部变量值
info locals
quit
退出GDB调试器
quit

watch

watch可以监视一个表达式、变量的值

如果监视的表达式、变量的值发生变化,gdb/cgdb会暂停程序的执行,并通知使用者

watch 变量

set var 

set var可以让我们在调试中暂时修改某个表达式、变量的值,以确定是否是因此发生的错误

set var 变量=值

条件断点

b 9 if i == 30

 b 9表示在第9行打断点,如果 i == 30则断点触发


;