⭐️博主:此生决int-@CSDN博客
🔥热门专栏🔥
深入理解 C++ 系列|算法系列
快速复习系列|Linux系列
Gitee地址:财哥 | GitHub地址:财哥
文章目录
- 上期回顾
- 2. 基础开发工具
- 1. 软件包管理器 yum/apt
- 核心概念
- yum 三板斧【重点】
- yum 与 apt 对照【易混】
- 安装源与包名解读
- CentOS
- Ubuntu
- 2. 编辑器 Vim
- 核心:多模式【重点】
- 正常模式命令集
- 末行模式命令集
- 命令总结:
- 批量注释【重点】
- 配置文件
- 3. 编译器 gcc/g++
- 编译四阶段【复习】
- 条件编译:
- 3-3 动态链接和静态链接
- 多文件编译
- 静态链接
- 动态链接
- 3-4 静态库和动态库
- 静态库 `.a`
- 动态库 `.so`
- 动态链接 vs 静态链接【易混】【重点】
- 其他常用选项(暂时不讲,仅了解)
- 验证与静态链接准备
- 下期预告
- 基础开发工具(中)——makefile、进度条、git
- 结语
上期回顾
大家好,这里是此生弃int(财哥),欢迎来到我的博客。上一篇我们主要学习了Linux权限相关内容,了解了Linux的权限怎么管理,怎么查看。进一步加深了对Linux这一多用户操作系统的了解。今天我们就开学习一下Linux的一些基础开发工具。!
2. 基础开发工具
1. 软件包管理器 yum/apt
一般软件的安装方式:
1,源码安装
2,软件包安装
3,包管理器安装✅
核心概念
- 软件包:预编译好、可直接安装的程序成品(对应 Windows 安装包)。
- 包管理器:负责搜索/下载/安装/卸载软件包的工具,≈ 手机应用商店。
- 依赖:软件运行还需要其他软件陪着;包管理器的核心价值 = 自动解决依赖(缺失 + 版本兼容)。
- 安装本质 =网络下载 + 拷贝到系统目录 →需要
sudo(root 权限),装一次全系统可用。 - 软件生态:评估 OS 好坏不只看系统本身,还看内核/社区/文档/用户群体/配套软件。- 软件链条:开发者发源码 → 社区编译打包 → 官方源服务器 → yum/apt 下载安装。
- 镜像源:保存同样软件包的"复制站点";改内置下载链接 = 换源(国内:阿里云/清华/中科大)。
- 开源本质是一种商业模式:代码开放,靠服务/支持/定制/平台盈利。
yum 三板斧【重点】
yum list|grep包名# 查:列出并筛选软件包(| 是管道,把前面输出交给后面处理)sudoyuminstall[-y]包名# 装:下载安装并自动处理依赖,-y 自动确认sudoyum remove[-y]包名# 卸:卸载软件包注意事项:
- 安装前先
ping www.baidu.com验证网络。 - 同一时刻只能进行一个 yum/apt 操作,否则报"被占用"。
- 查不到包:包名写错 / 源未配置 / 网络问题。
yum 与 apt 对照【易混】
| 目的 | CentOSyum | Ubuntuapt |
|---|---|---|
| 搜索 | yum list | grep 包名 | apt search 包名 |
| 查看信息 | yum info 包名 | apt show 包名 |
| 查看已安装 | yum list installed | apt list --installed |
| 安装 | sudo yum install 包名 | sudo apt install 包名 |
| 卸载 | sudo yum remove 包名 | sudo apt remove 包名 |
| 更新软件源索引 | yum makecache | sudo apt update |
| 升级软件包 | sudo yum update | sudo apt upgrade |
安装源与包名解读
CentOS
- CentOS 源配置目录:
/etc/yum.repos.d/。
-CentOS-Base.repo= 标准源(稳定);epel.repo= 扩展源(求全)。 - 装扩展源:
sudo yum install -y epel-release。 - 包名
xxx.x86_64 1.0-3.el7 base:x86_64= 64 位架构;el7= 面向 CentOS 7;base= 提供它的软件源名。
Ubuntu
- Ubuntu 源配置文件:
/etc/apt/sources.list;额外源配置目录:/etc/apt/sources.list.d/。 sources.list/*.sources= 软件源配置;*.list= 传统的软件源配置文件。
Ubuntu 没有与 CentOSepel-release完全对应的统一扩展源;第三方软件通常通过 PPA、官方提供的软件源等方式添加。
- Ubuntu 官方仓库主要分为:
main= 官方支持的核心软件;universe= 社区维护的软件;restricted= 受限制的专有软件/驱动;multiverse= 受版权或法律限制的软件。 - 包名
tree/jammy,now 2.0.2-1 amd64 [installed]:amd64= 64 位 x86 架构;jammy= Ubuntu 22.04;2.0.2-1= 软件包版本;[installed]= 已安装。
2. 编辑器 Vim
核心:多模式【重点】
- vim 只是编辑器(写代码),不管编译(gcc)和调试(gdb);IDE = 三者集成。
- vim 是 vi 升级版,兼容 vi 全部指令;共 12 种模式,掌握 3 种即可。
| 模式 | 用途 | 进入方式 |
|---|---|---|
| 正常/命令模式(默认) | 移动、删除、复制 | Esc随时返回 |
| 插入模式 | 输入文字 | i光标前 /a光标后 /o下方新行 |
| 末行模式 | 保存、退出、查找 | 正常模式按: |
【易忘】进入 vim 默认是正常模式,直接打字不会输入,是在执行命令。
正常模式命令集
以下命令前加数字=连续执行该命令多少次,或者跳转的第数学行
| 类别 | 命令 |
|---|---|
| 移动 | h/j/k/l左下上右;G文末;gg文首;#G跳第 # 行;$行尾;^行首;w/e/b按词跳;ctrl+f/b整页;ctrl+d/u半页 |
| 删除 | x删字符;#x删 n 个;dd删行;#dd删 n 行 |
| 复制粘贴 | yy复制行;#yy复制 n 行;yw复制词;p粘贴 |
| 替换撤销 | r替换 1 字符;R连续替换;cw删词并进入插入;u撤销;ctrl+r恢复 |
末行模式命令集
| 命令 | 功能 |
|---|---|
:w/:q/:wq/:q! | 保存 / 退出 / 保存并退出 / 强制不存退出 |
:set nu | 显示行号 |
:# | 跳第 # 行 |
/关键字+n | 向后查找 + 下一个 |
?关键字 | 向前查找 |
命令总结:
| 作用 | Vim 命令 | 类似 Windows 命令 |
|---|---|---|
| 复制当前行 | yy | Ctrl+C |
| 复制多行 | nyy | Shift + 方向键→Ctrl+C |
| 粘贴 | p | Ctrl+V |
| 删除当前行 | dd | Shift + Home→Delete |
| 删除多行 | ndd | Shift + 方向键→Delete |
| 删除当前字符 | x | Delete |
| 删除前一个字符 | X | Backspace |
| 撤销 | u | Ctrl+Z |
| 重做 | Ctrl+R | Ctrl+Y |
| 查找当前单词 | * | Ctrl+F |
| 继续查找 | n | Enter |
| 跳到文件开头 | gg | Ctrl+Home |
| 跳到文件末尾 | G | Ctrl+End |
| 跳到行首 | ^ | Home |
| 跳到行尾 | $ | End |
| 向前移动一个单词 | w | Ctrl+→ |
| 向后移动一个单词 | b | Ctrl+← |
| 进入插入模式 | i | 直接输入 |
| 光标后进入插入模式 | a | 直接输入 |
| 新开一行并进入插入模式 | o | End→Enter |
| 替换字符 | r | 直接输入新字符 |
| 连续替换 | R | Insert |
| 切换大小写 | ~ | 手动修改 |
| 块选择 | Ctrl+v | 鼠标按列拖选 |
| 块选择后批量插入 | I | 多行同时输入 |
| 退出当前模式 | Esc | Esc |
| 末行模式命令 | ||
| 保存 | :w | Ctrl+S |
| 退出 | :q | Alt+F4 |
| 保存并退出 | :wq | Ctrl+S→Alt+F4 |
| 不保存强制退出 | :q! | 关闭窗口且不保存 |
| 显示行号 | :set nu | — |
| 取消行号 | :set nonu | — |
| 执行 Linux 命令 | :!命令 | Win+R→ 输入命令 |
| 全文替换 | :%s/旧/新/g | Ctrl+H |
| 垂直分屏 | :vs 文件名 | 分屏窗口 |
| 分屏切换 | Ctrl+w |
批量注释【重点】
ctrl+v块选择(按列选)→ 2. 选中多行 → 3.shift+i输入//→ 4.Esc应用到所有行。
- 去注释:
ctrl+v选中//→ 按d。
配置文件
/etc/vimrc(全用户)vs~/.vimrc(当前用户)。- 常用三行:
syntax on(高亮)、set nu(行号)、set shiftwidth=4(缩进 4)。 - 自带教程:
vimtutor。
3. 编译器 gcc/g++
gcc,g++大部分选项是一样的,讲解以gcc为主
gcc——C语音
g++——C++
这里关于程序编译的内容,之前已经讲过了,这里稍微复习一下。
编译四阶段【复习】
| 阶段 | 工作 | 产物 | 选项 | 记忆 |
|---|---|---|---|---|
| 预处理 | 宏替换、删注释、条件编译、展开头文件 | .i | -E | 只改文本 |
| 编译 | 翻译成汇编代码 | .s | -S | 还是文字 |
| 汇编 | 翻译成机器码 | .o目标文件 | -c | 不链接 |
| 链接 | 合并 .o + 库代码 | 可执行程序 | 无(默认) | 补 printf 等 |
记忆:选项依次是:ESc(键盘右上角的退出键),和iso
一般先编译成.o,在编译成可执行程序
-E -S -c都默认前面的命令已经执行了,
代码示例:
gcc-chello.c-ohello.o# .c → .o:预处理 + 编译 + 汇编gcc hello.o-ohello# .o → 可执行文件:链接./hello# 运行当前目录下的可执行文件############################################gcc hello.c-ohello# 一步完成:预处理 → 编译 → 汇编 → 链接./hello# 运行当前目录下的可执行文件条件编译:
预处理的本质就是修改我们的文本代码,而不是生成机器码。
有时同一份源代码需要根据不同版本保留不同功能。例如,专业版包含收费功能,普通版不包含;或者内核根据硬件情况裁剪功能。条件编译就是根据条件决定哪些代码参与编译。
示例文件feature.c:
#include<stdio.h>intmain(void){#ifdefPRO版printf("professional feature\n");#elseprintf("basic feature\n");#endifreturn0;}不定义宏时:
gcc feature.c-ofeature ./feature#输出:basic feature编译时通过命令行定义宏:
gcc -DPRO版 feature.c-ofeature ./feature#输出:professional feature命令行宏定义的语法是:
gcc-DM源文件-o目标文件 gcc-DM=100源文件-o目标文件-DM:定义宏M,相当于在代码中写#define M。-DM=100:定义宏M,并令它的值为100,相当于写#define M 100。
3-3 动态链接和静态链接
多文件编译
一个大型程序通常不写在一个文件中,而是分成多个源文件。每个源文件可以单独编译成.o目标文件,最后再统一链接。
例如:
gcc-cmain.c-omain.o gcc-cmath.c-omath.o gcc main.o math.o-oapp流程如下:
main.c → main.o ┐ ├→ 链接 → app math.c → math.o ┘这样修改math.c时,只需重新生成math.o,不必重新编译没有变化的main.c。
静态链接
静态链接是指在生成程序时,把需要的库代码直接复制进可执行程序。
它的优点是:
- 程序运行时不需要再寻找外部库;
- 运行环境更独立;
- 库代码已经放入程序,运行时通常更直接。
它的缺点是:
- 多个程序都使用同一份库时,每个程序都保存一份副本,浪费磁盘空间和内存;
- 库更新后,已经生成的程序不会自动获得新库,通常需要重新链接甚至重新编译所有程序。
动态链接
动态链接是指程序运行时,才加载需要的库。库代码不直接复制到每个程序中,而是由多个程序共同使用。
查看程序依赖哪些动态库:
ldd helloldd是查看动态链接依赖的命令。输出中通常会看到类似:
libc.so.6 => /lib64/libc.so.6printf的具体实现就在 C 标准库的动态库libc.so.6中。gcc链接程序时,会根据需要去系统库目录中寻找它,常见目录包括/usr/lib或/lib64。这就是链接的作用之一:找到程序所需的外部代码,并记录或合并它们。
动态链接把公共库留在系统中,程序运行时再加载;静态链接则在生成程序时把库代码复制进去。
一般都是使用动态链接
3-4 静态库和动态库
静态库.a
静态库是提前打包好的代码集合,文件后缀通常是.a。进行静态链接时,库中被需要的代码会被复制到可执行文件中。
静态库 .a + 目标文件 .o ↓ 链接 可执行程序程序生成后,即使删除这个静态库,程序通常仍然可以运行,因为所需代码已经被放进可执行文件。
动态库.so
动态库也是提前准备好的公共代码集合,文件后缀通常是.so。进行动态链接时,库代码不会全部复制进可执行文件,而是在程序运行时才加载。
可执行程序 + 动态库 .so ↓ 运行时加载 程序运行gcc默认使用动态链接。也就是说,直接执行:
gcc hello.c-ohello通常会生成依赖动态库的程序。
Windows 中对应的常见文件类型是:
| Linux | Windows |
|---|---|
动态库.so | 动态库.dll |
静态库.a | 静态库.lib |
动态链接 vs 静态链接【易混】【重点】
| 对比项 | 动态链接 | 静态链接 |
|---|---|---|
| 库代码位置 | 运行时从.so加载 | 生成时复制进程序 |
| 程序体积 | 小 | 大 |
| 外部依赖 | 依赖,库缺失就挂(网吧关门) | 不依赖(电脑买回家) |
| 多程序共享 | 共享一份,省内存磁盘 | 各自一份副本 |
| 库更新 | 换库即生效 | 需重新链接 |
| gcc 默认 | 是 | 加-static |
- 库后缀:Linux 动态
.so/ 静态.a;Windows 对应.dll/.lib。【易忘】 - 本质:动态链接 = 多程序共享内存中同一份公共代码。
其他常用选项(暂时不讲,仅了解)
| 选项 | 功能 |
|---|---|
-o | 指定输出文件名 |
-g | 加调试信息(gdb 调试必需)【重点】 |
-static | 静态链接 |
-shared | 生成动态库 |
-O0~-O3 | 优化级别(O0 不优化便于调试) |
-w/-Wall | 关警告 / 开常用警告(推荐 -Wall) |
-DM/-DM=100 | 命令行定义宏,等价#define M(用于条件编译、功能裁剪)【易忘】 |
验证与静态链接准备
# 查看可执行文件类型,以及是否为动态链接filehello# 动态链接通常会显示:dynamically linked# 静态链接通常会显示:statically linked# 查看动态链接依赖的 .so 共享库ldd hello# 动态程序:列出依赖的共享库# 静态程序:通常显示 not a dynamic executable
静态链接方式:gcc -static
gcc-statichello.c-ohello
验证链接方式,使用file查看文件基本信息:
filehello
本系统是自带了静态库,就是默认安装好了,没有安装的可以使用命令:
# 如果需要完整的 GCC 静态链接环境,可检查系统是否提供对应静态库ls/usr/lib/x86_64-linux-gnu/libc.a# c静态库ls/usr/lib/gcc/x86_64-linux-gnu/*/libstdc++.a# c++静态库# 安装命令如下# ==================== Ubuntu / Debian ====================# 安装静态链接所需的 C/C++ 静态库sudoaptupdatesudoaptinstall-ylibc6-dev libstdc++-11-dev# ==================== CentOS / RHEL ====================# 静态链接前安装 C/C++ 静态库sudoyuminstall-yglibc-static libstdc++-static报错cannot find -lc= 找不到 C 标准库的静态版本 → 装glibc-static。
下期预告
基础开发工具(中)——makefile、进度条、git
结语
本文到此结束,感谢大家的阅读!如果觉得本文对你有所帮助,欢迎点赞、收藏、关注,也欢迎在评论区一起交流讨论。
也欢迎订阅我的
深入理解 C++系列:从语法入门到底层原理,系统掌握现代 C++
算法系列:从入门到精通,蓝桥杯、ACM、LeetCode 与面试算法全路线
快速复习系列:知识梳理、查漏补缺,考前冲刺必备
Linux系列:从零带你系统学习Linux系统,深入理解计算机组成原理!