Linux基础开发工具使用(yum,vim,gcc/g++,gdb,make,git)

一.Linux 软件包管理器 yum

(1).软件包和软件包管理器

Linux下载软件的三种方式
1).源码安装
2).rpm安装包(未解决软件的依赖关系)
3).通过yum进行安装软件

在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序.
但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安装程序)放在一个服务器上, 通过包管理器可以很方便的获取到这个编译好的软件包, 直接进行安装.
软件包和软件包管理器, 就好比 “App” 和 “应用商店” 这样的关系.

yum(Yellow dog Updater, Modified)是Linux下非常常用的一种包管理器. 主要应用在Fedora, RedHat,
Centos等发行版上

(2).ping指令

关于 yum 的所有操作必须保证主机(虚拟机)网络畅通!!!
可以通过 ping 指令验证
在这里插入图片描述

(3).查看软件包

通过 yum list 命令可以罗列出当前一共有哪些软件包. 由于包的数目可能非常之多, 这里我们需要使用 grep 命令只筛选出我们关注的包。

yum list | grep lrzsz

在这里插入图片描述
注意事项:

1). 软件包名称: 主版本号.次版本号.源程序发行号-软件包的发行号.主机平台.cpu架构.
2). “x86_64” 后缀表示64位系统的安装包, “i686” 后缀表示32位系统安装包. 选择包时要和系统匹配.
3). “el7” 表示操作系统发行版的版本. “el7” 表示的是 centos7/redhat7. “el6” 表示 centos6/redhat6.
4). 最后一列, base 表示的是 “软件源” 的名称, 类似于 “小米应用商店”, “华为应用商店” 这样的概念

(4).安装软件

通过 yum, 我们可以通过很简单的一条命令完成 gcc 的安装

sudo yum install 软件包名称

yum 会自动找到都有哪些软件包需要下载, 这时候敲 “y” 确认安装,出现 “complete” 字样, 说明安装完成。

注意事项:
1).安装软件时由于需要向系统目录中写入内容, 一般需要 sudo 或者切到 root 账户下才能完成.

2).yum安装软件只能一个装完了再装另一个. yum正在安装一个软件的过程中, 如果再尝试用yum安装另外一个软件, yum会报错.

补充 : cilent 怎么知道包服务器在哪里?
client 已经配置了目的服务器,以及目的软件源信息,那么软件源信息在哪里呢?

yum的相关配置信息
在这里插入图片描述
yum源中的镜像 url 存放软件源信息

在这里插入图片描述

安装扩展源(非官方的软件)

sudo yum install -y epel-release

(5).卸载软件

sudo yum remove 软件包名称

二.Linux编辑器-vim使用

(1).vim基本概念

我们重点讲解vim的三种模式(其实有好多模式,目前掌握这3种即可),分别是命令模式(command mode)、插入模式(Insert mode)和底行模式(last line mode),各模式的功能区分如下:

正常/普通/命令模式(Normal mode)
控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insert mode下,或者到 last line mode

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

底行模式(last line mode)
文件保存或退出,也可以进行文件替换,找字符串,列出行号等操作。 在命令模式下,shift+: 即可进入该模式。

要查看你的所有模式:打开vim,底行模式直接输入
help vim-modes

(2).vim模式切换

1).进入vim,在系统提示符号输入vim及文件名称后,就进入vim全屏幕编辑画面:

$ vim test.c

不过有一点要特别注意,就是你进入vim之后,是处于[命令模式],你要切换到[插入模式]才能够输入文字

2). [命令模式]切换至[插入模式]

输入a : 从目前光标所在位置的下一个位置开始输入文字
输入i : 从光标当前位置开始输入文件
输入o : 插入新的一行,从行首开始输入文字

3).[插入模式]切换至[命令模式]

按 esc 键

4). [命令模式]切换至[底行模式]

「shift + ;」

5).退出vim及保存文件

在[正常模式]下,按一下「:」冒号键进入[底行模式]
输入 w (保存当前文件)
输入wq (存盘并退出vim)
输入q! (不存盘强制退出vim)

