首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Linux:常用软件、工具和周边知识介绍

Linux:常用软件、工具和周边知识介绍

作者头像
是Nero哦
发布于 2024-04-22 08:47:46
发布于 2024-04-22 08:47:46
1.5K0
举报
文章被收录于专栏:c/c++学习与分享c/c++学习与分享

1.yum-管理软件包的工具

1.1基本介绍

Yum(Yellowdog Updater Modified):

Yum是Linux系统中用于管理软件包的工具,类似于手机上的应用商店。是基于 RPM(Red Hat Package Manager)的系统,用于管理 RPM 软件包 ,它提供了一种方便的方式来搜索、下载、安装和卸载软件包,使得软件的管理变得简单而高效。

安装软件的方式:

  1. 源代码安装:需要手动下载源代码并进行编译安装,比较繁琐,需要处理依赖关系。
  2. RPM包直接安装:可以直接使用RPM包进行安装,但是需要手动处理依赖关系,不够方便。
  3. Yum(或apt-get):Yum是Linux系统预装的一个命令,也可以通过apt-get在Debian系列的系统中使用。它们提供了一个类似应用商店的方式,通过简单的命令即可搜索、下载、安装和卸载软件包,而且会自动处理依赖关系,非常方便。

注意:

  1. yum在安装软件时需要从服务器上下载RPM包,并且在同一时刻只能允许一个yum进程进行安装操作。这是因为yum在安装过程中可能会修改系统的配置和文件,如果同时有多个yum进程进行操作,可能会导致不可预测的结果和系统不稳定性。
  2. 另外,yum需要通过网络访问软件源来下载安装软件包
代码语言:javascript
复制
      +--------------------------+             +----------------------+
      |                          |             |                      |
      |  软件包服务器(软件源)  |    --------->  |     本地系统、云服务器  |
      |                          |  下载软件包  |                      |
      +--------------------------+             +----------------------+

1.2yum的使用

我们删除,下载时是需要有root权限的。

选项:

  • -y 或 --assumeyes:在提示时自动回答"yes"。
  • -q 或 --quiet:安静模式,减少输出信息

以下是使用yum的常用操作(这里只介绍部分了):

更新软件包列表:

代码语言:javascript
复制
sudo yum update

这将更新可用软件包的列表,以确保您系统上的所有软件包都是最新的。

搜索软件包:

代码语言:javascript
复制
yum search package_name

使用此命令搜索特定软件包。例如,如果要搜索Apache软件包,可以使用yum search apache。

安装软件包:

代码语言:javascript
复制
sudo yum install package_name

使用此命令安装特定的软件包。例如,要安装Apache服务器,可以使用yum install httpd。

更新软件包:

代码语言:javascript
复制
sudo yum update package_name

使用此命令更新特定的软件包。例如,要更新Apache服务器,可以使用yum update httpd。

删除软件包:

代码语言:javascript
复制
sudo yum remove package_name

使用此命令删除特定的软件包。例如,要删除Apache服务器,可以使用yum remove httpd。

列出已安装的软件包:

代码语言:javascript
复制
yum list installed

使用此命令列出所有已安装的软件包。

清理缓存:

代码语言:javascript
复制
sudo yum clean all

使用此命令清理Yum缓存,以释放磁盘空间。

1.3yum的周边生态

tool11
tool11

各种各样的软件和包服务器由不同的组织、个人或机构提供。这些服务器可以分为两类:基础软件源和拓展软件源。

  1. 基础软件源:
  • 基础软件源通常由Linux发行版的官方团队或相关组织提供,如Red Hat、CentOS、Debian、Ubuntu等。
  • 这些软件源提供了操作系统的核心组件、常用工具和基本服务所需的软件包。
  • 它们通常包含了操作系统的核心组件、常用工具和基本服务所需的软件包,以确保系统的稳定性和安全性。
  1. 拓展软件源:
  • 拓展软件源是由第三方组织或社区提供的,如EPEL、RPM Fusion等。
  • 这些软件源提供了一些官方软件源中没有的软件包,或者提供了更新版本的软件包,以满足用户更多的需求。
  • 它们提供了更多的软件选择和功能扩展,如多媒体编解码器、图形界面工具、开发工具等。

