Linux:基础开发工具

1. 软件包管理器

(1) 什么是软件包

在Linux下安装软件,主要有以下方法

  1. 下载到程序的源代码,并进行编译得到可执行程序。

  2. 软件包安装-- 获取rpm安装包,用rpm指令安装

  3. 包管理器 yum(centos) apt/apt-get(ubuntu) 进行安装。(解决包的依赖问题)

软件包和软件管理器,类似于手机上的app和应用商店的关系。

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

而在Ubuntu上主要使用apt作为其包管理器。apt同样可以自动解决依赖关系、下载和安装软件包的功能。

(2) yum与apt的安装与删除

以下代码分别是yum与apt下载指定软件包的指令(package_name)是要下载的软件包执行后按y确认安装即可安装成功(安装和删除都需要root用户进行)

bash 复制代码
yum install package_name


apt-get install package_name

通过以下指令可以更新所有软件包

bash 复制代码
yum update


apt update

以下指令是yum与apt的删除软件包操作

bash 复制代码
yum remove package_name


apt purge package_name

以下指令是列出所有的可用的软件包

yum一般会列出:软件包的名称、软件包的版本号

apt默认情况下只列出软件包名称和版本

bash 复制代码
yum list available


apt list available
(3) 注意事项

关于yum与/apt的所有操作都必须保证主机(虚拟机)网络通畅。

可以通过ping指令来验证,结果如下所示

2. 编辑器 vim

(1). vim的概念

vim是vi的升级版本不仅兼容vi的所有指令,而且还有一些新的特性在里面。例如语法加亮便于阅读,不仅可以在终端运行也可以运行于windows,Macos等不同的操作系统,通用性强。

我们可以使用vim 文件名 来使用vim编辑器,如果文件名不存在,系统会自动创建。

vim常见的三种模式(有很多模式,目前掌握着三种)。分别是命令模式、插入模式、底行模式,各模式的功能区分如下:

正常/普通/命令模式(Normal mode)

控制屏幕光标的移动,字符,字或行的删除,移动复制某区段及进入Insert mode下,或者到last line mode

插入模式(Insert mode)

只有在Insert mode下,才可以做文字输入,按[ESC]键可回到命令行模式。该模式是我们后面用的最频繁的编辑模式。

末行(底行)模式(last line mode)

文件保存或退出,也可以进行文件替换,找字符串,列出行号等操作。

进入vim默认是命令模式

输入i或a或者o可以切换为插入模式,i a o的区别为

i:在当前光标处进入插入模式。

a:在当前光标的后一位置进入插入模式。

o:在当前光标处新起一行进入插入模式

我们按Esc键即可退出插入模式,再按下shift+; 即:即可进入底行模式。

若输入w(保存当前文件) wq(存盘并退出vim) q!(不存盘强制退出vim)就能保存退出

在命令模式下要查看你的所有模式:打开vim,底行模式直接输入

help vim - modes 即可

(2). vim的快捷键

命令模式

|---------|--------------------------------------------------------|
| h | 光标左移 |
| l | 光标右移 |
| j | 光标下移 |
| k | 光标上移 |
| G | 移动到文章的最后 |
| $ | 移动到光标所在行的行尾 |
| ^ | 移动到光标所在行的行⾸ |
| w | 光标跳到下个字的开头 |
| e | 光标跳到下个字的字尾 |
| b | 光标回到上个字的开头 |
| #l | 光标移到该行的第#个位置,如:5l,56l |
| gg | 进入到文本开始 |
| shift+g | 进⼊文本末端 |
| 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"可以执⾏ 多次回复 |
| ctrl+r | 撤销的恢复(撤销撤销操作) |
| cw | 更改光标所在处的字到字尾处 |
| c#w | c3w 表示更改3个字 |
| ctrl+g | 列出光标所在行的行号。 |
| #G | 15G 表示移动光标到第15行首。 |

底行模式

|----------|------------------------------------|
| set nu | 会在⽂件中的每⼀行前面列出行号 |
| set nonu | 取消显示行号 |
| # | #表示⼀个数字,再按回车键就会跳到该行 |
| /关键字 | 先按/,再输入想寻找的字符,若第一次找的关键字不是想要的按n往后寻找 |
| ?关键字 | 先按?再输入想寻找的字符,若第一次找的关键字不是想要的按n往后寻找 |
| w | 保存文件 |
| q q! | 强制离开vim |
| wq | 退出并保存 |

