【Linux篇】:Linux常用工具全解析--探索高效的工具宝藏 ...

打印 上一主题 下一主题

主题 1023|帖子 1023|积分 3069

✨感谢您阅读本篇文章&#xff0c
;文章内容是个人学习笔记的整理&#xff0c
;如果哪里有误的话还请您指正噢✨
✨ 个人主页:余辉zmh–CSDN博客
✨ 文章所属专栏:c
++篇–CSDN博客
  [align=c
enter
][img]https://i-blog.c
sdnimg.c
n/dir
ec
t/29541f4e18f34344b78e496e49aee28c
.gif#pic
_c
enter
[/img]

  
一.Linux软件包管理器-yum

在平常利用的电脑windows操作系统下&#xff0c
;通常可以安装各种软来满意用户的需求&#xff0c
;而Linux作为操作系统同样也可以安装各种软件来满意平常的工作需求。
在Linux下安装软件&#xff0c
;一个通常的办法是下载到步调的源代码&#xff0c
;然后编译形成可执行文件&#xff0c
;得到可执行步调。但是这样做太贫苦&#xff0c
;于是有些人把一些常用的软件提前编译好&#xff0c
;做成软件包(可以理解为windows上的安装步调)放在一个服务器上&#xff0c
;通过软件包管理器就可以很方便的获取到这个编译好的软件包&#xff0c
;直接进行安装。
软件包和软件包管理器就好像手机中的应用市场和应用软件APP之间的关系。
而yum(全程Yellowdog Updater
Modified)&#xff0c
;就是一款Linux下的软件包管理器&#xff0c
;可以主动处理依赖关系(在Linux操作系统中的各种软件之间可能存在各种依赖关系)&#xff0c
;支持软件包的安装&#xff0c
;更新&#xff0c
;删除&#xff0c
;查询等。
yum基本命令



  • 查看软件
    通过yum list命令可以罗列出当前操作系统下一共有哪些安装包&#xff0c
    ;但是由于安装包数目过多&#xff0c
    ;可以通过利用行过滤gr
    ep来筛选出目标软件包。
    [c
    ode]yum list | gr
    ep [目标软件]
    eg:
    yum list | gr
    ep gc
    c

    [/c
    ode] [align=c
    enter
    ][img]https://i-blog.c
    sdnimg.c
    n/dir
    ec
    t/26c
    0258e171448c
    884c
    aff647a45b50b.png#pic
    _c
    enter
    [/img]
(背面另有很多软件包信息&#xff0c
;这里没有截完)。


  • 安装软件
    选项-y可带可不带&#xff0c
    ;不带会直接安装不进行扣问。
    [c
    ode]yum install (-y) [目标软件]
    eg:
    yum install gc
    c

    [/c
    ode] 在安装软件时&#xff0c
    ;如果是在超等用户上&#xff0c
    ;可以直接安装没有限制&#xff0c
    ;安装后&#xff0c
    ;由超等用户创建的平常用户同样可以利用对应的的安装软件。但是如果是直接在平常用户上安装&#xff0c
    ;需要利用sudo获取对应的权限
    [c
    ode]sudo yum install (-y) [目标软件]
    [/c
    ode]
  • 删除软件
    选项-y同样可带可不带&#xff0c
    ;不带会直接删除不进行扣问。
    [c
    ode]yum r
    emove (-y) [目标软件]
    eg:
    yum r
    emove gc
    c

    [/c
    ode] 同样&#xff0c
    ;超等用户删除软件没有限制&#xff0c
    ;平常用户删除软件需要获取对应的权限
    [c
    ode]sudo yum r
    emove (-y) [目标软件]
    [/c
    ode]
补充一个知识点:sudo对一条命令提取权限
当平常用户对一条命令提取权限时&#xff0c
;如果没有在系统对应的白名单中是无法提取权限的&#xff0c
;会发出警告:
[align=c
enter
][img]https://i-blog.c
sdnimg.c
n/dir
ec
t/882bee1c
60e1441c
94dfd9967d5ba23f.png#pic
_c
enter
[/img]
因此平常用户利用sudo指令时&#xff0c
;需要先在对应的白名单中加入平常用户名。
利用超等用户查看对应的白名单etc
/sudoer
s:
[align=c
enter
][img]https://i-blog.c
sdnimg.c
n/dir
ec
t/685f876183b041fbaa3b7163b4b26086.png#pic
_c
enter
[/img]
在/etc
/sudoer
s文件第一百行中可以看到白名单中的用户信息&#xff0c
;将要添加的用户添加到背面即可(这里需要利用vim编辑&#xff0c
;背面会讲到)。
[align=c
enter
][img]https://i-blog.c
sdnimg.c
n/dir
ec
t/9fc
a3e01abe3482fb43e69355628f858.png#pic
_c
enter
[/img]
二.Linux编辑器-vim