在这里插入图片描述

(3).vim命令模式命令集

(1).移动光标

[h]、[j]、[k]、[l],分别控制光标左、下、上、右移一格
按「G」:移动到文章的最后
按[gg]:进入到文本开始
按「 $ 」:移动到光标所在行的“行尾”
按「^」:移动到光标所在行的“行首”
按「w」:光标跳到下个字的开头
按「e」:光标跳到下个字的字尾
按「b」:光标回到上个字的开头
按「#l」:光标移到该行的第#个位置,
按「ctrl」+「b」:屏幕往“后”移动一页
按「ctrl」+「f」:屏幕往“前”移动一页
按「ctrl」+「u」:屏幕往“后”移动半页
按「ctrl」+「d」:屏幕往“前”移动半页

(2).复制

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

(3).撤销上一次操作

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

(4).删除文字

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

(5).替换

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

(6).更改

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

(7).跳至指定的行

[ctrl] +[g] : 列出光标所在行的行号。
[#G] :例如,[10G],表示移动光标至文章的第10行行首

(8).多行注释,取消注释

多行注释
1). [ctrl] + [v] 进入可视模式
2). [h],[l],[j] ,[k] 进行选择
3). [shift + i] 进入插入模式
4). 输入 //
5). 按 [esc]

取消注释
1). [ctrl] + [v] 进入可视模式
2). [h],[l],[j] ,[k] 进行选择
3). 按 [d]

[shift] + [ ~ ] : 大小写切换

(4).vim底行模式命令集

(1).列出行号

[set nu]: 输入「set nu」后,会在文件中的每一行前面列出行号
[set nonu] : 取消行号

(2).跳到文件中的某一行

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

(3). 不退出vim执行命令行命令

[:!cmd] : 不退出vim执行命令行命令

(4).分屏

[: vs 文件名] : 分屏

(5).光标在多屏幕下进行切换

[ ctrl + 2次w] : 光标在多屏幕下进行切换

(6).查找字符

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

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

三. Linux编译器gcc/g++的使用

我们都知道文本变成可执行程序需要经历以下4个步骤,预处理,编译,汇编,链接,接下来,我们将通过这4个阶段来学习gcc/g++的使用

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

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

(1).预处理

预处理阶段主要所做的四件事情如下 :

1).头文件展开

使用 gcc -E test.c -o test.i 将 test.c 文件预处理以后重定向到 test.i 中,然后我们对比 test.c 和 test.i 文件,观察可知,预处理之后,编译器将系统中 /usr/include/stdio.h 文件内容拷贝到 test.i 中
在这里插入图片描述

2).去掉注释
在这里插入图片描述

3).宏替换
在这里插入图片描述

4).条件编译

在这里插入图片描述在这里插入图片描述

(2).编译

注 : 编译,汇编,链接的分析使用的是如下代码

#include<stdio.h>
#define os 0                                                                                                          
int main()
{
    
    
 #if os
    printf("hello Linux!\n");
 #else
    printf("hello Windows!\n");
 #endif
  return 0;
}

编译的目的是将代码编译成汇编语言

使用 gcc -S test.i -o test.s 命令
在这里插入图片描述

(3).汇编

汇编的目的是生成二进制的机器指令(目标文件)

使用 gcc -c test.s -o test.o 命令
在这里插入图片描述

(4).链接

如果我们使用了库函数,那么在目标文件中,只存在函数调用,没有函数实现,链接的过程本质是将自己调用的过程和具体的实现过程关联起来

使用 gcc test.o -o test 命令

补充 :
1). ldd 命令可以用来查看可执行程序所依赖的库
2). 库的名称是由 lib + name + 后缀(.a/.so) 组成
3). 在Linux CentOS下,以 .so 结尾的是动态库,以 .a 结尾的是静态库
4). 在 Window 下,以 .dll 结尾的是动态库,以 .lib 结尾的是静态库

在这里插入图片描述

我们在写代码时使用了 printf 函数,该函数的实现在 C库中

(5).动态库,静态库

