linux篇【3】:Linux 环境基础开发工具yum,vim,gcc,makefile,git

目录

一.Linux 软件包管理器 yum

1.什么是软件包

2.centos 7中安装形式

3.yum安装好处:

4.yum工具的常用选项

(1)yum list | grep sl        

软件包信息介绍:

(2)sudo yum install sl ——安装软件

(3)sudo yum remove sl ——卸载软件

5.yum相关命令

二.Linux编辑器-vim

1.vim是什么?

2.为什么要学vim?

3.vim的三种模式

(1)底行模式下的操作

(2)三种模式转换关系

4.命令模式下的文本批量化操作:

5.批量化操作

(1)批量化注释-视图模式

(2)批量化替换

6.整个代码编译的流程

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

g++下载命令:sudo yum install -y gcc-c++

编译过程:

gcc test.c -o mytest 把文件编译后放进 mytest中

1.预处理

预处理,编译,汇编,链接

2.头文件和库文件

3.动态/静态链接

下载代码:

四.Linux调试器-gdb调试器 使用

1.gdb binFile 退出: ctrl + d 或 quit 调试命令:

(1)gcc hello.c -o hello_g -g 转为debug版本

 (2)gdb hello_g 进行调试

(3)gdb下的list命令显示代码,简称 l 

回车默认是继续执行上一条指令,l 0 后 多次回车就会显示全部代码

(4)b 15 - 打断点在第15行(breakpoint), info b- 显示断点信息

 (5) d 1——1是第一个断点的断点序号 - 删除第几个断点(delete)

(6)r - 重新从头开始执行程序(run),会直接跳到第一个断点处, c - 从一个断点,之间跳转到另一个断点(continue) 相当于F5

(7)p 变量名 - 显示某变量的值

(8)display 变量名/&变量名 - 持续显示某变量的值/地址(相当于监视)

undisplay 序号 - 删除第几个变量名/&变量名

(9)n - 逐过程=F10(next),s - 逐语句=F11(step)进入函数

(10)until 行号 直接跳到第几行

(11)finish 完成当前函数并跳出

(12)bt——查看调用堆栈

五.Linux项目自动化构建工具-make/Makefifile

1.make与makefile:

2.makefile使用:

make的顺序

 3..PHONY 解释

makefile是如何识别我的exe/bin文件是新的还是旧的呢? ?

4.gcc -o $@ $^  

5.makeflie中编不过就加上 -std=c99

六.进度条小程序

1.缓冲区

2.回车\r vs换行

3.倒计时程序:

 4.进度条(需要usleep)

七.git

1.git,gitee,github介绍

2.git历史

3.如何使用gitee?

(1)git pull同步文件

4.注意事项

b:配置一下你的用户名和邮箱,目的:让文件内容可追溯。

git log可以查看作者信息:

C. gitignore:黑名单


一.Linux 软件包管理器 yum

1.什么是软件包

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

2.centos 7中安装形式

1.源码安装
2. rpm包安装
3.yum安装

3.yum安装好处:

1.不用编译源码
2.不用解决软件的依赖关系(此处作为了解)
如果我要知道我要安装什么软件,用yum可以很简单^

我们要安装别人的软件:
1.需要别人先把代码给我编译成为可执行程序
2.需要有人将编好的软件,放在用户能下载的地方(官网,应用软件市场)

Linux也是一样的!

手机安装示例:

 yum安装示例:yum类似于手机上的应用市场APP,迅雷这些安装软件

4.yum工具的常用选项

install 表示安装软件包

list 列出所有可供安装的软件包

search 搜索包含指定关键字的软件包

remove 卸载指定的软件包

(1)yum list | grep sl        

yum list:把yum包含的软件包都列出来。

yum list | grep sl :把yum包含的软件包中还有sl的软件包都列出来。

