<5> Linux 开发工具:包管理 + Vim 实操 + GCC 编译流程 + 静态与动态链接详解

1.软件包管理

[2.Linux 软件包的生态问题](#2.Linux 软件包的生态问题)

[2.1 如果评估一款操作系统的好坏?](#2.1 如果评估一款操作系统的好坏?)

[2.2 生态好的操作系统,用的人才多,才重要](#2.2 生态好的操作系统,用的人才多,才重要)

[2.3 软件包 云端服务器](#2.3 软件包 云端服务器)

[2.4 依赖列表](#2.4 依赖列表)

[3. yum / apt 安装,搜索,删除操作](#3. yum / apt 安装,搜索,删除操作)

[3.1 yum / apt 的配置文件](#3.1 yum / apt 的配置文件)

[4. Vim 编辑器](#4. Vim 编辑器)

[4.0 !v ------ 历史命令快捷键,上一次v开头的命令](#4.0 !v —— 历史命令快捷键,上一次v开头的命令)

[4.0 vim [代码文件] + 行号](#4.0 vim [代码文件] + 行号)

[4.1 命令模式( Esc )](#4.1 命令模式( Esc ))

概念

[数字 + gg](#数字 + gg)

[数字 + G](#数字 + G)

[^ ------定位行首](#^ ——定位行首)

[ / ¥ ------定位行尾](# / ¥ ——定位行尾)

[HJKL ------ 左下上右](#HJKL —— 左下上右)

[w ------ 单词为单位,向后移动](#w —— 单词为单位,向后移动)

[b ------ 单词为单位,向前移动](#b —— 单词为单位,向前移动)

[n + yy ------ 复制当前行 / 向下 n 行](#n + yy —— 复制当前行 / 向下 n 行)

[n + p ------ 粘贴 / 粘贴 n 行](#n + p —— 粘贴 / 粘贴 n 行)

[u ------ 撤销操作 (细节)](#u —— 撤销操作 (细节))

[ctrl + r ------ 恢复操作](#ctrl + r —— 恢复操作)

[n + dd ------ 剪切 / 剪切 n 行(删除行)](#n + dd —— 剪切 / 剪切 n 行(删除行))

[n - x ------ 删除光标位置字符 / 删除光标位置 n 个字符](#n - x —— 删除光标位置字符 / 删除光标位置 n 个字符)

[ctrl + v ------区块选择,上下左右选中区域,可批量删除(d,x)](#ctrl + v ——区块选择,上下左右选中区域,可批量删除(d,x))

[~ ------ 当前光标大小写切换,然后光标右移](#~ —— 当前光标大小写切换,然后光标右移)

[n + r ------ 单次替换命令,替换 n 个字符,光标不变](#n + r —— 单次替换命令,替换 n 个字符,光标不变)

[ctrl + v ------ 上下左右区块选择,输入 I 进入插入,再输入 //](#ctrl + v —— 上下左右区块选择,输入 I 进入插入,再输入 //)

[ZZ ------ 命令模式中直接退出](#ZZ —— 命令模式中直接退出)

[4.2 插入模式( i )](#4.2 插入模式( i ))

[4.3 底行模式( : )](#4.3 底行模式( : ))

[! ------ 强制](#! —— 强制)

[q! ------ 强制退出(没保存,q不让退)](#q! —— 强制退出(没保存,q不让退))

[w! ------ 强制写入(保存)](#w! —— 强制写入(保存))

[wq ------ 保存并退出](#wq —— 保存并退出)

[wq! ------ 强制保存退出](#wq! —— 强制保存退出)

[!gcc 源文件.c ------ vim中不退出,编译生成 .out](#!gcc 源文件.c —— vim中不退出,编译生成 .out)

[set nu / nonu ------ 标记行号 / 取消行号](#set nu / nonu —— 标记行号 / 取消行号)

[vs [源码文件] ------ 多分屏对比!光标所在,就是正在操作的](#vs [源码文件] —— 多分屏对比!光标所在,就是正在操作的)

[ctrl + ww ------ 切换分屏](#ctrl + ww —— 切换分屏)

------打开不存在的文件,没保存退出不创建,保存退出了会自动新建------

[/[搜索的] ------ 向下查找高亮匹配,回车后,n 可切换下一个匹配的](#/[搜索的] —— 向下查找高亮匹配,回车后,n 可切换下一个匹配的)

[%s/[B]/[A]/g ------ A替换所有文本B](#%s/[B]/[A]/g —— A替换所有文本B)

[4.4 替换模式( R )](#4.4 替换模式( R ))

[4.5视图模式(ctrl + v)](#4.5视图模式(ctrl + v))

[5. 基础配置Vim(行号,缩进,补齐....)](#5. 基础配置Vim(行号,缩进,补齐....))

[6. 编译器编译(翻译)的过程](#6. 编译器编译(翻译)的过程)

[6.1 预处理 gcc -E ...](#6.1 预处理 gcc -E ...)

[6.2 编译 gcc -S ...](#6.2 编译 gcc -S ...)

[6.3 汇编 gcc -c ...](#6.3 汇编 gcc -c ...)

[6.4 编译口诀:Esc -> iso 与演示](#6.4 编译口诀:Esc -> iso 与演示)

[6.5 编译习惯](#6.5 编译习惯)

[6.6 计算机语言、编译器的发展](#6.6 计算机语言、编译器的发展)

[6.7 初步理解链接](#6.7 初步理解链接)

[6.70 系统默认动态链接](#6.70 系统默认动态链接)

[6.70 gcc 1.c -static ------ 强制静态链接](#6.70 gcc 1.c -static —— 强制静态链接)

[6.71 动态链接](#6.71 动态链接)

[6.72 静态链接](#6.72 静态链接)

1.软件包管理

Linux下安装,查找,卸载软件的方式:

1.源代码安装(难搞,不同版本配置不同,不好弄)

2.rpm包(类似于windows安装包,直接安装)

3.yum / apt :包管理器
这里重点理解 3. : 它就像是手机,windows的应用商店,本质是一个客户端程序

它就是Linux的应用商店。 它会连接到一个云服务器,其包含各种应用软件。服务器的链接地址已经下载在了本地Linux系统的配置文件中

使用命令后,会根据配置文件的服务器地址**,去访问服务器,查找,下载,安装**

2.Linux 软件包的生态问题

2.1 如果评估一款操作系统的好坏?

生态更完善的:

大公司在用的,社区、论坛活跃的,软件体系丰富,即拿即用的,官方维护更新及时...

2.2 生态好的操作系统,用的人才多,才重要

对于操作系统开发者,最重要的是:有人用!

如何有人用?生态好,才有人用!

2.3 软件包 云端服务器

由于是国外的,下载可能很慢,或者打不开网址,国内很多公司,或者高校,会提供云服务器镜像版本,也就是拷贝了一份,在国内地址,方便大家使用

2.4 依赖列表

3. yum / apt 安装,搜索,删除操作

-y 表示确认

如果一个Linux系统下有多个用户,只需要安装一次,就会同步到所有用户,删除也一样

并且,同时只能安装一个软件包,安装中再次安装,会报错

3.1 yum / apt 的配置文件

如果不满足需求,可以修改新的云服务器地址。

也可以安装新的扩展源。

4. Vim 编辑器

vs 2022 等:集成开发环境,集合多种功能:编写代码,调试代码,运行程序....

Vim 编辑器:具有多种模式的文本编辑器------只能用来编写代码 / 更改配置文件(本质文本编辑)

还有其他的,主流是vi,nano,vim

vim是vi的提升版,nano就是一个指令,可简单修改文本。
Vim作为Linux原生的文本修改器,可快速进行文本修改,其在效率上具有不可替代的作用。

4.0 !v ------ 历史命令快捷键,上一次v开头的命令

4.0 vim [代码文件] + 行号

打开代码文件时, + 行号,可直接定位到指定行号位置。

用于:大文件快速定位报错位置

4.1 命令模式( Esc )

概念

命令模式:快速进行各种编辑操作,提高效率

vim打开文本,默认所处模式就是命令模式
命令模式中,无法直接输入修改内容,需要进入插入模式,才能正常编辑

数字 + gg

进入文本首行的行首 / 进入第"数字"行的行首(首字母)

数字 + G

进入文本的末行的行首 / 进入第"数字"行的行首(首字母)

作用与gg相反。但是指定行时,作用一样。

意义:快速定位几千行中具体一行,十分方便

^ ------定位行首

$ / ¥ ------定位行尾

HJKL ------ 左下上右

w ------ 单词为单位,向后移动

b ------ 单词为单位,向前移动

n + yy ------ 复制当前行 / 向下 n 行

n + p ------ 粘贴 / 粘贴 n 行

u ------ 撤销操作 (细节)

ctrl + r ------ 恢复操作

n + dd ------ 剪切 / 剪切 n 行(删除行)

n - x ------ 删除光标位置字符 / 删除光标位置 n 个字符

ctrl + v ------区块选择,上下左右选中区域,可批量删除(d,x)

~ ------ 当前光标大小写切换,然后光标右移

n + r ------ 单次替换命令,替换 n 个字符,光标不变

ctrl + v ------ 上下左右区块选择,输入 I 进入插入,再输入 //

ZZ ------ 命令模式中直接退出

4.2 插入模式( i )

插入模式:正常编辑模式,可正常编写代码,和vs2022一样

4.3 底行模式( : )

! ------ 强制

q! ------ 强制退出(没保存,q不让退)

w! ------ 强制写入(保存)

wq ------ 保存并退出

wq! ------ 强制保存退出

!gcc 源文件.c ------ vim中不退出,编译生成 .out

set nu / nonu ------ 标记行号 / 取消行号

vs [源码文件] ------ 多分屏对比!光标所在,就是正在操作的

ctrl + ww ------ 切换分屏

------打开不存在的文件,没保存退出不创建,保存退出了会自动新建------

/[搜索的] ------ 向下查找高亮匹配,回车后,n 可切换下一个匹配的

%s/[B]/[A]/g ------ A替换所有文本B

4.4 替换模式( R )

命令模式下,输入 R 就会进入替换模式,输入的所有字符,都会直接覆盖光标处字符。

4.5视图模式(ctrl + v)

用于区块选择,可进行批量化复制,剪切,删除,添加 ..

5. 基础配置Vim(行号,缩进,补齐....)

家目录创建 .vimrc 文件,vim .vimrc ,输入基础配置项如:set nu

由于是家目录,配置也只能配置一个用户

6. 编译器编译(翻译)的过程

1.预处理 -> 编译 -> 汇编 -> 链接 ------ 编译器翻译C/C++语言的过程

gcc,g++是两个用于编译C/C++的编译器,他们内置于Linux,可直接使用。

再细分:gcc 是编译 C 的,g++ 是编译C/C++的

6.1 预处理 gcc -E ...

gcc -E .... 预处理完毕就停止

预处理包含:头文件展开,宏替换,去掉注释,条件编译。本质是纯文本裁剪

把 C语言 变成 "干净的C语言" (无头文件,注释,宏...)

预处理 核心功能 作用说明
1 头文件展开 #include 头文件内容,完整拷贝、展开到源文件中本质是头源合并的过程!
2 宏定义替换 #define 纯文本全局替换,宏全部展开
3 删除注释 注释全部清空删除
4 条件编译 解析 #ifdef / #ifndef / #else / #endif保留有效代码,剔除无效代码段, 本质文本

其中,条件编译在工程中很实用,主要用于:限制普通用户,解锁新功能(VIP版本)。

只需要修改宏定义,让条件编译进入另一种 if/else 结果,从而实现功能重合,但是随时解锁新内容,并且需要维护一份代码。

举个简单例子:

6.2 编译 gcc -S ...

gcc -S ... 编译完毕就停止

干净的C语言 -> 汇编语言

6.3 汇编 gcc -c ...

gcc -c ... 汇编完毕就停止

汇编语言 -> 二进制的可重定向目标文件

注意,该二进制文件无法运行!因为是"乱码",需要先将文件与动静态库(C标准库)进行链接,整合在一起,才能形成可执行文件,才能编译运行

6.4 编译口诀:Esc -> iso 与演示

6.5 编译习惯

工程上推荐直接 -c :统一生成 .o 目标文件

原因:修改单个.c 文件,只需重新编译这个文件对应的.o , 其他文件不用动!

不分开编译:编译器无法识别哪个文件变化,只能全部重新编译

分开编译:编译器精确定位修改的文件,单独修改它就行

6.6 计算机语言、编译器的发展

发展阶段 核心产物 关键特点 编译器形态
阶段 1 二进制机器指令 通电 / 断电抽象为 01,多组合形成指令->二进制纸带编程 无,纯手动写 01
阶段 2 汇编语言 二进制指令集的助记符包装,一一对应机器码 二进制编写的初代汇编编译器器
阶段 3 汇编自举 可读性大幅提升,开发效率提高 汇编编写汇编编译器(自举)
阶段 4 C 语言 高级语言,脱离硬件细节,更贴近人类逻辑 汇编语言编写初代 C 编译器
阶段 5 C 语言自举 生态彻底成熟,跨平台、易移植 C 语言编写 C 编译器(现代主流)

一开始:电机只有通电,断点,这被抽象解释为:二进制,0 与 1

后来,多个开关,对应多个01,多个01组合,就能产生不同结果,给对应每种二进制表达式,赋予行为,这就是指令,随后衍生出 二进制纸带编程------一长串打孔纸带,上面全是指令

再后来,二进制纸带编程麻烦。大佬们就发明了赛博编程语言------汇编语言

本质没有区别,都刻录CPU的指令集(刻录二进制序列),汇编语言只是把二进制序列,翻译为具体人能理解的名称

比如1011001,可能是加法,但是麻烦。汇编语言后,可以翻译为:ADD ------ 助记符

所以:汇编语言就是对指令集的包装
汇编语言包装了指令集,这就是初代编译器------二进制序列写的汇编编译器

有了初代汇编编译器,就可以写软件了!这时候,又发明了:新汇编编译器------汇编语言写的汇编编译器------左脚踩右脚升天!编译器和语言的自举过程!

因为汇编语言是初代的,还是不够人类,再后来大佬们又发明了C语言,以及C编译器

------汇编语言写的C编译器------ 同样,又可以用C写C编译器......

6.7 初步理解链接

库是什么?C标准库,定义了很多常用的函数,所以:库的目** 的是提高开发效率** 。如果所有程序员都得反复写比如:printf,这类常用函数,将会浪费大量时间效率

系统 库类型 扩展名 命名规则示例
Windows 动态库 .dll xxx.dll(如 kernel32.dll
Windows 静态库 .lib xxx.lib(如 msvcrt.lib
Linux 动态库 .so libxxx.so(如 libc.so
Linux 静态库 .a libxxx.a(如 libc.a
库类型 链接方式
动态库 通常与程序进行动态链接
静态库 通常与程序进行静态链接

6.70 系统默认动态链接

可以看到,ls这个指令使用了c的动态库,和Linux的动态库

gcc、g++,默认都是动态链接,因为节约空间资源

6.70 gcc 1.c -static ------ 强制静态链接

6.71 动态链接

程序中涉及的库函数,编译器-链接器会向程序写入该库函数的地址引用,程序运行到库函数时,会去指定地址查找,加载,并执行库函数代码,此过程为动态链接
缺点:

库文件缺失,就无法提供地址,但凡涉及库的内容,都将无法运行

优点:

应用程序占用体积小,不必下载整个库 / 库函数,而是去动态库执行完再返回,按需使用

6.72 静态链接

把每个程序要用的库函数的实现,都拷贝一份到源文件中,不必再去动态链接,自己就有。

这就是静态链接
缺点:

代码,程序体积巨大,下载了很多函数,多个程序各拷各的,无法互相复用代码,十分冗余

优点:

不必依赖其他库,不必去查找链接,调用执行效率高

相关推荐
我也不曾来过11 小时前
传输层协议UDP和TCP
linux·网络·udp
molihuan1 小时前
最新VMware Ubuntu 1分钟极速安装 植物人教程
linux·ubuntu
拜托啦!狮子2 小时前
安装EnsDb.Hsapiens.v86
java·服务器·前端
sdm0704272 小时前
深刻理解进程信号
linux·运维·服务器
Simonhans2 小时前
Linux安装Bun
linux·bun
数智化精益手记局2 小时前
什么是安全生产?解读安全生产的基本方针与核心要求
大数据·运维·人工智能·安全·信息可视化·自动化·精益工程
70asunflower2 小时前
Ubuntu `tree` 命令完全指南:让目录结构一目了然
linux·数据库·ubuntu
老四啊laosi2 小时前
【Linux系统】16. 进程程序替换
linux·exec·程序替换
scheduleTTe2 小时前
Nginx
服务器·前端·nginx