vim是一款Linux下的编辑器&#xff0c
;可以用来文本编写&#xff0c
;也就是写代码&#xff0c
;vim是一个多模式的编辑器&#xff0c
;每个模式下都有对应的功能以及操作&#xff0c
;这里重点讲解三种模式:命令模式&#xff0c
;插入模式&#xff0c
;底行模式

通过输入指令即可进入对应的编辑:
[c
ode]vim [目标文件]
[/c
ode]

  • 命令模式(Nor
    mal mode)

    通过指令进入编辑后&#xff0c
    ;默认就是命令模式&#xff0c
    ;该模式是控制屏幕光标的移动;字符&#xff0c
    ;行大概块的删除&#xff0c
    ;复制&#xff0c
    ;拷贝等等&#xff0c
    ;在当前模式下用户所有的输入都会被当作命令&#xff0c
    ;一般不会作为文本输入。
  • 插入模式(Inser
    t mode)

    只有在插入模式下&#xff0c
    ;才可以进行文本输入&#xff0c
    ;如果要退出当前模式&#xff0c
    ;按ESC即可&#xff0c
    ;推出后会回到命令模式。从命令模式切换到插入模式需要按i键。
  • 底行模式(Last line mode)
    用于文件的生存大概推出&#xff0c
    ;也可以进行文件替换&#xff0c
    ;找目标字符串&#xff0c
    ;列出行号等等。如果要退出当前模式&#xff0c
    ;还是按ESC即可&#xff0c
    ;推出后会回到命令模式。从命令模式再切换到底行模式需要按shift+;键&#xff0c
    ;实在就是:键。
上面三种模式只是最常用到的模式&#xff0c
;并不是只有这三种模式。根据上面的讲解&#xff0c
;可以知道命令模式是默认模式&#xff0c
;同时也是基本模式&#xff0c
;从命令模式可以切换到其他模式&#xff0c
;其他模式退出后会回到命令模式。
1.vim命令模式常用命令



  • 移动光标
[c
ode]按[gg]:
定位光标到最开始行

按[shift+g](G):
定位光标到结尾行

按[n(指定行号)+shift+g](n+G):
定位光标到任意行

按[shift+$]:
定位光标到当前行结尾

按[shift+^]:
定位光标到当前行开始

按[w]:
光标跳转到下一个字的开头

:
光标跳转到上一个字的开头

按[e]:
光标跳转到下一个字的结尾

按[h/j/k/l]:
光标上下左右移动
[/c
ode]

  • 复制粘贴
[c
ode]按[(n) yy]:
复制光标所在行或者n行

按[(n) p]:
粘贴(n行)到当前光标所在行的下一行
[/c
ode]

  • 删除剪切
[c
ode]按[(n) x]:
对光标之后的字符或者n个字符进行删除

按[(n) dd]:
删除并拷贝当前光标所在行或者n行&#xff0c
;如果删除拷贝后在其他行粘贴就是剪切操作&#xff0c
;如果删除拷贝后没有粘贴就是删除操作
[/c
ode]

  • 替换
[c
ode]按[shift+~]:
对光标字符进行大小写转换

按[(n) r
]:
对光标字符或者n个字符进行批量化替换

按[shift+r
](R):
进入替换模式&#xff0c
;对内容进行整体替换
[/c
ode]

  • 撤销
[c
ode]按:
撤销上一个操作

按[c
tr
l+r
]:
撤销之前的撤销
[/c
ode] 2.vim底行模式常用命令



  • 列出和去掉行号
[c
ode]调出行号:
set nu

去掉行号:
set nonu
[/c
ode]

  • 生存文件
[c
ode]将当前文件中的内容保存:
w

强制保存:
w!
[/c
ode]

  • 退出vim
[c
ode]直接退出vim:
q

保存并退出:
wq

强制退出:
q!

强制保存并推出:
wq!
[/c
ode]

  • 查找字符
[c
ode]先按[/]键&#xff0c
;然后输入要查找的字符&#xff0c
;如果第一次找到的不是想要的关键字&#xff0c
;可以一直按[n]&#xff0c
;会往后寻找&#xff0c
;知道找到想要的关键字为止:
/+关键字

先按[?]键&#xff0c
;然后输入要查找的字符&#xff0c
;如果第一次找到的不是想要的关键字&#xff0c
;可以一直按[n]&#xff0c
;会往前寻找&#xff0c
;知道找到想要的关键字为止:
?+关键字
[/c
ode] 三.Linux编译器-gc
c
/g++