[zsh@ecs-78471 lesson6]$ yum list | grep sl
cyrus-sasl-lib.x86_64                    2.1.26-23.el7                 @anaconda
openssl.x86_64                           1:1.0.2k-24.el7_9             @updates 
openssl-libs.x86_64                      1:1.0.2k-24.el7_9             @updates 
python-slip.noarch                       0.4.0-4.el7                   @anaconda
python-slip-dbus.noarch                  0.4.0-4.el7                   @anaconda
rsyslog.x86_64                           8.24.0-57.el7_9.1             @updates 
slang.x86_64                             2.2.4-11.el7                  @anaconda
NetworkManager-adsl.x86_64               1:1.18.8-2.el7_9              updates  
NetworkManager-fortisslvpn.x86_64        1.2.8-7.el7                   epel     
NetworkManager-fortisslvpn-gnome.x86_64  1.2.8-7.el7                   epel     
aisleriot.x86_64                         1:3.22.2-1.el7                epel     
anope-openssl.x86_64                     2.0.10-1.el7                  epel     
apr-util-openssl.x86_64                  1.5.2-6.el7                   base     
autocorr-sl.noarch                       1:5.3.6.1-25.el7_9            updates  
batik-slideshow.noarch                   1.8-0.12.svn1230816.el7       base     
bitten-slave.noarch                      1:0.6-3.el7                   epel     
cgnslib.x86_64                           3.2.1-4.el7                   epel     
cgnslib-devel.x86_64                     3.2.1-4.el7                   epel     
cinnamon-translations.noarch             3.6.2-2.el7                   epel     
csslint.noarch                           0.10.0-2.el7                  epel     
cyrus-sasl.i686                          2.1.26-24.el7_9               updates  
cyrus-sasl.x86_64                        2.1.26-24.el7_9               updates  
cyrus-sasl-devel.i686                    2.1.26-24.el7_9               updates  
cyrus-sasl-devel.x86_64                  2.1.26-24.el7_9               updates  
cyrus-sasl-gs2.i686                      2.1.26-24.el7_9               updates  
………………

软件包信息介绍:

lrzsz.x86_64         0.12.20-36.el7         @base
lrzsz软件包名称        x86:适用的平台        _64:64位         "el7" 表示的是 centos7
base 表示的是 "软件源" 的名称
注意事项:
软件包名称: 主版本号.次版本号.源程序发行号-软件包的发行号.主机平台.cpu架构.
"x86_64" 后缀表示64位系统的安装包, "i686" 后缀表示32位系统安装包. 选择包时要和系统匹配.
"el7" 表示操作系统发行版的版本. "el7" 表示的是 centos7/redhat7. "el6" 表示 centos6/redhat6.
最后一列, base 表示的是 "软件源" 的名称, 类似于 "小米应用商店", "华为应用商店" 这样的概念

(2)sudo yum install sl ——安装软件

或sudo yum install sl.x86_64 ——安装sl

需要安装的几个软件:

①sudo yum install sl

②sudo yum install -y lrzsz

③sudo yum install -y epel-release(准官方服务器列表)

sudo yum install -y vim

(3)sudo yum remove sl ——卸载软件

sudo yum remove sl ——卸载sl这个软件

5.yum相关命令

yum makecache命令的功能是将服务器的软件包信息缓存到本地(yum工具在每次安装指定软件包的时候,都会检测源服务器上的软件包信息,为了便捷不用每次都去搜索软件包信息,因此使用 yum makecache将软件包信息缓存到本地,使用 yum clean all 清理老旧的缓存信息。)

yum search命令可以在所有软件包中搜索包含有指定关键字的软件包

yum clean all 命令可以清除缓存中老旧的头文件和软件包

yum -y update:升级所有包同时,也升级软件和系统内核;

yum -y upgrade:只升级所有包,不升级软件和系统内核,软件和内核保持原样。 

二.Linux编辑器-vim

1.vim是什么?

是一个编辑器

(1)只能用来写代码
(2)功能强大的多模式的编辑器

2.为什么要学vim?

有时候,需要我们在生成环境下,需要你快速的定位问题,甚至需要你快速的修改代码!

3.vim的三种模式