我们可以通过:来安装拓展软件源

代码语言:javascript
复制
yum install -y epel-release
tool12
tool12

1.4软件包介绍

使用:yum list | grep vim

该命令用于在 yum 软件包列表中查找包含 “vim” 关键字的软件包。这样做可以过滤出与 Vim 相关的软件包信息,使结果更易于阅读和理解。

  • yum list:列出所有可用的软件包。
  • |:管道符号,将 yum list 的输出作为 grep 命令的输入。
  • grep vim:使用 grep 工具搜索包含 “vim” 关键字的行。
tool13
tool13

第一列:

  • 软件包名称: 主版本号.次版本号.源程序发行号-软件包的发行号.主机平台.cpu架构.
  • x86_64后缀表示64位系统的安装包, “i686” 后缀表示32位系统安装包. 选择包时要和系统匹配

第二列:软件包的版本号 第三列:软件包的存储库来源

2.vim-多模式的文本编辑器

2.1基本介绍

vim(Vi IMproved)是一个功能强大的文本编辑器,常用于在终端中编辑文本文件。它是 Unix 系统下的一个经典编辑器,具有丰富的功能和灵活的配置选项 vim 提供了多种编辑模式,包括普通模式、插入模式、命令行模式(进入默认这个)等,让用户可以高效地进行编辑操作

我们使用: vim 文件名 即可直接进入到文件中 退出vim及保存文件,在[正常模式]下,按一下「:」冒号键进入「Last line mode」,例如:

w (保存当前文件)

wq(保存并退出)

2.2基本模式介绍

  1. 命令模式(Normal mode) 在命令模式下,我们可以控制屏幕光标的移动,字符、字或行的删除,复制粘贴,剪贴等操作。
  2. 插入模式(Insert mode) 只有在插入模式下才能进行文字输入,该模式是我们使用最频繁的编辑模式。
  3. 底行模式(Command mode) 在底行模式下,我们可以将文件保存或退出,也可以进行查找字符串等操作。在底行模式下我们还可以直接输入vim help-modes查看当前vim的所有模式

当前处于什么模式,在进入vim后,左下角能看到

tool14
tool14

三种模式之间的切换

tool15
tool15
2.2.1命令模式(Normal mode)

在 Vim 中,命令模式(Normal Mode)是默认的模式,在这个模式下你可以执行各种编辑文本的操作。

以下是一些常用的命令模式下的操作:

这些操作都是在 Vim 的命令模式(Normal Mode)下使用的。在命令模式下,你可以通过按下不同的键来执行各种编辑文本的操作。这里详细说明一下你提到的一些常用操作:

  1. 进入插入模式(Insert Mode):
    • 按下 i 键进入插入模式,光标将定位到当前位置之前,可以开始插入文字。
    • 按下 a 键进入插入模式,光标将定位到当前位置之后,可以开始插入文字。
    • 按下 o 键进入插入模式,在当前行的下方插入一个新的空行,光标将定位到新行的起始位置。
  2. 移动光标:
    • 使用 h、j、k、l 分别向左、下、上、右移动光标。
    • 使用 w 和 b 分别跳到下一个单词的开头和上一个单词的开头。
    • 使用 ^ 跳到当前行的第一个非空字符处。
    • 使用 $ 跳到当前行的最后一个字符处。
    • 使用 gg 跳到文件的开头,G 跳到文件的末尾。
  3. 删除文字:
    • 使用 x 删除光标所在位置的字符,X 删除光标前一个字符。
    • 使用 dd 删除当前行,ndd 删除当前行及其后的 n-1 行。
  4. 复制和粘贴:
    • 使用 yw 复制光标所在位置到单词末尾的内容,yy 复制整行。
    • 使用 p 粘贴已经复制或删除的内容到光标位置后。
  5. 替换:
    • 使用 r 替换光标所在位置的字符。
  6. 撤销和重做:
    • 使用 u 撤销上一步操作,Ctrl + r 重做上一步操作的撤销。
  7. 更改:
    • 使用 cw 更改光标所在位置到单词末尾的内容,c#w 更改指定数量的单词。
  8. 跳转至指定行:
    • 使用 :n 跳转至第 n 行,例如 :15 跳转至第 15 行。
