news 2026/10/9 10:12:28

Linux系统篇(五)工具篇·一:软件工具与动静态库

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Linux系统篇(五)工具篇·一:软件工具与动静态库

◆博主名称:少司府

欢迎来到少司府的博客☆*: .。. o(≧▽≦)o .。.:*☆

⭐数据结构系列个人专栏:初阶数据结构 高阶数据结构

⭐C++基础个人专栏:C++初阶 C++进阶

⭐Linux个人专栏:Linux系统编程

⭐琢玉成器终有时,笔底生花夺锦归


目录

1. 软件包管理器

1.1 什么是包管理器?

1.2 Linux软件的生态

1.3 yum/apt具体操作

1.4 安装源

2. Vim编辑器

2.1 vim的模式

2.2 vim的命令模式的命令集

2.3 vim的底行模式的命令集

2.4 使用vim的技巧

3. Vim编辑器的配置

3.1 手动配置

3.2 网络下载

4. gcc和g++

4.1 程序的翻译过程

4.1.1 预处理(进行宏替换)

4.1.2 编译(生成汇编)

4.1.3 汇编(生成机器可识别代码)

4.1.4 链接(链接库文件,生成可执行程序)

4.2 条件编译

4.2.1 Linux中的条件编译

4.2.2 条件编译的用途

4.2.3 编译器的产生

4.3 动静态库

4.3.1 什么叫做动态库?

4.3.2 什么叫静态库?

4.3.3 动静态库对比

4.3.4 验证

4.4 周边问题


1. 软件包管理器

Linux中安装软件的方式:

1)、源码安装

2)、软件包安装 --- rpm

3)、包管理器 yum(centos) apt/apt-get(ubuntu)

相关知识:软件程序之间是存在依赖的,他可能需要多个第三方的库,单独下软件的话可能不能运行。(例如,ls命令需要C语言的库)

如果使用软件包安装,那么可能出现依赖缺失问题、版本兼容性问题。

因此,我们推荐使用包管理器安装(源码安装很复杂)。

并且,安装的本质就是拷贝,在Linux下安装软件,必须使用root,安装在系统之后所有人都能使用。

因此,我们安装软件,要把其相关的依赖一起安装,包管理器会自动解决依赖问题。

1.1 什么是包管理器?

包管理器类似于手机上的应用商店,用于下载软件(可以解决依赖问题)。

那么,Linux上的软件,谁提供的呢?

1.2 Linux软件的生态

Linux下载软件的过程:

操作系统好坏的评估--生态问题:

为什么有人免费维护特定社区,提供第三方开源库?

本质上开源就是一种商业模式,有人用该社区的库,那么就不希望该社区倒了,会自己募捐。

软件依赖问题:

国内镜像:

有很多社区、第三方库是外网的,不方便下载,国内就有大佬做镜像的工作,把这些东西放到国内的网站上。

由此,我们可以利用apt下载一个好玩的软件:

apt -y install sl

运行结果如图:

1.3 yum/apt具体操作

1)、查找所有包含sl名字的软件:

apt list | grep sl

2)、强制卸载sl软件:

apt remove -y sl

3)、安装sl软件:

apt install -y sl

安装lrzsz软件:

apt install -y lrzsz #lrzsz用于Linux与Windows互传文件

注意:关于apt、yum的所有操作必须保证网络通畅,可以用ping命令来检测:

ping www.baidu.com

1.4 安装源

如果是虚拟机,需要关注,如果是云服务器,则不需要关注,Ubuntu安装源路径:

$ cat /etc/apt/sources.list # 标准源 $ ll /etc/apt/sources.list.d/ # 扩展源 # ubuntu 安装扩展源,就结合未来具体场景

替换安装源,解决外网问题。

2. Vim编辑器

打开vim:

vim

关闭vim:

:q #或者快速按两下大写的Z

写入文本并保存退出:

:wq #w就是保存的意思

2.1 vim的模式

vim本质上是一款多模式的编辑器,其中最常见的是:命令模式(默认)、插入模式、底行模式。

命令模式下不允许写东西,需要在插入模式进行。我们可以输入 i 来进入插入模式:

vim test.c

如图,INSTER表示现在是插入模式。

插入模式不能直接退出,要先回退到命令模式,按一下键盘左上角ESC进入命令模式,在命令模式下可以用两次大写Z来退出,我们进入底行模式,:(英文的冒号),此时可以输入q、wq等。

我们可以在底行模式下用 set nu 来标记行号:

用ESC回退到命令模式。

