Linux:开发工具
开发工具
- 一.软件包管理器
- 1.软件包概念
- 2.Linuxd的软件生态
- 2.1 软件下载过程
- 2.2 操作系统的生态
- 2.3 免费(社区)软件
- 2.4 软件依赖
- 2.5 镜像问题
- 3.软件包管理器的安装(Ubuntu)
- 二.vim
- 1.概念
- 2.vim的几个基础模式介绍
- 3.vim正常模式的命令集
- 3.1 插入模式切换(从命令模式进入)
- 3.2 光标移动(命令模式下)
- 3.3 删除操作(命令模式下)
- 3.4 复制与粘贴(命令模式下)
- 3.5 替换操作(命令模式下)
- 3.6 撤销与恢复(命令模式下)
- 3.7 更改操作(命令模式下)
- 3.8 跳至指定行(命令模式下)
- 4.vim末行模式命令集
- 4.1 末行模式进入方式
- 4.2 末行模式常用操作
- 5.总结
- 三.编译器 gcc和g++
- 1.gcc和g++的区别
- 2.编译代码过程(以gcc为例)
- 3.动静态库
- 3.1 动态库
- 3.2 静态库
- 3.3 动静态库对比
一.软件包管理器
1.软件包概念
- Linux下安装软件的常规方式之一:下载程序源代码,编译后得到可执行程序,但该方式较繁琐。
- 简化安装的方式:有人将常用软件提前编译好,做成软件包(类似Windows的安装程序)存放在服务器上,通过包管理器可方便获取并直接安装。
- 软件包与包管理器的关系:类似“App”和“应用商店”。
- yum包管理器:是Linux中常用的包管理器,主要应用于Fedora、RedHat、Centos等发行版。
- Ubuntu的包管理器:主要使用apt(Advanced Package Tool),它具备自动解决依赖关系、下载和安装软件包的功能。
2.Linuxd的软件生态
2.1 软件下载过程
- 用户通过包管理器(如yum/apt)发起软件下载安装指令。
- 包管理器向软件仓库请求目标软件包,同时自动分析并解决依赖(获取所需关联组件)。
- 下载软件包及依赖,自动完成安装(解压、配置到系统对应位置)。
- 卸载时,包管理器删除文件并清理配置。
2.2 操作系统的生态
为什么评估操作系统好坏时考虑生态问题?
原因如下:
- 社区论坛:活跃的社区论坛能提供丰富的用户交流空间。用户遇到问题时,可在论坛提问、获取解决方案,还能分享使用经验和技巧,这能极大提升用户的使用体验。 例如Linux的Ubuntu社区,用户间互助频繁,让新手快速上手。
- 官网文档:详细、易懂的官网文档,是用户学习和使用操作系统的重要指引。无论是普通用户配置系统,还是开发者进行应用开发,都能从中获取准确信息,保障操作系统的高效使用。像Windows官网就提供了丰富的操作指南。
- 软件体系:丰富且高质量的软件体系,决定了操作系统的功能拓展性。更多软件意味着用户能满足多样化需求,比如办公、娱乐、开发等。以macOS为例,其有大量专业的创意设计类软件,吸引了众多设计工作者。
- 维护更新速度:快速且稳定的维护更新,能及时修复安全漏洞、优化系统性能,提升操作系统的安全性和稳定性。像Android系统,更新及时的版本能更好地抵御安全威胁。
- 操作系统自身:操作系统自身的特性,如易用性、稳定性、兼容性等是基础。良好的系统自身素质,是吸引用户和开发者的关键。例如iOS系统,以流畅稳定和易用性著称。
- 富有针对性的客户群体:明确的客户群体,能让操作系统在特定领域深入优化,满足用户特定需求。 例如麒麟操作系统,针对政务办公场景进行优化,提供适配的办公软件和安全方案。
2.3 免费(社区)软件
为什么会有⼈免费特定社区提供软件,还发布?还提供云服务器让你下载?
一是技术共享与开源精神,推动技术进步、方便开发者学习交流;
二是积累声誉,利于个人职业发展或获得社区认同;
三是商业考量,可构建生态、通过增值服务盈利;
四是兴趣与成就感,享受创造和被认可的乐趣。
2.4 软件依赖
在软件运行时,往往不是独立的,会依赖其他的库文件(像图里的 .so
文件,这类文件是Linux系统里的动态链接库,能被多个程序共享使用)。
比如你要运行自己的软件,它直接依赖 libc.so
、ssl.so
、libhttplib.so
这些库。而 libhttplib.so
又不是完全独立的,它还依赖 libc++.so
,libc++.so
可能进一步依赖 XXX.so
。
“依赖列表”就是把这些所有需要的依赖库(包括直接依赖和间接依赖的)都整理在一起,这样才能确保软件顺利运行,缺少其中任何一个,软件都可能无法正常工作或者出现功能缺失的情况。
2.5 镜像问题
什么是镜像?
Linux里的“镜像”,简单说就两种:
-
软件源镜像:官方软件仓库的“复制件”,放别的服务器上。比如国外软件下载慢,国内服务器复制一份,你从国内下就快多了。
-
系统镜像:整个Linux系统的“打包文件”(像.iso格式),包含装系统需要的所有东西。烧到U盘或光盘里,就能用它装系统,也能用来备份或快速复制多台机器。
镜像的获取
上图展示了Linux系统下软件包的获取流程,涉及开发者、软件包服务器(国外和国内)以及云服务器(用户端):
- 开发者开发源代码,编译发布后,上线到国外软件包服务器(包含Ubuntu、CentOS等不同Linux环境的软件包)。
- 国内会对国外软件包服务器做“镜像”(复制一份内容),形成国内软件包服务器。
- 用户的云服务器通过包管理器(yum/apt),可选择从国外或国内软件包服务器发送查找、下载请求,获取软件包后,包管理器能解决依赖,完成下载、安装、卸载等操作;另外,还可通过替换配置(国内conf替换国外conf),让包管理器更便捷地从国内服务器获取资源,提升下载等操作的效率。
3.软件包管理器的安装(Ubuntu)
Ubuntu 自带**apt(Advanced Package Tool )**包管理器。
apt是Ubuntu及基于Debian的Linux发行版中用于管理软件包的工具 ,它可以帮助用户:
- 安装软件:使用
apt install 软件包名
命令,就能从配置好的软件源中下载并安装指定软件包。例如,要安装文本编辑器nano
,在终端中输入sudo apt install nano
,apt会自动解决软件的依赖关系, 并将软件包安装到系统中。 - 更新软件:运行
sudo apt update
命令可以更新本地软件源的索引,然后使用sudo apt upgrade
命令,就能将系统中已安装的软件更新到最新版本。 - 卸载软件:通过
sudo apt remove 软件包名
命令,能够卸载指定的软件包,但软件的配置文件可能会保留。如果想彻底删除软件及其配置文件,可以使用sudo apt purge 软件包名
命令。
二.vim
1.概念
Vim 是一款功能强大的文本编辑器
,广泛用于 Linux、Unix 等系统,也支持 Windows 等平台。它是经典编辑器 Vi 的增强版,保留了 Vi 的高效操作逻辑,同时增加了更多功能(如语法高亮、代码补全、多级撤销等)。
核心特点是命令行驱动,操作依赖大量快捷键和命令(而非鼠标点击),熟练后能极大提升文本编辑效率,尤其适合程序员编写代码、系统管理员配置文件等场景。
简单说,Vim 就像一个“纯键盘操作的高级记事本”。
2.vim的几个基础模式介绍
-
核心模式(掌握这3种即可):
- 命令模式(Normal mode):控制光标移动,执行字符/字/行的删除、移动复制区段,以及切换到插入模式或末行模式。
- 插入模式(Insert mode):唯一可进行文字输入的模式,按「ESC」键返回命令模式,是最常用的编辑模式。
- 末行模式(last line mode):用于文件保存、退出,还可进行文件替换、查找字符串、列出行号等操作;在命令模式下按「shift+:」进入。
-
其他模式:
- vim实际有12种模式,分为6种基础模式(BASIC modes)和6种附加模式(ADDITIONAL modes)。
- 查看方式:打开vim后,在末行模式输入「:help vim-modes」即可查看所有模式。
Vim的模式切换:
- 命令模式 ↔ 插入模式:在命令模式下,按下
i
键可进入插入模式,用于文字输入;在插入模式下,按下Esc
键可返回命令模式。 - 命令模式 ↔ 底行模式:在命令模式下,按下
shift+:
可进入底行模式,用于执行保存、退出、查找等操作;在底行模式下,按下Esc
键可返回命令模式。
3.vim正常模式的命令集
3.1 插入模式切换(从命令模式进入)
- 按「i」:从光标当前位置开始输入。
- 按「a」:从光标所在位置的下一个位置开始输入。
- 按「o」:插入新行,从行首开始输入。
- 退出插入模式:按「ESC」键返回命令模式。
3.2 光标移动(命令模式下)
- 基础移动:「h」(左)、「j」(下)、「k」(上)、「l」(右),各移一格。
- 行内移动:「$」(行尾)、「^」(行首)。
- 单词移动:「w」(下个字开头)、「e」(下个字尾)、「b」(上个字开头)。
- 指定位置:「#l」(移到该行第#个位置,如5l、56l)。
- 全文移动:「gg」(文本开头)、「shift+g」(文本末端)。
- 屏幕滚动:「ctrl+b」(后移一页)、「ctrl+f」(前移一页)、「ctrl+u」(后移半页)、「ctrl+d」(前移半页)。
3.3 删除操作(命令模式下)
- 字符删除:「x」(删除光标处1个字符)、「#x」(删除光标处及后共#个字符,如6x);「X」(删除光标前1个字符)、「#X」(删除光标前#个字符,如20X)。
- 行删除:「dd」(删除光标所在行)、「#dd」(从光标行开始删除#行)。
3.4 复制与粘贴(命令模式下)
- 复制:「yw」(复制光标处到字尾的字符)、「#yw」(复制#个字);「yy」(复制光标行)、「#yy」(复制光标行及往下共#行,如6yy)。
- 粘贴:「p」(将缓冲区内容粘贴到光标处)。
3.5 替换操作(命令模式下)
- 「r」:替换光标所在处1个字符。
- 「R」:持续替换光标所到字符,直到按「ESC」退出。
3.6 撤销与恢复(命令模式下)
- 撤销:「u」(撤销上一次操作,可多次按)。
- 恢复撤销:「ctrl+r」(恢复被撤销的操作)。
3.7 更改操作(命令模式下)
- 「cw」:更改光标处到字尾的内容。
- 「c#w」:更改#个字(如c3w更改3个字)。
3.8 跳至指定行(命令模式下)
- 查看行号:「ctrl+g」(显示光标所在行行号)。
- 跳转:「#G」(移至第#行首,如15G跳至第15行)。
4.vim末行模式命令集
4.1 末行模式进入方式
- 先按「ESC」确认处于命令模式,再按「:」(冒号)进入末行模式。
4.2 末行模式常用操作
-
列出行号
- 输入「set nu」,文件每一行前会显示行号。
-
跳至指定行
- 输入数字「#」(如15)并回车,直接跳至第#行。
-
查找字符
- 「/关键字」:从当前位置向后查找,按「n」继续向后找下一个。
- 「?关键字」:从当前位置向前查找,按「n」继续向前找下一个。
- 区别:「/」是向后搜索,「?」是向前搜索(可通过实际操作验证方向差异)。
-
保存文件
- 输入「w」,保存当前文件内容。
-
离开vim
- 「q」:正常退出(需文件已保存或未修改)。
- 「q!」:强制退出,不保存未修改内容。
- 「wq」:保存文件并退出(推荐常用)。
5.总结
上图展示了Vim编辑器的模式切换关系:
- 默认进入命令模式:启动Vim(如执行
vim XXXX.c
)时,默认进入命令模式。 - 命令模式与其他模式的切换:
- 与插入模式:在命令模式下按
a
/i
/o
进入插入模式,按Esc
返回命令模式。 - 与底行模式:在命令模式下按
shift+:
进入底行模式,按Esc
返回命令模式。 - 与替换模式:在命令模式下按
shift+r
进入替换模式,按Esc
返回命令模式。 - 与视图模式:在命令模式下按
ctrl+v
进入视图模式,按Esc
返回命令模式。
- 与插入模式:在命令模式下按
三.编译器 gcc和g++
1.gcc和g++的区别
对比项 | gcc | g++ |
---|---|---|
全称 | GNU Compiler Collection(GNU 编译器集合) | GNU C++ Compiler(GNU C++ 编译器) |
主要用途 | 主要用于编译 C 语言程序 | 主要用于编译 C++ 语言程序 |
默认编译方式 | 按 C 语言语法规则编译代码 | 按 C++ 语言语法规则编译代码 |
对文件的处理 | 对 .c 文件按 C 编译,对 .cpp 等文件可能按 C++ 编译(需手动指定标准库) | 无论文件后缀(.c、.cpp 等),均按 C++ 语法编译 |
标准库链接 | 编译 C++ 程序时,不会自动链接 C++ 标准库(需手动加 -lstdc++ ) | 自动链接 C++ 标准库(无需手动指定) |
语言特性支持 | 支持 C 语言的所有标准(C89、C99、C11 等) | 支持 C++ 语言的所有标准(C++98、C++11、C++17 等) |
预处理差异 | 预处理时定义 __STDC__ 宏(标识 C 环境) | 预处理时定义 __cplusplus 宏(标识 C++ 环境) |
常见使用场景 | 编译纯 C 项目(如 Linux 内核模块、C 库等) | 编译 C++ 项目(如 C++ 应用程序、带类/模板的代码等) |
补充说明:
在 Linux的Ubuntu版本 中,gcc
实际是一个编译器驱动程序,可通过参数(如 -x c++
)指定编译语言;而 g++
本质上是 gcc
的一个封装,默认启用 C++ 模式并链接 C++ 标准库。因此,用 gcc
编译 C++ 代码时需显式指定 -lstdc++
,而 g++
无需额外操作。
2.编译代码过程(以gcc为例)
gcc编译格式:gcc [选项] 要编译的文件 [选项] [目标文件]
-
预处理(宏替换等操作)
- 核心功能:完成宏定义替换、处理文件包含(如#include)、条件编译(如#ifdef)、去除代码注释等。
- 关键特征:针对以#号开头的预处理指令进行处理。
- 编译选项:使用“-E”选项,使gcc在预处理结束后停止后续编译步骤。
- 实例命令:
gcc –E hello.c –o hello.i
,其中“-o”指定输出目标文件,“.i”为预处理后的C程序文件。
-
编译(生成汇编代码)
- 核心功能:检查代码规范性和语法错误,确认代码逻辑后,将预处理后的代码翻译成汇编语言。
- 编译选项:使用“-S”选项,仅执行编译过程,不进行后续汇编操作,直接生成汇编代码。
- 实例命令:
gcc –S hello.i –o hello.s
,生成的“.s”文件为汇编代码文件。
-
汇编(生成二进制目标代码)
- 核心功能:将编译阶段生成的“.s”汇编文件转换为机器可识别的二进制目标代码。
- 编译选项:使用“-c”选项,实现汇编过程,生成二进制目标文件。
- 实例命令:
gcc –c hello.s –o hello.o
,“.o”为二进制目标代码文件。
-
链接(生成可执行文件或库文件)
- 核心功能:将多个目标文件及所需的库文件进行连接,整合为可执行文件或库文件。
- 实例命令:
gcc hello.o –o hello
,生成的“hello”为可执行文件。
3.动静态库
3.1 动态库
我们可以结合以上场景来感性理解动态库:
把动态库想象成学校外的“小蚂蚁网吧”,它是一个提供特定功能的公共场所。
- 张三(你的程序)需要用网吧的功能时,不会把网吧搬到自己家,而是由学长李四告诉他“去网吧的路线:东门直走100,左拐50”。
- 当张三在“内存宇宙一中”运行时,才会根据这个路线去动态库(网吧)那里“调用功能(库函数跳转)”,用完后再回到自己的代码继续执行(库函数返回)。
- 要是“小蚂蚁网吧”(动态库)突然没了(库文件缺失),张三、李四这些依赖它的程序,就都没法使用对应的功能了,也就是“一旦库缺失,所有相关程序无法运行”。
这种模式的好处是节省空间(多个程序共享同一个库,不用重复存),但缺点是得依赖这个外部库一直存在,库出问题所有依赖它的程序都会受影响。
3.2 静态库
感性认识静态库,我们可以结合上图中的类比来理解:
** 1. 静态库的“运作逻辑”**
把静态库想象成直接把“网吧的电脑”搬到你家。当你的程序(张三)需要用到库中的方法时,编译器和链接器会把这些方法直接拷贝到你的程序里(就像“给你一个电脑”,把功能内置到自己的程序中)。
** 2. 静态库的“独立特性”**
一旦链接成功,生成的可执行程序就不再需要静态库了。就好比你把电脑搬回家后,不管外面的网吧(静态库的源文件)是否存在,你都能在自己家里使用这台电脑的功能。
这种方式的好处是程序独立运行,不依赖外部库的存在;但缺点是会让程序体积变大(因为把库的代码复制了一份到自己程序里)。
3.3 动静态库对比
以下是动态库与静态库的优缺点对比表格:
对比维度 | 动态库(共享库) | 静态库 |
---|---|---|
文件体积 | 可执行文件体积小(仅包含调用接口) | 可执行文件体积大(包含库的完整代码) |
内存占用 | 多个程序共享同一份库,节省内存 | 每个程序都包含独立副本,内存占用高 |
更新维护 | 只需更新动态库文件,所有依赖程序受益 | 需重新编译链接程序才能更新库功能 |
依赖性 | 运行时依赖动态库文件,缺失则无法运行 | 不依赖外部文件,可独立运行 |
编译速度 | 编译链接速度快(无需复制库代码) | 编译链接速度慢(需复制整合库代码) |
兼容性 | 库版本变化可能导致程序兼容性问题 | 编译后与库版本绑定,兼容性更稳定 |