库是一批代码实现和使用说明的结合,最大意义是减少当前开发的工作量,也是软件分工的具体表现

都有什么库 : 动态库(.so),静态库(.a)

静态库是指编译链接时,把库文件的代码全部加入到可执行文件当中,因此生成的文件比较大,但在运行时也就不再需要库文件了,静态库一般以.a为后缀。
动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件当中,而是在程序运行时由链接文件加载库,这样可以节省系统的开销,动态库一般以.so为后缀。

动态链接
优点 :省空间(磁盘的空间,内存的空间),程序体积小,加载速度快
缺点 :依赖动态库,程序运行可移植性较差

静态链接
优点: 不依赖第三方库,程序运行可移植性较好
缺点:浪费空间(磁盘的空间,内存的空间),程序体积大,加载速度慢

gcc 生成可执行程序,默认是动态链接的
在这里插入图片描述在这里插入图片描述

四.Linux调试器gdb使用

debug模式 : 程序本身会被加入调试信息,可调试
release模式 : 不会添加任何调试信息,不可调试

centos7 gcc中默认生成的可执行程序是 release 版本的,不可调试
如果我们想调试某程序,应使用 -g 选项 ,即 gcc test.c -o mytest_g -g
readelf 命令可用来查看可执行程序的段信息,我们从中也可看出

1). gcc 默认生成的可执行程序是没有任何调试信息的(release),不可调试
2). debug版由于加入了调试信息,比release版的大小大
在这里插入图片描述

gdb 的使用

1). list(l) 行号 :显示binFile源代码,接着上次的位置往下列,每次列10行。
在这里插入图片描述

2). list(l) 函数名:列出某个函数的源代码。
在这里插入图片描述

3). r或run :运行程序。
4). n 或 next(逐过程):单条执行。
5). s或step(逐语句):进入函数调用
6). break(b) 行号:在某一行设置断点
在这里插入图片描述

7). info break :查看断点信息。
在这里插入图片描述

8). finish:直接执行完当前函数返回,然后停下来等待命令
在这里插入图片描述

9). continue(或c):从当前位置跳到下一个断点处在这里插入图片描述

10). p 变量:打印变量值。
在这里插入图片描述

11). delete breakpoints(d breakpoints):删除所有断点
在这里插入图片描述

12). delete n(d n) :删除序号为n的断点
在这里插入图片描述

13). display + 变量名:跟踪查看一个变量,每次停下来都显示它的值
在这里插入图片描述

14). undisplay + 序号名:取消对先前设置的那些变量的跟踪
在这里插入图片描述

15). until + 行号:跳至某行
在这里插入图片描述

16). quit:退出gdb

在这里插入图片描述

五.Linux自动化构建工具 make/Makefile

(1).背景

我们在 Windows 环境下,使用 vs 多文件编程时,我们不用关心哪些文件先编译,哪些文件后编译,链接时是哪些文件互相链接,这些文件与文件之间的关系是由 vs 帮我们解决好了,而在Linux中,这些都是由用户自己去决定的

我们在进行多文件编程时,有两种生成可执行程序的方式
1).

 gcc -o mytest test1.c test2.c .........

2).

gcc -c test1.o test1.c
gcc -c test2.o test2.c
..........
gcc -o mytest test1.o test2.o .......

建议使用第二种方式,原因如下 :
如果在众多文件中有一个文件被改动了,第一种方式需要将所有的文件重新编译链接,第二种方式只需要重新编译被改动的文件即可

可如果我们所写的项目中有上百个源文件,那我们岂不是要写上百条命令,这时候 make/makefile 就登场了

注意 :

(1). 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作

(2). makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。

(3). make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。

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

(2).依赖关系和依赖方法

依赖关系 : mytest 依赖于 test.o ,test.o 依赖于 test.s ,test.s 依赖于 test.i ,test.i 依赖于 test.c

依赖方法 : 如何从 test.o 变成 mytest,如何从 test.s 变成 test.o,如何从 test.i 变成 test.s,如何从 test.c 变成 test.i