vim还可以进行各种配置,可以通过各种教程配置

3. 编译器 gcc/g++

gcc一般编译C语言,g++一般编译C++

要经过:预处理--->编译--->汇编--->链接四个阶段,可以参考这篇了解程序的编译与链接-CSDN博客

使用格式

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

以下是常用选项

•-E 只激活预处理,这个不生成文件,你需要把它重定向到⼀个输出文件里面

• -S 编译到汇编语⾔不进行汇编和链接

• -c 编译到目标代码

• -o 文件输出到⽂件,该选项后需紧跟输出文件名.。不指定就为a.out文件

• -static 此选项对⽣成的⽂件采用静态链接

• -g 生成调试信息。GNU调试器可利用该信息。

• -shared 此选项将尽量使⽤动态库,所以⽣成文件比较小。

• -O0/O1/O2/O3 编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高

• -w 不生成任何警告信息。

• -Wall 生成所有警告信息。

利用gcc/g++编译完成后,使用 ./生成的可执行文件 即可执行文件。

4. 自动化构建 make/Makefile

(1). make与Makefile的概念

一个工程中的源文件很多,Makefile定义了一系列规则来指定,哪些文件需要先编译,哪些文件需要重新编译,以及其它更复杂的功能操作。

其好处就是自动化编译,写好之后,只需要一个make命令,整个工程完全自动编译,提高开发效率。

make是一个命令工具,用来解释Makefile中指令的命令工具,一般来说,大多数IDE都有这个命令,比如:Delphi的make,Visual C++的n make,Linux下GNU的make。可见,makefile很常见。

make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建

(2). 基本使用
bash 复制代码
test:test.cpp
	g++ -o test test.cpp
.PHONY:clean
clean:
	rm -f test

我们上面的文件test,它依赖test.cpp

g++ -o test test.cpp 就是与之对应的依赖方法(开头必须用TAB开头,不可用四个空格)

依赖文件列表可以是空的

clean这种,没有被第一个目标直接或间接关联,那么它后面所定义的命令不会被自动执行,但是可以显式执行。即上面的 make clean。来清除所有的目标文件。以便重编译。

我们加上.PHONY修饰就将其设置成了伪目标,伪目标的特性是,总能被执行

比如

执行完make后是不能再执行make的,但是我们改变一下Makefile中的内容

cpp 复制代码
.PHONY:test                                                                                            
test:test.cpp
    g++ -o test test.cpp
.PHONY:clean
clean:
    rm -f test

就可以了

我们推导一下

cpp 复制代码
test:test.o
    g++ test.o -o test
test.o:test.s
    g++ -c test.s -o test.o
test.s:test.i                                                                                                  
    g++ -S test.i -o test.s
test.i:test.cpp
    g++ -E test.cpp -o test.i
.PHONY:clean
clean:
    rm -f *.i *.s *.o test                               

上面递归实现了编译全过程,当然实际没有必要这样写。

(3). make的工作

在默认方式下,即只输入make命令

  1. make会在当前目录下找名字叫"Makefile"或"makefile"的文件。

  2. 如果找到,它会找文件中的第一个目标文件(target),在上面会找到test,并作为最终的目标文件。

  3. 如果test文件不存在,或者test所依赖的后面的test.o文件的文件修改时间要比test这个文件新(可以用touch进行测试),那么他就会执行后面所定义的命令来生成test这个文件

  4. 如果test所依赖的test.o文件不存在,那么make会在当前文件中找目标为test.o文件的依赖性,如果找到则再根据那一个规则生成test文件。(有点类似于一个堆栈的过程)

  5. 当然,.c文件和.h文件是存在的,于是make会生成test.o文件,再用test.o文件声明make的终极任务,即执行文件。

  6. 这就是整个make的依赖性,make会一层一层的去找文件的依赖关系,知道最后编译出第一个目标文件。

  7. 在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错。而对于所定义的命令的错误或编译不成功,make不管。