2.2 vim的命令模式的命令集

在命令模式下:

1)、移动相关:

gg:光标快速回到最开始

G:光标回到最后

n + G:光标回到第n行,例如:8 G

¥(shift + 键盘上面的4):光标到该行结尾

……(shitf + 键盘上面的6):光标到该行最开始

h:左

j:下

k:上

l:右

当然,目前vim也支持上下左右的键,但是使用最多是hjkl这四个。

w:以单词为单位向后移动(默认是一个单词,可以带数字)

b:以单词为单位向前移动(默认是一个单词,可以带数字)

2)、编辑相关:

yy:复制当前行(前面可以加数字n,表示从光标行开始,复制后n行)

p:光标所在位置进行粘贴(前面可以加数字n,表示粘贴n次复制的内容)

u:撤销

ctrl + r:撤销u操作

注意:一旦退出文件编辑,就无法进行撤销了;但是只是q保存,没有退出,可以撤销。

dd:剪切(可以加数字n,表示从光标行开始,剪切后n行),也可以用于删除

x:删除光标所在位置的字符(可以加数字n,向后删n个)

X:删除光标左侧字符(可以加数字)

r:替换光标所在字符,先输入r,在输入目标字符(可加数字n,表示替换为n个目标字符)

R:批量化替换,进入replace模式(替换模式),以行为单位,不断替换光标所在字符,esc返回命令模式