gc
c
编译器是用于C语言文件的编译&#xff0c
;而g++则是用于C++文件的编译&#xff0c
;这两个的利用方法完全相同&#xff0c
;学会一个另一个就会利用&#xff0c
;这里以gc
c
为例:
gc
c
指令格式

[c
ode]gc
c
[选项] [要编译的文件] [选项] [目标文件]
[/c
ode] 编译文件形成可执行文件并不是一次性的直接形成&#xff0c
;而是经过四个阶段预处理&#xff0c
;编译&#xff0c
;汇编&#xff0c
;毗连
&#xff0c
;才最终形成了可执行文件。
1.预处理



  • 功能
    预处理阶段重要功能包括进行宏替换&#xff0c
    ;头文件展开&#xff0c
    ;去掉解释&#xff0c
    ;条件编译等。
  • 指令
    [c
    ode]gc
    c
    -E [要预处理的文件:xxx.c
    ] -o [形成的目标文件:xxx.i]
    [/c
    ode]
  • 选项作用
    [-E]选项的作用是让gc
    c
    从现在开始进行步调的翻译&#xff0c
    ;在预处理工作完成后就停止编译过程;[-o]选项是指天生目标[.i]文件,[.i]文件为已经经过预处理阶段的原始步调。
  • 示例
    图片左边为要编译的.c
    文件&#xff0c
    ;右边为已经完成预处理阶段的.i文件&#xff0c
    ;右边文件中的行数在经过头文件展开后酿成了八百多行&#xff0c
    ;红色方框中的解释也已经去掉&#xff0c
    ;绿色方框中的宏也已经完成替换
    [align=c
    enter
    ][img]https://i-blog.c
    sdnimg.c
    n/dir
    ec
    t/bbc
    357c
    da41148fbb4c
    a90b3c
    6a9e455.png#pic
    _c
    enter
    [/img]
这里补充一下关于头文件的知识:为什么能够在windows大概Linux操作系统上进行C大概C++大概其他情势的开发呢?
这是因为我们的系统中一定要提前大概后续安装上&#xff0c
;C/C++开发相关的头文件和库文件。C/C++开发环境不仅仅指的是vs&#xff0c
;gc
c
&#xff0c
;g++等编译工具&#xff0c
;更重要的是&#xff0c
;语言本身的头文件和库文件!
实在之前在安装vs2019大概vs2022的时候&#xff0c
;选择对应的开发包&#xff0c
;同时也在下载对应的头文件和库文件&#xff0c
;编译型语言安装开发包&#xff0c
;必定是下载安装对应的头文件和库文件。
2.编译



  • 功能
    在编译阶段&#xff0c
    ;gc
    c
    首先要查抄代码的规范性&#xff0c
    ;是否有语法错误等&#xff0c
    ;如果出现错误&#xff0c
    ;就会报出编译错误。在查抄无误后&#xff0c
    ;gc
    c
    就会把代码翻译成汇编语言。
  • 指令
    [c
    ode] 要编译的文件可以是xxx.c
    &#xff0c
    ;也可以是xxx.i
    gc
    c
    -S [要编译的文件:xxx] -o [目标文件:xxx.s]
    [/c
    ode]
  • 选项作用
    [-S]选项的作用是让gc
    c
    在编译阶段完成后停止整个编译过程&#xff0c
    ;具体要编译文件可以是[.c
    ]大概[.i]文件;[-o]选项的作用是指天生目标文件[.s]&#xff0c
    ;[.s]文件是已经完成预处理和编译两个阶段的文件。
  • 示例
    [align=c
    enter
    ][img]https://i-blog.c
    sdnimg.c
    n/dir
    ec
    t/f7e56daf2d46487696c
    4ec
    b764c
    b97f9.png#pic
    _c
    enter
    [/img]
3.汇编



  • 功能
    汇编阶段是将编译阶段天生的[.s]文件转化为机器可以识别的代码
  • 指令
    [c
    ode]要汇编的文件可以是xxx.c
    文件也可以是xxx.i文件也可以是xxx.s文件
    gc
    c
    -c
    [要汇编的文件:xxx] -o [目标文件:xxx.o]
    [/c
    ode]
  • 选项作用
    [-c
    ]选项的作用是让gc
    c
    在汇编阶段完成后停止整个编译过程&#xff0c
    ;具体要汇编文件可以是[.c
    ]大概[.i]文件大概[.s]文件;[-o]选项的作用是指天生目标文件[.o]&#xff0c
    ;[.o]文件是已经完成预处理&#xff0c
    ;编译以及汇编三个阶段的文件。
  • 示例
    [align=c
    enter
    ][img]https://i-blog.c
    sdnimg.c
    n/dir
    ec
    t/ad226c
    61ddac
    4776b7c
    8b7b87b6002b6.png#pic
    _c
    enter
    [/img]