(其实有好多模式,目前掌握这3种即可)
命令模式(command mode(或 正常/普通/默认模式)
        功能:控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insert mode下,或者到 last line mode
插 入模式(Insert mode)
        只有在Insert mode下,才可以做文字输入,按「ESC」键可回到命令行模式。该模式是我们后面用的最频繁 的编辑模式。
底行模式(last line mode)(或末行模式)
        文件保存或退出,也可以进行文件替换,找字符串,列出行号等操作。 在命令模式下,shift+: 即可进入该模式。要查看你的所有模式:打开vim,底行模式直接输入(退出shift+: q,保存并退出shift+: wq)
替换模式:shift+r切换到替换模式,再输入就会直接覆盖已写内容

(1)底行模式下的操作

在末行模式下,键入:wq 保存并退出编辑,就算没有修改也会写入,并修改文件时间属性

在末行模式下,键入:q! 强制退出编辑,但并不保存当前修改

 在末行模式下,键入:x! 保存并退出编辑,仅当文件有修改时会保存,并修改文件时间属性

在编辑模式下,键入”ESC”键并非直接退出vi编辑,而是用于返回普通模式

(2)三种模式转换关系

命令模式——>插入模式
i:直接进入插入模式
a:从下一个字符进入插入模式
o:从下一行进入插入模式

温馨提示:任何模式想回到命令模式无脑esc

4.命令模式下的文本批量化操作:

yy:                         复制当前行,nyy——复制包括光标所在行的下面n行内容       

p:                        粘贴到当前行的后面,np——粘贴n次已复制的内容                         

dd:                        剪切(删除)当前行,ndd——剪切包括光标所在行的下面n行内容
u:                        撤销刚刚的操作(相当于vs下的ctrl+z)
ctrl+r:                        针对u操作,再次进行撤销(相当于vs下的ctrl+y)
shift+g:(就是G)            光标快速定位到文本末尾
gg:                                快速的将光标定位到文本的最开始
n+shift+g:                  光标快速定位到文本的第n行
shift+4:(4就是$)           光标快速定位到文本行的末尾
shift+6: (^)               光标快速 定位到文本行的开始          $^:通常叫锚点
w,b:                        向后(w),向前(b)在一行以单词为单位进行光标移动
h,j,k,l:                          h左,j下,k上,l右(光标的移动上下左右移动)
shift + ~ (esc下面) :        ~ 大小写快速切换
r+输入字符:                 替换光标所在的字符为输入字符, 支持nr——(把包括光标在内的后n个字符替换为n个相同字符)
shift+r:(R)                   批量化替换(写一个就覆盖一个原有内容)
x:                                删除光标所在的字符,nx——删除包括光标在内的后n个字符

s+AAA+yyy+g                vim编辑器中,将字符AAA全部替换成yyy(g比较常用,通常使用g表示全部替换,默认如果不给的话,表示只替换一次)

结论:vim更适合处理大型项目或者文件。

5.批量化操作

(1)批量化注释-视图模式

Esc到命令模式下在下面操作

批量化注释:输入法小写情况下,ctrl+v,hjkl选中区域,切换输入法大写,输入i,再输入 //, 最后esc即可

去注释:命令模式下,小写,ctrl + v,hjkl选中区域(注释区域),注意l向右移动直到选中两列 /,d。相当于删除操作。

(2)批量化替换

6.整个代码编译的流程

vim编辑文件,cat读文件,gcc mytest.c 编译文件,生成a.out文件,./a.out执行文件即可。

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

g++下载命令:sudo yum install -y gcc-c++

gcc只能编译c语言,g++能编译c语言和c++

编译过程:

gcc test.c -o mytest 把文件编译后放进 mytest中

1.预处理

gcc -E test.c -o test.i

vim test.i //进入test.i

 -E:从现在开始给我进行程序的翻译,当预处理完成,就停下来!

-o test.i:把预处理后的结果放进test.i中

如何查看预处理过程:底行模式下输入vs test.i 进入预处理后的结果

预处理,编译,汇编,链接

-E -S -c 可记作 ESc ,文件后缀 .i .s. o 记作 iso

 

2.头文件和库文件

头文件: 给我们提供了可以使用的方法,所有的开发环境,具有语法提示,本质是通过头文件帮我们搜索的! (比如给我们提供了printf这个方法)
库文件:给我们提供了可以使用的方法的实现,以供链接,形成我们自己的可执行程序!(比如给我们提供了printf这个方法的底层实现)

3.动态/静态链接

动态链接:自己的可执行程序的执行方法直接去库中找方法对应的程序执行(不发生拷贝,只发生关联)

优点:大家共享一个库,可以节省资源
缺点:一旦库缺失,会导致几乎所有的程序失效!
动态库:libxxx.so
 

静态链接:把库中的方法代码,直接拷贝到自己的可执行程序中去(发生拷贝,exe最终与库无关)

优点:不依赖任何库,程序可以独立执行
缺点:浪费资源

静态库:libxxx.a

gcc. g+ +编译的时候默认的链接模式:动态链接 (若想转为静态链接-需要加上static)
gcc/g++发布软件的默认方式: release (若想转为debug-需要加上 -g选项)

默认 gcc test.c -o mytest 是动态链接,gcc test.c -o mytest -static 是静态链接

 

 

 更推荐动态链接
默认一般而言,都没有自带静态库|

下载代码:

[root@ecs-78471 ~]# sudo yum install -y glibc-static


[root@ecs-78471 ~]# sudo yum install -y libstdc++-static

四.Linux调试器-gdb调试器 使用

vim:编辑器。gcc/g++:编译器。gdb:调试器-只能调试debug方式发布的软件 必须加-g选项

常用选项

1.gdb binFile 退出: ctrl + d quit 调试命令:

list/l 行号:显示binFile源代码,接着上次的位置往下列,每次列10行。[重要]
list/l 函数名:列出某个函数的源代码。
r或run:运行程序。[重要]
n 或 next:单条执行。[重要]
s或step:进入函数调用[重要]
break(b) 行号:在某一行设置断点[重要]
break 函数名:在某个函数开头设置断点
info break :查看断点信息。
fifinish:执行到当前函数返回,然后挺下来等待命令
print(p):打印表达式的值,通过表达式可以修改变量的值或者调用函数
p 变量:打印变量值。[重要]
set var:修改变量的值
continue(或c):从当前位置开始连续而非单步执行程序[重要]
run(或r):从开始连续而非单步执行程序
delete breakpoints:删除所有断点
delete breakpoints n:删除序号为n的断点[重要]
disable breakpoints:禁用断点
enable breakpoints:启用断点
info(或i) breakpoints:参看当前设置了哪些断点
display 变量名:跟踪查看一个变量,每次停下来都显示它的值
undisplay:取消对先前设置的那些变量的跟踪
until X行号:跳至X行
breaktrace(或bt):查看各级函数调用及参数
info(i) locals:查看当前栈帧局 部变量的值
quit :退出 gdb

(1)gcc hello.c -o hello_g -g 转为debug版本

①linux中默认生成的可执行程序是release版本,无法调试。直接gdb hello(默认形成的可执行程序无法调试)无法调试:

②debug版本比release版本大小要大,多出一些调试信息。

 ③gcc hello.c -o hello_g -g 中的-g是把release版本转为debug版本,debug版本可以调试。

c99就用:gcc hello.c -o hello_g -g -std=c99

 (2)gdb hello_g 进行调试

(3)gdb下的list命令显示代码,简称 l 

l 0:从第0行开始显示

回车默认是继续执行上一条指令,l 0 后 多次回车就会显示全部代码

(这个c语言代码是计算1~100相加,相加是5050)

 

(4)b 15 - 打断点在第15行(breakpoint), info b- 显示断点信息

 (5) d 1——1是第一个断点的断点序号 - 删除第几个断点(delete)

(6)r - 重新从头开始执行程序(run),会直接跳到第一个断点处, c - 从一个断点,之间跳转到另一个断点(continue) 相当于F5

 

(7)p 变量名 - 显示某变量的值

p result:查看result这个变量的值;p &result:查看result这个变量的地址;

(8)display 变量名/&变量名 - 持续显示某变量的值/地址(相当于监视)

undisplay 序号 - 删除第几个变量名/&变量名

(9)n - 逐过程=F10(next),s - 逐语句=F11(step)进入函数

(10)until 行号 直接跳到第几行

(这里的1:res=5050 是之前的display长显示)

(11)finish 完成当前函数并跳出

(12)bt——查看调用堆栈

s进入函数AddToTop,调用堆栈 显示main现在走到17行了,AddToTop函数停在第5行,但未执行第5行

五.Linux项目自动化构建工具-make/Makefifile

1.make与makefile:

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

 

makefile:在当前路径下的一个普通文件
1.依赖关系(我是爸爸的儿子)
2.依赖方法(所以爸爸给我打钱) 达到打钱的目的

目的:形成可执行程序

(1)依赖关系: mytest -> mytest.c 
(2)依赖方法: gcc mytest.c -o mytest

2.makefile使用:

touch一个Makefile(大小写都可),编写Makefile

mytest: mytest.c                       ①行 是依赖关系,mytest是目标文件,mytest.c是依赖文件列表     
        gcc mytest.c -o mytest          ②行 是依赖方法(以tab水平制表符起头,        是tab的意思)
.PHONY:clean                               ③行 伪文件(下有解释)
clean:                                             ④行 是孤儿式的依赖关系
        rm -f mytest                            ⑤行 是依赖方法                                                

写好后,以后直接make就可以按照依赖关系和方法进行编译,编译出可执行文件mytest。

删除要在Makefile中写伪文件③④⑤行,然后直接make clean就可以删除,如果直接rm可能会导致删除源文件,不能直接rm。

        

make的顺序

当交换mytest和clean的先后顺序后:make默认只会形成第一个目标文件,执行该依赖关系的依赖方法,如果把clean放在前面,单独make就是执行clean

 3..PHONY 解释

.PHONY:makefile语法格式中的一个关键字
clean被. PHONY修饰时,表明:总是被执行的
总是被执行的:无论目标文件是否新旧,照样直接执行依赖关系!

总是不被执行:如果文件已经执行过依赖方法,是新文件,makefile自动识别文件如果是最新文件,就不再执行依赖方法,因为这浪费时间浪费资源

建议把clean写成 总是被执行的 ,不建议把mytest设置成总是被执行,mytest设置成总是不被执行

总是不被执行 的示例:make生成可执行程序mytest一次以后,mytest是最新文件,makefile自动识别文件mytest是最新文件,再次make就不再生成mytest文件了,下面解释makefile如何自动识别的。

makefile是如何识别我的exe/bin文件是新的还是旧的呢? ?

先看补充内容

———————————————————————————————————————补充内容

stat mytest查看文件属性,linux下的文件通常有三个时间:

Access(访问时间):由于访问/修改内容/修改属性这些操作中,访问是最频繁的操作,如果每次访问或cat查看都修改访问时间的数据 效率低,所以linux内核设置的是积累一定的访问次数才会改变一次访问时间。
Modify(文件内容改变的时间):对文件内容修改,就会改变Modify时间

Change(文件属性改变时间):对文件属性修改,就会改变Change时间。对文件内容修改同时也会改变文件属性,则对文件内容修改,也会改变Change时间。

————————————————————————————————————————

现在回答:makefile是如何识别我的exe/bin文件是新的还是旧的呢? ?

答:根据对比源文件和可执行程序的最近修改时间(Modify),评估要不要重新生成。源文件mytest.c 的modify时间在未修改的情况下一定是比 可执行程序mytest 的modify时间早,如果makefile发现源文件mytest.c 的modify时间 早于 可执行程序mytest 的modify时间,说明mytest.c未被修改过,此时 可执行程序mytest 也是最新的,则不会再次生成可执行程序;如果makefile发现源文件mytest.c 的modify时间 后于 可执行程序mytest 的modify时间,说明mytest.c被修改过,此时 可执行程序mytest 是旧文件,则会再次生成可执行程序;

总是被执行的:无论目标文件是否新旧,照样直接执行依赖关系!

 

4.gcc -o $@ $^  

mytest: mytest.c                     
        gcc -o $@ $^               $@ 代表目标文件mytest,$^ 代表依赖文件列表 mytest.c 
.PHONY:clean                           
clean:                                           
        rm -f mytest 

5.makeflie中编不过就加上 -std=c99

myshell:myshell.c
	gcc -o $@ $^ -std=c99    //编不过就加-std=c99  
.PHONY:clean
clean:
	rm -f myshell

六.进度条小程序

1.缓冲区

示例:

上面代码的现象:有\n时,会立马显示hello 104,然后睡眠2秒结束;无\n时,会先睡眠2秒,然后显示hello 104结束;无\n时,执行顺序依然是从上到下,printf hello 104 先执行了,只是hello 104 没立即显示在屏幕上。因为无\n时在睡眠2秒期间,hello 104 先存在了缓冲区中,所以没立即显示在屏幕上。为什么呢?

缓冲区的理解:就是一段内存空间。

刷新策略:行刷新。        解释:程序中的打印数据先存到缓冲区中,等暂满一行就立马将内存中的空间显示出来,怎么定义一行内容呢?规定:“hello world\n”  \n 之前包含\n称为 一行内容

所以结论就是:“hello world\n”是一行内容,会直接显示;“hello world”不是一行内容,会先存到缓冲区中,sleep完才显示。

不想用\n,就想让你的数据立马刷新!用flush(stdout)

2.回车\r vs换行

回车(\r):将光标回到当前行的最开始
换行:新起一行
\n:回车\r+换行

\n会刷新缓冲区,\r不会刷新缓冲区。

3.倒计时程序:

sleep的头文件 #include <unistd. h>

如果不写 fflush ,那么\r不会刷新缓冲区,屏幕上不会打印任何东西。

fflush(stdout) ; 作用是立即刷新缓冲区。

 4.进度条(需要usleep)

usleep:1s=1000ms=100 0000 微秒 microsecond 例如:usleep(10000) 就是休眠10ms。

usleep的头文件也是 #include <unistd. h>

进度条总代码:

printf ("加载中: \033[46;34m%-100s\033 [0m[%d%%] [%c]\r", bar, cnt, lable[cnt%4]); 解释:

蓝色部分是进度条,橘黄色部分是加载值和转动光标,灰色是回车,其余部分都是颜色输出(格式如下)

七.git

1.git,gitee,github介绍

git是linux之父 雷纳斯托瓦兹 所写
什么是git:git是一个软件工具,版本控制器(类似于百度云盘):版本控制程序+网络(因为本地存储有丢失风险,所以网络 )

gitee,github基于git工具,搭建起来的网站

2.git历史

写git的作者和写linux操作系统的作者都是雷纳斯托瓦兹

3.如何使用gitee?

1. 建立gitee仓库
2. git clone
3. git add(git add *是添加所有文件,git add .是添加当前目录下未添加的文件)
4. git commit -m”写好你的日志”
5. git push

建立仓库

(1)git pull同步文件

如果在网页的gitee中修改了已提交文件的内容,远端和本地内容不相同,则下一次再提交新文件会出错,需要先把以前的文件同步,git pull同步文件

4.注意事项

a. sudo yum install -y git 下载git
b.第一次使用git的时候,可能会让你配置一下你的用户名和邮箱
C. gitignore:黑名单

b:配置一下你的用户名和邮箱,目的:让文件内容可追溯。

别人看不懂你的文件时,方便别人联系你。

git log可以查看作者信息:

C. gitignore:黑名单

gitignore中所写的带后缀文件不得提交,还可以自己写上哪些后缀文件是不可提交上去的

 *代表所有文件,*.x意思是所有后缀.x 的文件不可提交

猜你喜欢

转载自blog.csdn.net/zhang_si_hang/article/details/125909742