工程是需要被清理的,像clean这种,没有被第一个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动执行,不过,我们可以显示要make执行。即命令——“make clean”,以此来清除所有的目标文件,以便重新编译。但是一般我们这种clean的目标文件,我们将它设置为伪目标,用 .PHONY 修饰,伪目标的特性是,总是被执行的。

Makefile文件

mytest:test.o
	gcc -o mytest test.o // 要用Tab键
test.o:test.s
	gcc -o test.o -c test.s
test.s:test.i
	gcc -o test.s -S test.s
test.i:test.c
	gcc -o test.i -i test.c
	
.PHONY:clean // 伪目标
clean:
	rm -f test.i test.s test.o mytest
// mytest:main.o test.o 先编译 main.c test.c
mytest:test.o main.o  // 先编译 test.c main.c 
	gcc -o mytest test.o main.o
test.o:test.c
	gcc -c test.c
main.o:main.c
	gcc -c main.c

.PHONY:clean
clean:
	rm *.o mytest

$@ : 依赖关系中的目标文件
$^ : 依赖关系中的依赖文件列表
$< : 依赖关系中的一个依赖文件

因此,以上代码可简写为

mytest:test.o main.o
	gcc -o $@ $^
test.o:test.c
	gcc -c $<
main.o:main.c
	gcc -c $<

.PHONY:clean
clean:
	rm *.o mytest

在这里插入图片描述

六. git

(1).git的起源

Linus在1991年创建了开源的Linux,从此,Linux系统不断发展,已经成为最大的服务器系统软件了。

Linus虽然创建了Linux,但Linux的壮大是靠全世界热心的志愿者参与的,这么多人在世界各地为Linux编写代码,那Linux的代码是如何管理的呢?

事实是,在2002年以前,世界各地的志愿者把源代码文件通过diff的方式发给Linus,然后由Linus本人通过手工方式合并代码!

你也许会想,为什么Linus不把Linux代码放到版本控制系统里呢?不是有CVS、SVN这些免费的版本控制系统吗?因为Linus坚定地反对CVS和SVN,这些集中式的版本控制系统不但速度慢,而且必须联网才能使用。有一些商用的版本控制系统,虽然比CVS、SVN好用,但那是付费的,和Linux的开源精神不符。

不过,到了2002年,Linux系统已经发展了十年了,代码库之大让Linus很难继续通过手工方式管理了,社区的弟兄们也对这种方式表达了强烈不满,于是Linus选择了一个商业的版本控制系统BitKeeper,BitKeeper的东家BitMover公司出于人道主义精神,授权Linux社区免费使用这个版本控制系统。

安定团结的大好局面在2005年就被打破了,原因是Linux社区牛人聚集,不免沾染了一些梁山好汉的江湖习气。开发Samba的Andrew试图破解BitKeeper的协议(这么干的其实也不只他一个),被BitMover公司发现了(监控工作做得不错!),于是BitMover公司怒了,要收回Linux社区的免费使用权。

Linus可以向BitMover公司道个歉,保证以后严格管教弟兄们,嗯,这是不可能的。实际情况是这样的:

Linus花了两周时间自己用C写了一个分布式版本控制系统,这就是Git!一个月之内,Linux系统的源码已经由Git管理了!

(2).git的功能

张三团队开发发布了一个项目,在项目被人使用的过程中,有人发现了一些bug,向张三团队提出,于是张三团队新建了一个分支,将源项目代码复制过来,修正好bug且测试通过,然后合并分支(分支管理),张三团队给这个项目增加了一些新功能,但又不想原来的项目版本丢失,于是在每次开发新版本时,张三团队都会记录下做了哪些改动(版本控制),而且开发过程中,每人负责不同的模块开发,开发完成后,将自己的代码提交到本地仓库,同步到远程仓库(多人协作),这些都是使用 git 做到的。

git 的功能
1).版本控制
2).分支管理
3).多人协作

在这里插入图片描述

(3).使用git提交代码

(1).git clone
在这里插入图片描述

(2).git add
(3).git commit
(4).git push

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/DR5200/article/details/119281380