4.毗连



  • 功能
    将汇编文件与库文件进行毗连天生可执行文件
  • 指令
    [c
    ode]要连接的文件可以是xxx.c
    ,也可以是xxx.i,也可以是xxx.s,也可以是xxx.o文件
    gc
    c
    [要连接的文件:xxx] -o [目标文件:xxx]
    [/c
    ode]
  • 选项作用
    因为毗连是四个阶段的末了一个阶段&#xff0c
    ;所以不需要类似于[-E]和[-S]等选项;[-o]选项的作用是指天生目标文件&#xff0c
    ;该文件是已经完成四个阶段的可执行文件。
  • 示例
    [align=c
    enter
    ][img]https://i-blog.c
    sdnimg.c
    n/dir
    ec
    t/f6ec
    1d04b9e048dc
    94b0e87e61f1661d.png#pic
    _c
    enter
    [/img]
5.补充内容

1.函数库

前面讲到整个编译过程分为四个阶段&#xff0c
;其中末了一个阶段为毗连阶段&#xff0c
;如何理解毗连?
以C语言中的pr
intf函数为例&#xff0c
;在利用该函数时&#xff0c
;并没有定义该函数的实现&#xff0c
;且在预编译中包含的头文件stdio.h中也只有该函数的声明&#xff0c
;而没有实现&#xff0c
;那么是在哪里实现pr
intf函数的?
答案是:系统把这些函数实现都存放到名为libc
.so.6的库文件中&#xff0c
;在没有特别指定时&#xff0c
;gc
c
会到系统默认的搜刮路径/usr
/lib下进行查找&#xff0c
;也就是毗连到libc
.so.6库函数中去&#xff0c
;这样就能实现函数pr
intf了&#xff0c
;这也就是毗连的作用。
而函数库分为两种&#xff0c
;一种为动态库&#xff0c
;一种为静态库

在Linux中.so为动态库&#xff0c
;.a为静态库;而在windows中.dll为动态库&#xff0c
;.lib为静态库。
在我么本身的机器上&#xff0c
;默认只会安装动态库&#xff0c
;静态库默认是没有安装的。
安装静态库
[c
ode]C语言的静态库安装:
sudo yum install -y glibc
-static


C++的静态库安装:
sudo yum install -y libstdc
++-static

[/c
ode] 各种函数的实现就在库中!通过库可以不用做重复工作!
库实在就是把.c
源文件经过一定的翻译&#xff0c
;然后打包&#xff0c
;只提供一个文件即可&#xff0c
;不用提供太多的源文件&#xff0c
;也可以达到隐藏源文件的目的。
头文件提供方法的声明+库文件提供方法的实现+代码=完整的软件
查看动态库:
[align=c
enter
][img]https://i-blog.c
sdnimg.c
n/dir
ec
t/213fd71214c
1441081fbb5bfa6c
8be85.png#pic
_c
enter
[/img]
2.如何实现毗连的

毗连阶段作为编译的末了一个阶段&#xff0c
;将.o文件和库进行毗连&#xff0c
;形成可执行步调&#xff0c
;但是如何实现毗连的?
现阶段只需了解毗连的原理即可&#xff0c
;背面学到其他的会更深条理的讲解。


  • 动态毗连
    当可执行步调执行到某处需要调用该函数的实现时&#xff0c
    ;会主动跳转到对应的动态库中执行&#xff0c
    ;当执行完后又返回到代码的调用处&#xff0c
    ;继续执行下一行代码。
    如果其他可执行文件调用该函数时&#xff0c
    ;同样可以跳转到对应的动态库中执行&#xff0c
    ;所以动态库又叫做共享库。
    因此动态库不能缺失&#xff0c
    ;一旦对应的动态库缺失&#xff0c
    ;影响的不止一个步调&#xff0c
    ;可能导致很多步调都无法进行正常运行。
​ 查看可执行文件所需的动态库:
[align=c
enter
][img]https://i-blog.c
sdnimg.c
n/dir
ec
t/0fd9635ec
d7e4466888d643d56f5c
f6f.png#pic
_c
enter
[/img]


  • 静态毗连
    在编译器利用静态库进行静态毗连的时候&#xff0c
    ;会将本身的方法拷贝到目标文件中&#xff0c
    ;该步调以后不用再依赖静态库。但是天生的文件会比力大。
