[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 静态链接
把每个程序要用的库函数的实现,都拷贝一份到源文件中,不必再去动态链接,自己就有。
这就是静态链接
缺点:代码,程序体积巨大,下载了很多函数,多个程序各拷各的,无法互相复用代码,十分冗余
优点:
不必依赖其他库,不必去查找链接,调用执行效率高