~:大小写切换(shift + `)

ctrl + v:进入视图模式,该模式下可以用hjkl进行区域的选择,然后用 I (shift + i),直接切换到插入模式,进行操作(输入 // 进行注释),再esc回退,就可以批量注释了。

进入视图模式之后,可以用命令模式的命令,进行批量化注释、批量化删除、批量化补充

#(shift + 3):选中光标所在位置的单词

n:进行逆向查找(和#混合使用)

进入插入模式的三个指令——

i:直接进入插入模式;a:光标向后移动一个字符并进入插入模式;o:新起一行并进入插入模式

2.3 vim的底行模式的命令集

前面说了,:(冒号)表示进入底行模式

w:保存,q:退出

q!:强制退出

wq!:强制保存并退出

set nu:设置行号

set nonu:取消行号

!:有两个意思,一个是表示强制;另一个!+ Linux系统的命令则可以直接操作系统,不用退出文件编辑

如图,按任意键继续(回到命令模式)

%s/原目标字符/替换的字符/ :底行模式的批量化替换

vim + 文件名(vim编辑器外面):有两个含义——若存在该文件,表示用vim编辑器进入该文件;若不存在,也可以进入,用wq保存退出之后会自动生成该文件。

vs + 文件名:表示分屏

如图,该命令和上一条一样,也可以创造文件。另一个要注意的是,光标在哪个文件下,表示操作哪个文件,模式也是其对应的模式。分屏可以分多个。

ctrl + ww:表示在分屏下,光标切换到另一个文件

2.4 使用vim的技巧

vim 文件名 +n:表示打开文件时光标自动定位到第n行,例如vim code.c +14

!v:表示自动执行最近匹配的以v开头的命令

user1@iZn4adydu3h6t497949n3dZ:~/lesson5$ !v vim code.c

3. Vim编辑器的配置

3.1 手动配置

在家目录下查看文件.vimrc,如果没有,则创建

再用 vim .vimrc 进入该配置文件,输入要配置的信息。例如:set nu

当再进入vim编辑器的时候,配置信息立刻生效,如果不想要配置信息,可以用双引号注释掉

因此,vim配置其实就是修改vimrc文件。

我们也可以在 /etc/vimrc 下配置,但是这个是全局的配置文件,会对所有账号生效,推荐只配置自己的。

set nu " 设置行号 " syntax on " 设置语法高亮 " set tabstop=4 " 设置tab缩进长度为4空格 " set autoindent " 设置自动缩进 " set cindent " 针对C语言的缩进功能 "

如图是我们自己配置的vim文件。

3.2 网络下载

除了自己手动配置外,可以在gitee上查找别人的一键式配置链接,在家目录下输入。(注意,一定要在普通用户下用,防止root用户下出问题)

4. gcc和g++

如图,gcc 文件名 进行编译,默认生成 a.out 的可执行程序,再 ./a.out 运行该程序。

4.1 程序的翻译过程

gcc code.c -o mycode #生成可执行程序mycode gcc -o mycode.exe code.c #也可以这样写,注意-o后面跟生成的文件
4.1.1 预处理(进行宏替换)

1)、进行宏替换

2)、去除注释

3)、头文件展开

4)、进行条件编译

如图是code.c文件:

如图,-E表示开始进行程序翻译,在预处理完成的时候就停下来,.i表示临时文件。

其中,code.i 仍然是c语言文件。

4.1.2 编译(生成汇编)
gcc -S code.i -o code.s

生成汇编文件,.s为汇编文件的后缀。

-S表示从现在开始进行程序的翻译,编译做完了就停下来。

为什么C/C++编译,要先变成汇编?

早期计算机编程是二进制编程,但这个不方便,后来有了汇编语言,也因此编译器产生了。基于汇编语言,出现了许多编译型语言,例如C/C++。

汇编语言已经发展许久了,我们站在巨人的肩膀上,先把C/C++编译成汇编,再将汇编翻译成二进制(这个步骤大佬已经做过了,只需要翻译成汇编这一步骤),这样做更简单。

4.1.3 汇编(生成机器可识别代码)
gcc -c code.s -o code.o

-c 表示开始进行翻译,当汇编完成就停下来。

code.o 叫做可重定位目标文件,在Windows、vs2022中,就是xxx.obj文件,本身已经是二进制的了,但是无法直接执行。

code.o 仅仅把自己的源文件编译了,但自己的源文件还包含了很多库方法,没有和库进行链接,因此无法直接执行。

4.1.4 链接(链接库文件,生成可执行程序)
gcc code.o -o code

小tips:在编译的时候,往往先生成.o文件,再用gcc进行链接。

gcc -c code.c #生成同名的.o文件,即code.o

ldd 可执行程序文件名:可以查看链接了哪些库。

libc.so.6 就是c语言的库。

1)、动态库:Linux(.so)windows(.dll)

2)、静态库:Linux(.a)windows(.lib)

什么叫动态库?什么叫静态库?如何理解?

4.2 条件编译

4.2.1 Linux中的条件编译

我们写一个具有条件编译的程序:

#include <stdio.h> #define M int main() { #ifndef M printf("社区版/免费版 version\n"); #else printf("专业版/收费版 version\n"); #endif }

再进行编译运行可得到结果:

gcc code.c -o code ./code

当我们注释掉M的定义之后,也可以在Linux中用命令行的方式来宏定义M:

// #define M
gcc code.c -o code -DM

D表示命令行级别的宏定义,M表示定义的宏变量就是M,不赋予初始值就是1

我们也可以赋给M初始值:

gcc code.c -o code -DM=100 #宏定义M为100
4.2.2 条件编译的用途

1)、软件对于专业度、收费情况进行业务区分,使用条件编译,可以进行代码动态裁剪

例如:vs2022社区版(免费版)/ 专业版(企业版)

2)、内核源代码也是采用条件编译进行代码裁剪

3)、开发工具、应用软件对于多平台的适配(例如:同一软件可以在Windows、Linux两个平台上跑)

4.2.3 编译器的产生

在4.1.2中,我们讲过C/C++为什么要先生成汇编,这类编译型语言就需要编译器来把它生成汇编语言,具体过程如下:

第一版编译器是二进制写的,用于将汇编语言编程二进制版,第二版编译器是汇编语言写的,将这个编译器用第一版编译器编译一下,之后第一版就不要了,诞生了第一个用汇编语言写的汇编编译器。

之后,用这个汇编语言写的编译器来编译汇编语言。

这个就是编译器的自举过程。

C/C++的编译器同理,它们是C/C++写的,通过编译器自举来生成第二版编译器编译对应语言。

4.3 动静态库

库是一套方法或者数据集,为我们开发提供最基本的保证(基本接口,功能,加速我们二次开发)

例如:

C语言标准库:libc.so.版本号

C语言静态库:libc.a.版本号

在Linux中,去掉前缀lib,去掉 . 后面的后缀,剩下的才是这个库的真实名字。上面C语言库的真实名字就是c

例如:xyz库就是 libxyz.so 或者 libxyz.a

4.3.1 什么叫做动态库?

动态库以.so结尾,其内部会自己实现方法,我们自己的程序(例如:code.c)会使用库中的方法(例如:printf),将自己的程序和动态库链接起来就能在库中找到方法,由此生成可执行程序。

动态库典型的特点:

1)、在执行目标方法的时候,需要跳转到库中执行,完成之后再返回。

2)、动态库也叫做共享库,其被多个程序共享,一旦缺失,会导致所有程序无法执行!

所谓的链接也就是让我们的程序能找到库中方法的地址,例如:printf -> libc.so:0x1234

这就是动态链接。

4.3.2 什么叫静态库?

那么,什么叫静态链接呢?

静态链接就是将方法在对应位置拷贝到我们的程序中,之后执行就直接在我们的程序中执行。

静态库只有在链接时有用,一旦形成可执行程序,静态库就可以不再需要。

4.3.3 动静态库对比

1)、动态库形成的可执行程序体积一定很小

2)、可执行程序对静态库的依赖小,但动态库不能缺失

3)、程序运行,需要加载到内存,静态链接的,会在内存中出现大量重复的代码

4)、动态链接保存的只是方法的地址,比较节省资源

4.3.4 验证

如图,gcc编译C语言默认使用的是动态链接。

我们可以要求gcc使用静态编译:

gcc code.c -o code -static

下载一下C语言静态库(我的系统是阿里云的Ubuntu 22.04.5 LTS):

apt install -y build-essential libc6-dev

检测一下是否有libc.a:

静态链接的方式编译code.c:

如图,代码体积太大了。

4.4 周边问题

1)、验证C++的编译:

C++和C基本上是一样的,我们可以看一下C++的库:

如图,libstdc++.so.6 就是C++的标准库。

我们可以用 file 命令来查看C/C++程序的链接方式:

如图,默认的也是动态链接。

我们依旧可以用 -static 来进行静态链接:

2)、关于动态库

动态库本质:让我们程序中公共的代码保证在内存中只出现一份。

这个时候动态库也更应该叫做共享库。

3)、Linux系统中相当多的指令依赖C动态库

4)、普通用户的sudo

在普通用户下,我们可能无法执行sudo命令:

这时候,我们需要切换到root用户,并进入sudoers文件里面进行修改:

如图,在Allow那一行下面加上红框框里面的内容,这样user1就能使用sudo命令了。

5)、库的本质

我们在分工写程序时,不愿意将自己的 .c/.cpp 源文件直接给他人,那么我们可以先将其编译成.o文件,再交给别人链接。

例如:code.h 中声明了方法,code.c中实现了方法,main.c是主程序。

我们不愿意直接给出code.c,那么可以:

gcc -c code.c

生成同名.o文件,这样他人就可以用我们实现的方法而不暴露我们的源代码了。

因此,库的本质就是被打包起来的 .o 文件。例如:.so文件

本期的分享就到这里,如果觉得博主的文章比较对胃口的话,可以点一个小小的关注~

您的三连是我持续更新的动力~

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/9 10:12:27

java八股,redis篇(缓存三兄弟,双写一致)

使用场景 缓存穿透&#xff1a; 原因&#xff08;查询一个空数据&#xff0c;mydql查询不到数据&#xff0c;也不会直接写入缓存&#xff0c;导致每次都访问数据库&#xff0c;可能会宕机&#xff09; 1.缓存空数据&#xff0c;但是内存消耗高2.布隆过滤器&#xff0c;使用哈希…

作者头像 李华
网站建设 2026/10/9 10:12:19

C语言在线编译器技术原理与教学实践指南

1. 为什么我坚持不用本地IDE写C语言小实验&#xff1f;去年带某高校嵌入式课程实训时&#xff0c;遇到一个典型场景&#xff1a;三名学生围在一台电脑前调试一个简单的链表反转程序。他们用的是某款主流IDE&#xff0c;但光是配置编译器路径、设置C标准版本、排除Windows路径分…

作者头像 李华
网站建设 2026/10/9 10:11:30

Kimi K3深度测评:长文本之外的真实力,TaoToken统一API通道实测

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/9 10:11:18

驱动开发从入门到实战:内核模块、字符设备与调试技巧全解析

1. 为什么我要写《驱动之路》这本书动笔写这个系列之前&#xff0c;我犹豫了很长时间。市面上关于硬件驱动开发的中文资料并不算少&#xff0c;但真正能让人从零开始、一步步跟着做下来还不掉坑里的内容&#xff0c;说实话&#xff0c;不多。大部分资料要么是芯片原厂的英文数据…

作者头像 李华
网站建设 2026/10/9 10:07:39

Navicat Premium 17 中文版安装教程(2026最新版)

⚠️ 声明&#xff1a;本教程仅供个人学习与研究数据库工具使用&#xff0c;不鼓励商业用途或违反软件许可协议。如经济允许&#xff0c;请支持正版软件。 一、准备工作 1.1 下载安装包 从网盘下载 Navicat Premium 17 安装包&#xff1a; 网盘链接&#xff1a;夸克网盘链接 …

作者头像 李华