验证
在Linux中&#xff0c
;编译形成的可执行步调&#xff0c
;默认采取的就是动态毗连(提供动态库)&#xff0c
;而如果要按照静态毗连的方式形成可执行步调&#xff0c
;需要添加-static
选项(提供静态库)。
[align=c
enter
][img]https://i-blog.c
sdnimg.c
n/dir
ec
t/2a7c
5aa2ec
774c
eb9090bc
f0bed2a587.png#pic
_c
enter
[/img]
注意点
如果没有静态库&#xff0c
;但是就是要进行静态毗连是不行的;如果没有动态库&#xff0c
;只有静态库而且gc
c
能找到对应的静态库&#xff0c
;编译毗连时就会利用静态毗连。
因此gc
c
默认利用动态库进行动态毗连&#xff0c
;-static
的本质就是改变优先级。

动静态毗连的优缺点
动态库因为是共享库&#xff0c
;有用的节省资源(磁盘空间&#xff0c
;内存空间&#xff0c
;网络空间等)这是优点;但是一旦动态库缺失&#xff0c
;导致各个步调都会无法执行这是缺点。
静态库不依赖函数库&#xff0c
;步调可以独立运行这时优点;但是体积大&#xff0c
;比力斲丧资源&#xff0c
;这是缺点。
四.Linux项目主动化构建工具-make/makefile

先阶段因为只是写一些单个文件的简单代码&#xff0c
;所以可以直接利用gc
c
/g++对该文件进行编译&#xff0c
;但是如果放在整个项目中&#xff0c
;一个一个编译就会比力贫苦&#xff0c
;这时候就需要用到主动化构造工具-make和makefile&#xff0c
;其中make是一条命令&#xff0c
;makefile是一个文件。
一个工程项目的源文件不可胜数&#xff0c
;按照范例&#xff0c
;功能&#xff0c
;模块分别放在若干个目录中&#xff0c
;makefile定义了一系列的规则来指定&#xff0c
;哪些文件需要先进行编译&#xff0c
;那些文件需要后进行编译&#xff0c
;那些文件需要重新进行编译&#xff0c
;乃至于进行更复杂的功能操作。
两个搭配利用&#xff0c
;就可以完成项目主动化构建。
1.主动化原理

在makefile文件中&#xff0c
;需要定义对应的规则才能实现主动化构建&#xff0c
;需要依赖关系和依赖方法来实现&#xff0c
;两个缺一不可。
[c
ode]以text.c
文件编译形成text可执行文件为例

makefile文件中:
text:text.c
                    ---依赖关系
        gc
c
text.c
-o text         ---依赖方法
[/c
ode] 在依赖关系中&#xff0c
;冒号:左侧为目标形成的可执行文件;右侧为形成可执行文件依赖的源文件。
在依赖方法中&#xff0c
;前面的空缺处并不是空格跳过&#xff0c
;而是利用TAB键跳过&#xff0c
;然后按照源文件如何形成目标文件写入对应的指令&#xff0c
;这就是依赖方法。
根据makefile中的依赖关系和依赖方法&#xff0c
;就可以通过make指令直接完成编译。
[align=c
enter
][img]https://i-blog.c
sdnimg.c
n/dir
ec
t/d355c
ef47e714fdc
831893b976f1fafc
.png#pic
_c
enter
[/img]
编译形成可执行文件有了&#xff0c
;但是如果想要删除该文件呢?同样可以在makefile文件中通过依赖关系和依赖方法来实现
[c
ode]makefile文件中:
text:text.c
                    ---依赖关系
        gc
c
text.c
-o text         ---依赖方法
       
c
lean:                         ---依赖关系
        r
m -f text                 ---依赖方法
[/c
ode] 在删除的依赖关系中&#xff0c
;冒号左侧的c
lean依赖的右侧为空&#xff0c
;而依赖方法中则是删除该文件的指令。
[align=c
enter
][img]https://i-blog.c
sdnimg.c
n/dir
ec
t/12f5a2c
11f634ba79165f2883d133272.png#pic
_c
enter
[/img]
2.补充内容

1.make会主动推导makefile文件中的依赖关系
如果将编译分为完整的四个阶段&#xff0c
;用四个依赖关系来实现源文件形成可执行文件&#xff0c
;如图所示:
[align=c
enter
][img]https://i-blog.c
sdnimg.c
n/dir
ec
t/8999303fbdbe4581a71fc
408916b3e21.png#pic
_c
enter
[/img]
利用make指令时&#xff0c
;根据makefile文件中的依赖关系从下到上依次执行&#xff0c
;有点类似于递归调用&#xff0c
;栈式结构。
2.makefile文件中的第一个依赖关系会作为默认的make指令
好比将删除的依赖关系作为第一个&#xff0c
;利用make指令时&#xff0c
;就会用到删除的依赖方法。
[align=c
enter
][img]https://i-blog.c
sdnimg.c
n/dir
ec
t/996899df93e24f2986a0d86bf1f7a00d.png#pic
_c
enter
[/img]
通常将编译的依赖关系设置为第一个&#xff0c
;作为默认make指令。