2.2.2插入模式(Insert mode)

在 Vim 编辑器中,插入模式(Insert Mode)是用于输入和编辑文本的模式。在插入模式下,你可以直接在文本中插入、编辑和删除字符,就像在普通的文本编辑器中一样。

在插入模式下,你可以自由地编辑文本,直到按下 Esc 键退出插入模式,回到普通模式(Normal Mode)为止。插入模式是 Vim 编辑器中最常用的模式之一,能够有效地提高文本编辑的效率。

2.2.3底行模式(Command mode)

在使用末行模式之前,请确保您已经处于正常模式,按下「ESC」键,然后按下冒号「:」键即可进入末行模式。

  1. 列出行号

要在文件中的每一行前面显示行号,可以使用以下命令:

代码语言:javascript
复制
:set nu

执行上述命令后,编辑器会在每一行前面显示行号。

  1. 跳到文件中的某一行

要跳到文件的特定行,可以在冒号后输入行号,然后按回车键。例如,要跳到第 15 行,可以执行以下命令:

代码语言:javascript
复制
:15

执行上述命令后,编辑器会跳到文件的第 15 行。

  1. 查找字符

Vim 提供了两种查找字符的方式:

  1. 使用 / 进行向后查找。
  2. 使用 ? 进行向前查找。

例如,要向后查找某个关键字,可以执行以下命令:

代码语言:javascript
复制
/关键字

执行上述命令后,编辑器会开始向后查找包含指定关键字的文本。

如果要向前查找关键字,可以执行以下命令:

代码语言:javascript
复制
?关键字

执行上述命令后,编辑器会开始向前查找包含指定关键字的文本。

  1. 保存文件

要保存文件,可以执行以下命令:

代码语言:javascript
复制
:w

执行上述命令后,编辑器会将文件保存到磁盘上,但不会退出编辑器。

  1. 离开 Vim

要退出 Vim 编辑器,可以执行以下命令:

代码语言:javascript
复制
:q

执行上述命令后,如果文件未做过修改,编辑器会立即退出。如果文件已经做过修改,编辑器会提示保存文件或者放弃修改。

如果要强制退出而不保存修改,可以执行以下命令:

代码语言:javascript
复制
:q!

执行上述命令后,编辑器会立即退出,且不会保存任何修改。

如果想在退出之前保存文件,可以执行以下命令:

代码语言:javascript
复制
:wq

执行上述命令后,编辑器会保存文件并退出。

这些是一些常用的末行命令,可以帮助您更有效地编辑和管理文件。

2.3 批量注释和批量删前面的空格

批量注释

批量注释:

  1. 按下 Ctrl + v 进入可视块模式。
  2. 使用 hjkl 键选择要注释的区域,按 j 键向下移动选择。
  3. 按下 Shift + i 进入插入模式,并按下 = 符号添加注释符号。
  4. 输入注释符号 //(或其他符号),然后按下 Esc 键退出插入模式。

批量去注释:

  1. 按下 Ctrl + v 进入可视块模式。
  2. 使用 hjkl 键选择已注释的区域。
  3. 按下 d 键删除选择的注释行。
  4. 按下 Esc 键退出可视块模式。
批量删前面的空格

  1. 按下 Ctrl + v 进入可视块模式。
  2. 使用 hjkl 键选择要注释的区域,按 j 键向下移动选择。
  3. 按下d就可删除选中的区域

3.gcc/g++ –Linux编译器

3.1基本介绍

gcc和g++是在Linux系统中常用的编译器,用于编译C和C++程序。

  • gcc: GNU Compiler Collection(GNU编译器套件),用于编译C程序。
  • g++: GNU C++ Compiler(GNU C++编译器),用于编译C++程序。