makefile(M可以大写也可以小写)文件也可以简写为:

  1. $@ :表示依赖关系中的目标文件(冒号左侧)。

  2. $^ :表示依赖关系中的依赖文件列表(冒号右侧全部)。

  3. $< :表示依赖关系中的第一个依赖文件(冒号右侧第一个)。

5. git

为了方便管理与保存代码我们就需要使用git。git实际上就是一个代码托管平台。

git的使用步骤

1. 下面分别是Ubuntu与Centos的下载指令
bash 复制代码
sudo apt install git

sudo yum install git
2. 在gitee上创建一个仓库
3. 将仓库克隆到本地

在linux中执行以下指令

bash 复制代码
git clone 链接

我们要将刚创建的仓库克隆到本地,将上面链接处设置上对应的链接就可以了。

4. 设置全局git邮箱和用户
bash 复制代码
git config --global user.email "you@example.com"
git config --global user.name "Your Name"

上面双引号填自己邮箱,下面填自己的名字即可。

5. 将要上传的代码拷贝到此路径
6. 通过指令上传代码

先通过以下代码将文件添加到暂存区

bash 复制代码
git add 文件名

在使用以下指令将暂存区文件提交到本地仓库

bash 复制代码
git commit -m "提交的内容信息"

最终通过以下指令,再输入gitee用户名与密码后将本地推送到远程仓库

bash 复制代码
git push
7. 查看日志与删除远端仓库文件

(1). 查看日志输入以下指令即可

cpp 复制代码
git log

(2). 删除远端仓库文件

例如删除test文件

依次输入以下指令

bash 复制代码
git rm test

git commit -m "测试删除"

git push

实现如下所示

上面还通过 git status 来看了当前文件状态与之前提交的区别,上图绿色字体即为区别

6. 调试器------gdb

程序的发布方式有两种,debug模式和release模式,Linux gcc/g++出来的二进制程序默认是release模式的。我们必须在源代码生成二进制程序时加上-g选项,如果没有添加,程序无法被编译。

bash 复制代码
gcc test.c -o test
//默认模式不支持调试

gcc test.c -o test -g
//debug模式支持调试

可以通过 gdb 调试文件 调试目标文件。

gdb binFile

|------------------------|-----------------------------------------------|--------------------------|
| 命令 | 作用 | 使用 |
| gdb binFile | 打开 | 略 |
| list/l | 显示源代码,从上次位置开始,每次列出10行 | list/l 10 |
| list/l 函数名 | 列出指定函数的源代码 | list/l main |
| list/l 文件名:行号 | 列出指定的源代码 | list/l test.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 |
| printf/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 l |
| disble breakpoints | 禁用所有断点 | disble 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或ctrl+d | 退出GDB调试器 | |
| watch | 监视一个表达式(如变量)的值,这个值在程序运行期间的值发生变化,会暂停程序执行并通知使用者 | watch r |
| set var 变量=值 | 更改一个变量看是否是因为这个变量报错 | set var f=1 |
| | | |

相关推荐
A charmer19 分钟前
Linux 进程入门:带你走进操作系统的核心地带(1)
linux·运维·服务器
金增辉21 分钟前
Linux 虚拟机与windows主机之间的文件传输--设置共享文件夹方式
linux·运维·服务器
爬楼的猪2 小时前
Ubuntu Bash工具
linux·ubuntu·bash
步、步、为营2 小时前
任务调度系统Quartz.net详解2-Scheduler、Calendar及Listener
服务器·.net
928-y3 小时前
CentOS离线安装gcc环境(附安装包+图文并茂)
linux·运维·centos
訾博ZiBo3 小时前
CentOS 使用 yum 方式安装 Nginx
linux·nginx·centos
泷羽Sec-pp3 小时前
基于Centos 7系统的安全加固方案
java·服务器·前端
东华果汁哥3 小时前
【centos8 ES】Elasticsearch linux 龙晰8操作系统安装
linux·elasticsearch·jenkins
IT 古月方源3 小时前
GRE技术的详细解释
运维·前端·网络·tcp/ip·华为·智能路由器
CHANG_THE_WORLD3 小时前
Linux 基础 6.进程
java·linux·运维