3.如何实现makefile文件中的依赖关系总是被执行(伪目标)
make指令在编译一次后&#xff0c
;天生可执行步调&#xff0c
;如果源文件中没有更改&#xff0c
;再次执行编译的make指令将不再执行。
为什么要这样限制?答案是提高编译效率。现在本身写的也就是一些比力简单的几行大概几百行代码&#xff0c
;编译一次很快就能完成;但如果是在很大的项目中进行编译&#xff0c
;编译一次就会花费很长的时间&#xff0c
;所以如果源文件没有更改的话&#xff0c
;就没有必要再编译一次&#xff0c
;可以提高编译的效率。
但又是怎么做到的可以判断当前源文件是否更改过?因为一定是由源文件形成可执行文件&#xff0c
;也就是先有的源文件后有的可执行文件&#xff0c
;因此源文件的近来修改时间一定比可执行文件的近来修改时间要早。如果更改了源文件&#xff0c
;历史上曾经另有可执行文件&#xff0c
;那么源文件的近来修改时间一定要比可执行文件的要晚。
只需比力可执行文件和源文件的近来修改时间就能判断出是否需要进行再次编译
[c
ode]可执行文件的最近修改时间 晚于 源文件的最近修改时间&#xff0c
;不需要重新编译
可执行文件的最近修改时间 早于 源文件的最近修改时间&#xff0c
;需要重新编译

一般而言不会有可执行文件的最近修改时间等于源文件的最近修改时间
[/c
ode] 一个文件有三种时间&#xff0c
;分别是近来访问时间(Ac
c
ess)&#xff0c
;近来更改文件内容的时间(Modify)&#xff0c
;近来更改文件属性的时间(Change)
&#xff0c
;可以通过指令stat [目标文件]来查看目标文件的三个时间。
[align=c
enter
][img]https://i-blog.c
sdnimg.c
n/dir
ec
t/413e9d3ba3fe46099b066be1c
51e4b34.png#pic
_c
enter
[/img]
make会根据源文件和目标文件的新旧(Modify时间),判断是否需要重新执行依赖关系进行编译!
[align=c
enter
][img]https://i-blog.c
sdnimg.c
n/dir
ec
t/b5bd7228de7b41f68c
c
a3afd777b0ec
7.png#pic
_c
enter
[/img]
因此依赖关系并不一定总是执行的!如果想让对应的依赖关系总是被执行&#xff0c
;可以利用.PHONY:伪目标。

[align=c
enter
][img]https://i-blog.c
sdnimg.c
n/dir
ec
t/a40aa391ebbe4ed7ab3dbc
ff3f55f90d.png#pic
_c
enter
[/img]
通常将清理文件的依赖关系设置为伪目标
[align=c
enter
][img]https://i-blog.c
sdnimg.c
n/dir
ec
t/595b78c
2edc
5420dac
efc
ac
8a132c
c
c
e.png#pic
_c
enter
[/img]
完整的makefile写法
在编译文件的依赖方法中&#xff0c
;红色方框中的$@表示的依赖关系中冒号左侧的可执行文件&#xff0c
;$^表示依赖关系中冒号右侧的源文件;在依赖方法中的指令语句前另有一个@用来隐藏make指令执行依赖关系时的依赖方法。
[align=c
enter
][img]https://i-blog.c
sdnimg.c
n/dir
ec
t/b1e239bc
0c
e147d3aad47c
f6e9b18d75.png#pic
_c
enter
[/img]
五.Linux调试器-gdb

步调发布时有两种方式:debug模式和r
elease模式。其中debug模式能被调试&#xff0c
;因为形成可执行步调的时候会有调试信息;而r
elease模式则不能调试&#xff0c
;因为没有调试信息。所以debug模式的可执行步调的巨细要比r
elease模式的可执行步调的巨细大。
另一点Linux下的编译器gc
c
和g++都是默认以r
elease模式发布的&#xff0c
;如果要以debug模式发布&#xff0c
;在利用编译指令时&#xff0c
;要携带[-g]选项。
[align=c
enter
][img]https://i-blog.c
sdnimg.c
n/dir
ec
t/ff2237a0424640d29179c
0b8585c
e4b2.png#pic
_c
enter
[/img]
利用指令r
eadelf -S [目标文件] | gr
ep -i debug可以查看目标文件的调试信息。
gdb调试器的利用