这两个编译器提供了丰富的功能和选项,可以将源代码文件编译成可执行文件。编译器可以处理多个源文件,并生成相应的目标文件,最后将目标文件链接在一起生成可执行文件。

这里二者用法几乎一样,我举例子用gcc举例

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

常用的选项:

  • -E: 只激活预处理,不生成文件,需要将其重定向到一个输出文件中。
  • -S: 将源代码编译成汇编语言文件,但不进行汇编和链接。
  • -c: 编译源代码到目标代码,生成目标文件而不进行链接。
  • -o: 指定输出文件的名称(重命名生成文件),后面跟着输出文件的路径和名称。
  • -static: 采用静态链接,生成的文件使用静态库链接。(自动默认是动态链接)
  • -g: 生成调试信息,方便调试器进行调试。
  • -shared: 尽量使用动态库,生成文件较小,但需要系统支持动态库。
  • -O0, -O1, -O2, -O3: 编译器的优化级别,分别表示没有优化、默认优化级别、优化级别2和优化级别3。
  • -w: 不生成任何警告信息
tool17
tool17
tool18
tool18

3.2编译过程

tool16
tool16

编译过程通常包括以下四个阶段:

预处理(Preprocessing):

  • 在这个阶段,预处理器将源代码中的预处理指令(如宏替换、条件编译等)处理成适合编译器进一步处理的形式。
  • 预处理器的工作包括文件包含(#include)、宏替换(#define)、条件编译(#ifdef、#ifndef等)等。

所谓的头文件展开,本质是在预处理的时候,将头文件内容拷贝至源文件

  • 预处理器处理后的文件通常具有更大的体积,并且不包含注释和空行。

代码语言:javascript
复制
gcc –E hello.c –o hello.i

选项-E,该选项的作用是让 gcc 在预处理结束后停止编译过程。

选项-o是指目标文件,.i文件为已经过预处理的C原始程序

编译(Compiling):

  • 编译器接收预处理阶段生成的文件,并将其翻译成汇编语言(Assembly Language)。
  • 编译器的工作包括词法分析、语法分析、语义分析、优化等。
  • 编译器输出的结果是以汇编语言表示的中间代码。

代码语言:javascript
复制
gcc –S hello.i –o hello.s

选项-S进行编译而不进行汇编,生成汇编代码

汇编(Assembling):

  • 汇编器接收编译阶段生成的汇编代码,并将其翻译成机器可识别的目标文件(二进制文件)。
  • 汇编器的工作是将汇编指令翻译成对应的机器指令,并生成与目标硬件架构兼容的目标文件。

代码语言:javascript
复制
gcc –c hello.s –o hello.o

选项-c就可看到汇编代码已转化为.o的二进制目标代码了

连接(Linking):

  • 连接器接收一个或多个目标文件以及库文件,并将它们组合在一起生成可执行文件或者共享库。
  • 连接器的工作包括符号解析、重定位、链接库的加载等。
  • 最终生成的可执行文件或共享库包含了所有必要的代码和数据,可以在操作系统上运行。

代码语言:javascript
复制
gcc hello.o –o hello

注意这里是hello.o的二进制代码文件

3.2 动静态库

本质都是文件

1. 静态库(Static Library):
  • 定义:静态库是一组已编译的目标文件(通常以.a为后缀),其中包含了函数和数据,可以被多个程序使用。
  • 特点:
    • 在编译时将静态库的代码复制到可执行文件中,因此可执行文件会比较大。
    • 程序在编译时就会把所需的库函数代码和数据加入到可执行文件中,因此在运行时不需要依赖外部的库文件。
    • 每个使用了静态库的程序都会拷贝一份静态库代码,造成了一定的代码冗余。
    • 使用静态库编译的程序可以在没有任何其他文件的情况下运行。
  • 使用方法:在编译时,通过链接器将静态库与目标文件链接成一个可执行文件。
2. 动态库(Dynamic Library):
  • 定义:动态库是一组已编译的目标文件(通常以.so为后缀),其中包含了函数和数据,可以被多个程序使用。
  • 特点:
    • 动态库的代码不会被复制到可执行文件中,而是在程序运行时由动态链接器加载到内存中。
    • 可执行文件相对较小,因为它只包含了链接到动态库的信息,而不是实际的库代码。
    • 多个程序可以共享同一个动态库的实例,节省系统资源。
    • 动态库的更新更加灵活,只需要替换动态库文件,不需要重新编译程序。
  • 使用方法:在编译时,通过链接器将动态库与目标文件链接成一个可执行文件,并在程序运行时由动态链接器动态加载。

在Linux里,gcc默认是进行动态链接的,使用动态库。想要使用静态链接,可以用:

代码语言:javascript
复制
gcc test.c -static
tool19
tool19

4.make/Makefile –Linux项目自动化构建工具

make 是一个用于自动化构建项目的工具,通常配合一个名为 Makefile 的文件使用。Makefile 文件包含了一系列规则和命令,描述了项目中各个文件之间的依赖关系以及如何构建和编译项目。

以下是 Makefile 文件的基本结构:

代码语言:javascript
复制
target: dependencies
    command
  • target 是一个需要构建的目标文件名,可以是可执行文件、目标文件或者是伪目标(如 clean 等)。
  • dependencies 是构建 target 所依赖的文件列表。
  • command 是构建 target 所执行的命令。

例如,下面是一个简单的 Makefile 文件示例:

代码语言:javascript
复制
   test_make:test.c
       gcc -o test_make test.c
   clean:
       rm -f test_make 

tool110
tool110

在Makefile中,依赖关系表示目标文件依赖于哪些其他文件,而依赖方法表示如何生成目标文件

  1. 依赖关系:
    • 在Makefile中,每个目标文件都有一组依赖关系,这些依赖关系指示了生成目标文件所需的其他文件或操作。
    • 依赖关系是指在构建目标文件之前需要先构建或获取的文件或操作。
    • 依赖关系通常是源文件或其他目标文件,它们是构建目标文件的输入或先决条件。
    • 如果任何一个依赖关系发生了变化(例如,文件已被修改),则目标文件将被重新生成。
  2. 依赖方法:
    • 依赖方法指定了如何生成目标文件,即构建目标文件所需的命令或操作。
    • 依赖方法包含了一系列的命令,这些命令被执行以生成目标文件。
    • 常见的依赖方法包括编译源文件、链接目标文件等。
    • 依赖方法通常使用命令工具(如编译器、链接器等)来执行所需的操作。

上面的例子里: 在这个简单的Makefile中,存在一个目标文件 test_make 和一个伪目标文件 clean。下面是它们的依赖关系和依赖方法的解释:

  1. 依赖关系:
  • 目标文件 test_make 的依赖关系是源文件 test.c。这意味着在生成 test_make 目标文件之前,必须先生成 test.c 文件。
  • 由于 test_make 是一个可执行文件,它依赖于 test.c 文件的存在和正确性。如果 test.c 发生了变化(例如,被修改或重命名),则需要重新生成 test_make。
  1. 依赖方法:
  • 对于目标文件 test_make,依赖方法是通过 gcc 编译器将 test.c 源文件编译为可执行文件 test_make。
  1. clean目标:
  • 伪目标 clean 并没有实际的依赖关系,因此它不会触发任何依赖方法。
  • 依赖方法 rm -f test_make 是用来清理目标文件的命令。当执行 make clean 命令时,它将删除名为 test_make 的文件。
  1. Makefile的扫描:
  • Makefile 是用来指导 make 工具构建目标文件的文件。当你执行 make 命令时,make 工具会查找当前目录下的名为 Makefile 或 makefile 的文件,并按顺序执行其中定义的目标。
  • 在默认情况下,make 工具会从上到下扫描Makefile文件,并构建第一个目标。这意味着,如果你在Makefile中定义了多个目标,只有第一个目标会被构建。
  1. 如何确定目标文件是否最新:
  • 当你执行 make 命令时,make 工具会比较每个目标文件和它所依赖的源文件的修改时间。如果源文件的修改时间比目标文件的修改时间更晚,或者目标文件不存在,make 工具会执行构建该目标文件的命令。否则,如果目标文件的修改时间比源文件的修改时间更晚,make 工具认为该目标文件是最新的,不需要重新构建。
  • 对于可执行文件来说,make 工具也会比较可执行文件和它所依赖的源文件的修改时间。如果可执行文件的修改时间比源文件的修改时间更晚,或者源文件的修改时间比最新的可执行文件的修改时间更晚,那么 make 工具会重新构建可执行文件。

扩展

伪目标是 Makefile 中的一种特殊类型的目标,它不表示一个真实的文件,而是表示一个命令序列或操作。使用伪目标可以告诉 make 工具,该目标不对应任何实际文件,因此总是需要执行其后定义的命令。这在执行一些通用操作,比如清理、打包等情况下非常有用。

在 Makefile 中,使用 .PHONY 来声明一个目标为伪目标。这样,当 make 命令执行时,就会忽略目标对应文件的存在与否,直接执行后续定义的命令。

代码语言:javascript
复制
.PHONY: clean
clean:
    rm -f *.o

clean 是一个伪目标,它不代表任何实际文件。无论是否存在名为 clean 的文件,执行 make clean 命令时,都会执行 rm -f *.o 命令来清理所有 .o 文件。

@ 和 ^ 是 make 中的自动化变量,用于表示目标和依赖的列表。具体含义如下:

  • $@ 表示目标文件的名称。
  • $^ 表示所有依赖文件的列表。

这些自动化变量通常用于构建命令中,以方便地引用目标和依赖文件。例如:

代码语言:javascript
复制
test: test.c
    gcc -o $@ $^

@ 会被替换为目标文件 test,^ 会被替换为所有依赖文件列表,即 test.c。因此,执行 make test 命令时,相当于执行 gcc -o test test.c,将 test.c 编译成可执行文件 test。

原理

  1. 当你输入 make 命令时,make 工具会在当前目录下查找名为 Makefile 或 makefile 的文件。
  2. 如果找到了 Makefile 文件,make 将会查找文件中的第一个目标(target),并把它作为最终的目标文件。
  3. 如果该目标文件不存在,或是其依赖的文件比目标文件的修改时间新(包括依赖的文件和目标文件本身),那么 make 将会执行后面定义的命令来生成目标文件。
  4. 如果目标文件的依赖文件也不存在,那么 make 将会在当前文件中查找目标文件的依赖性,并根据规则生成缺失的依赖文件。
  5. 当所有依赖关系都得到满足后,make 会按照依赖关系逐层构建,直到生成最终的目标文件。
  6. 如果在查找依赖关系的过程中遇到错误,比如某个被依赖的文件找不到,make 会直接退出并报。但对于生成目标文件时出现的错误,或编译不成功的情况,make 不会立即退出,而是继续执行后续的规则。
  7. make 工具只关心文件之间的依赖关系,如果依赖关系满足,就会执行后续的命令来生成目标文件。如果依赖关系不满足,make 将不会进行后续操作。

好啦这次就先到这里了,下次会给大家带来进程相关的知识啦!!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-04-22,如有侵权请联系 cloudcommunity@tencent.com 删除
目录
  • 1.yum-管理软件包的工具
    • 1.1基本介绍
    • 1.2yum的使用
    • 1.3yum的周边生态
    • 1.4软件包介绍
  • 2.vim-多模式的文本编辑器
    • 2.1基本介绍
    • 2.2基本模式介绍
      • 2.2.1命令模式(Normal mode)
      • 2.2.2插入模式(Insert mode)
      • 2.2.3底行模式(Command mode)
    • 2.3 批量注释和批量删前面的空格
      • 批量注释
      • 批量删前面的空格
  • 3.gcc/g++ –Linux编译器
    • 3.1基本介绍
    • 3.2编译过程
    • 3.2 动静态库
      • 1. 静态库(Static Library):
      • 2. 动态库(Dynamic Library):
  • 4.make/Makefile –Linux项目自动化构建工具
    • 扩展
    • 原理
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档