启动调试
[c
ode]gdb [调试的目标文件]
[/c
ode] [align=c
enter
][img]https://i-blog.c
sdnimg.c
n/dir
ec
t/55c
e5ac
1f89b4f498ec
470af712d361d.png#pic
_c
enter
[/img]
查看目标文件中的代码
[c
ode]查看部分文件中的代码:
list(可以简写为l)

查看前十行的代码(执行一次后再次执行&#xff0c
;会接着上次的位置往下列&#xff0c
;每次十行:
l + 0
补充一个:
使用回车按键&#xff0c
;会继续使用上一条指令&#xff0c
;因此如果想要查看完整的代码&#xff0c
;可以在使用l + 0后一直回车

查看指定函数中的代码
l + 函数名
[/c
ode] [align=c
enter
][img]https://i-blog.c
sdnimg.c
n/dir
ec
t/91e323e746734600b5707dbd102a558e.png#pic
_c
enter
[/img]
[align=c
enter
][img]https://i-blog.c
sdnimg.c
n/dir
ec
t/06079eb8ed0d43c
0a29e290c
8fba9051.png#pic
_c
enter
[/img]
执行代码
[c
ode]r
[/c
ode] [align=c
enter
][img]https://i-blog.c
sdnimg.c
n/dir
ec
t/d88fbb8fc
afd40f29f920ed841402ae3.png#pic
_c
enter
[/img]
断点
[c
ode]设置断点
b + [指定行号]

补充:设置的断点在代码中看不到&#xff0c
;只能通过指令看到
查看断点
info b

删除断点需要用到断点前面的编号&#xff0c
;根据编号删除而不是行号
d + [断点编号]
[/c
ode] [align=c
enter
][img]https://i-blog.c
sdnimg.c
n/dir
ec
t/5c
e183a0c
d96422c
806b483a255e0834.png#pic
_c
enter
[/img]
[align=c
enter
][img]https://i-blog.c
sdnimg.c
n/dir
ec
t/9919109d0454491baa14b751730f5023.png#pic
_c
enter
[/img]
[align=c
enter
][img]https://i-blog.c
sdnimg.c
n/dir
ec
t/12b442c
af2ad49fc
a47c
fe0987e72fa3.png#pic
_c
enter
[/img]
执行语句
[c
ode]逐过程调试(相当于vs 2022调试中的f10按键)
n

逐语句调试(相当于vs 2022调试中的f11按键)
s
[/c
ode] 变量
[c
ode]查看当前变量的值:
p + [变量名]

使用p时&#xff0c
;每次逐过程执行语句时&#xff0c
;当前查看的变量并不会发生变化&#xff0c
;如果要像监视窗口中的变量一样&#xff0c
;每次都会发生变化
可以使用display +变量名&#xff0c
;其中变量前面的编号用于删除

删除变量:
undisplay +编号
[/c
ode] [align=c
enter
][img]https://i-blog.c
sdnimg.c
n/dir
ec
t/f4121bebbf2c
437390e36fb89c
d0d020.png#pic
_c
enter
[/img]
[align=c
enter
][img]https://i-blog.c
sdnimg.c
n/dir
ec
t/15318d574fd2467f8542eac
0b8a2c
35d.png#pic
_c
enter
[/img]
[align=c
enter
][img]https://i-blog.c
sdnimg.c
n/dir
ec
t/35b58506d45a470d94f8490f0762e859.png#pic
_c
enter
[/img]
从循环中跳出执行
[c
ode]until + [要跳转到的行数]
[/c
ode] [align=c
enter
][img]https://i-blog.c
sdnimg.c
n/dir
ec
t/6fd79d9627b1403f9429082f5bc
1a9dc
.png#pic
_c
enter
[/img]
利用s跳转到另一个函数时想要直接退出该函数
[c
ode]finish
[/c
ode] 从当前断点到另一个断点
[c
ode]c
[/c
ode] [align=c
enter
][img]https://i-blog.c
sdnimg.c
n/dir
ec
t/4356bf11f2c
a416f957208374b3d5980.png#pic
_c
enter
[/img]
[align=c
enter
][img]https://i-blog.c
sdnimg.c
n/dir
ec
t/3473aad9ac
0f4f93809190dc
302978a9.png#pic
_c
enter
[/img]
使指定断点禁用
[c
ode]disable + [断点编号]
[/c
ode] [align=c
enter
][img]https://i-blog.c
sdnimg.c
n/dir
ec
t/28212493ed1c
4beab416dfe9d383329a.png#pic
_c
enter
[/img]
使指定断点工作
[c
ode]enable + [断点编号]
[/c
ode] [align=c
enter
][img]https://i-blog.c
sdnimg.c
n/dir
ec
t/5046f82aac
0046c
69a699ac
850d84b6f.png#pic
_c
enter
[/img]
六.git简单命令行的利用

Git是一个开源的分布式版本控制系统&#xff0c
;用于高效的管理项目(尤其是代码)的版本和变更记载。git实在和Linux还是有联系的&#xff0c
;因为最初的git就是用于管理Linux内核的开发。
Git的生态非常强大&#xff0c
;与gitee(国内的)&#xff0c
;github(国外的)等平台无缝集成&#xff0c
;成为开发这协作的行业标准。
这里重要简单讲解一下如安在Linux操作系统下将本身写的代码上传到本身的git代码库中&#xff0c
;会用即可&#xff0c
;背面会专门讲解git的利用。
以国内的gitee为例:
先在gitee上创建代码库
[align=c
enter
][img]https://i-blog.c
sdnimg.c
n/dir
ec
t/2461e0ac
4fe4412e8e086e96f637c
7a4.png#pic
_c
enter
[/img]
输入需要创建的堆栈名称&#xff0c
;下面的各种选项根据本身的需求选择&#xff0c
;可选可不选&#xff0c
;选择好后点击下面的创建即可。
[align=c
enter
][img]https://i-blog.c
sdnimg.c
n/dir
ec
t/16ec
b1a1a5a544e6bd545763b55fd9ed.png#pic
_c
enter
[/img]
创建好后&#xff0c
;就可以看到创建的堆栈&#xff0c
;点击右上角的克隆/下载
[align=c
enter
][img]https://i-blog.c
sdnimg.c
n/dir
ec
t/ad844e9e31634537961c
e450089dbb62.png#pic
_c
enter
[/img]
获取当前堆栈的链接
[align=c
enter
][img]https://i-blog.c
sdnimg.c
n/dir
ec
t/f418107e82c
d41b3a6131ebb79a7802d.png#pic
_c
enter
[/img]
获取到链接后&#xff0c
;在Linux操作系统下进行操作:
先克隆到当地堆栈&#xff0c
;就可以在当前操作系统下看到以目录情势创建好的堆栈
[c
ode]git c
lone [链接][/c
ode] [align=c
enter
][img]https://i-blog.c
sdnimg.c
n/dir
ec
t/d324c
311db4140b7b6d0a722425c
5328.png#pic
_c
enter
[/img]
如何上传代码文件:
如果是第一次利用git需要先设置用户名和邮箱&#xff0c
;以确保提交代码的身份被gitee正确识别
[c
ode]git c
onfig --global user
.name '[用户名]' git c
onfig --global user
.email '[邮箱]'[/c
ode] 设置好后就可以利用了。
第一步:
将需要上传&#xff0c
;用git管理的文件告知git

[c
ode]git add [目标文件名]
[/c
ode] 第二步:
提交改动到当地
[c
ode]git c
ommit . -m [日志内容].表示当前目录提交的时候可以用[-m]选项&#xff0c
;注明提交日志(最好注明)[/c
ode] [align=c
enter
][img]https://i-blog.c
sdnimg.c
n/dir
ec
t/a26a233dc
f2c
4ab1a66d954f4510da04.png#pic
_c
enter
[/img]
第三步:
同步到远端服务器上
[c
ode]git push
[/c
ode] 需要先填入用户名和暗码(这里的暗码是登录gitee网站时的暗码)&#xff0c
;同步乐成后&#xff0c
;刷新gitee页面就能看到上传的代码文件。
[align=c
enter
][img]https://i-blog.c
sdnimg.c
n/dir
ec
t/4f4c
bdc
a5a854c
fa922b1458780c
0859.png#pic
_c
enter
[/img]
[align=c
enter
][img]https://i-blog.c
sdnimg.c
n/dir
ec
t/8e961b3fa60a4c
f380e1a81108f488fd.png#pic
_c
enter
[/img]
如果需要删除堆栈&#xff0c
;点击管理&#xff0c
;然后找到删除堆栈的选项&#xff0c
;根据指示操作&#xff0c
;就可以删除堆栈了。
[align=c
enter
][img]https://i-blog.c
sdnimg.c
n/dir
ec
t/5c
f50c
3db4374e5f8ff6bb134854fe62.png#pic
_c
enter
[/img]
以上就是关于Linux常用工具的讲解&#xff0c
;如果哪里有错的话&#xff0c
;可以在评论区指正&#xff0c
;也欢迎大家一起讨论学习&#xff0c
;如果对你的学习有帮助的话&#xff0c
;点点赞关注支持一下吧!!!

[align=c
enter
][img]https://i-blog.c
sdnimg.c
n/dir
ec
t/105f44609de045d8b8e7c
8dfa01c
86c
d.png#pic
_c
enter
[/img]

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.c
om:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

络腮胡菲菲

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表