
⭐️博主: 此生决int-@CSDN博客
** 速胜派就是最大的投降派!!!**
** 🔥热门专栏🔥**
文章目录
- [2. 基础开发工具](#2. 基础开发工具)
-
- [1. 软件包管理器 yum/apt](#1. 软件包管理器 yum/apt)
- [2. 编辑器 Vim](#2. 编辑器 Vim)
- [3. 编译器 gcc/g++](#3. 编译器 gcc/g++)
- 下期预告
- 基础开发工具(中)------makefile、进度条、git
- 结语
上期回顾
大家好,这里是此生弃int(财哥) ,欢迎来到我的博客。上一篇我们主要学习了 Linux权限相关 内容,了解了Linux的权限怎么管理,怎么查看。进一步加深了对Linux这一多用户操作系统 的了解。今天我们就开学习一下Linux的一些基础开发工具。!
2. 基础开发工具
1. 软件包管理器 yum/apt
一般软件的安装方式:
1,源码安装
2,软件包安装
3,包管理器安装✅
核心概念
- 软件包:预编译好、可直接安装的程序成品(对应 Windows 安装包)。
- 包管理器 :负责搜索/下载/安装/卸载软件包的工具,≈ 手机应用商店。
- 依赖:软件运行还需要其他软件陪着;包管理器的核心价值 = 自动解决依赖(缺失 + 版本兼容)。
- 安装本质 = 网络下载 + 拷贝 到系统目录 → 需要
sudo(root 权限),装一次全系统可用。 - 软件生态:评估 OS 好坏不只看系统本身,还看内核/社区/文档/用户群体/配套软件。- 软件链条:开发者发源码 → 社区编译打包 → 官方源服务器 → yum/apt 下载安装。
- 镜像源:保存同样软件包的"复制站点";改内置下载链接 = 换源(国内:阿里云/清华/中科大)。
- 开源本质是一种商业模式:代码开放,靠服务/支持/定制/平台盈利。
yum 三板斧【重点】
bash
yum list | grep 包名 # 查:列出并筛选软件包(| 是管道,把前面输出交给后面处理)
sudo yum install [-y] 包名 # 装:下载安装并自动处理依赖,-y 自动确认
sudo yum remove [-y] 包名 # 卸:卸载软件包
注意事项:
- 安装前先
ping www.baidu.com验证网络。 - 同一时刻只能进行一个 yum/apt 操作,否则报"被占用"。
- 查不到包:包名写错 / 源未配置 / 网络问题。
yum 与 apt 对照【易混】
| 目的 | CentOS yum |
Ubuntu apt |
|---|---|---|
| 搜索 | `yum list | grep 包名` |
| 查看信息 | 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 没有与 CentOS epel-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都默认前面的命令已经执行了 ,
代码示例:
bash
gcc -c hello.c -o hello.o # .c → .o:预处理 + 编译 + 汇编
gcc hello.o -o hello # .o → 可执行文件:链接
./hello # 运行当前目录下的可执行文件
############################################
gcc hello.c -o hello # 一步完成:预处理 → 编译 → 汇编 → 链接
./hello # 运行当前目录下的可执行文件
条件编译:
预处理的本质就是修改我们的文本代码,而不是生成机器码。
有时同一份源代码需要根据不同版本保留不同功能。例如,专业版包含收费功能,普通版不包含;或者内核根据硬件情况裁剪功能。条件编译就是根据条件决定哪些代码参与编译。
示例文件 feature.c:
c
#include <stdio.h>
int main(void) {
#ifdef PRO版
printf("professional feature\n");
#else
printf("basic feature\n");
#endif
return 0;
}
不定义宏时:
bash
gcc feature.c -o feature
./feature
#输出:basic feature
编译时通过命令行定义宏:
bash
gcc -DPRO版 feature.c -o feature
./feature
#输出:professional feature
命令行宏定义的语法是:
bash
gcc -DM 源文件 -o 目标文件
gcc -DM=100 源文件 -o 目标文件
-DM:定义宏M,相当于在代码中写#define M。-DM=100:定义宏M,并令它的值为100,相当于写#define M 100。
3-3 动态链接和静态链接
多文件编译
一个大型程序通常不写在一个文件中,而是分成多个源文件。每个源文件可以单独编译成 .o 目标文件,最后再统一链接。
例如:
bash
gcc -c main.c -o main.o
gcc -c math.c -o math.o
gcc main.o math.o -o app
流程如下:
text
main.c → main.o ┐
├→ 链接 → app
math.c → math.o ┘
这样修改 math.c 时,只需重新生成 math.o,不必重新编译没有变化的 main.c。
静态链接
静态链接 是指在生成程序时,把需要的库代码直接复制进可执行程序。
它的优点是:
- 程序运行时不需要再寻找外部库;
- 运行环境更独立;
- 库代码已经放入程序,运行时通常更直接。
它的缺点是:
- 多个程序都使用同一份库时,每个程序都保存一份副本,浪费磁盘空间和内存;
- 库更新后,已经生成的程序不会自动获得新库,通常需要重新链接甚至重新编译所有程序。
动态链接
动态链接 是指程序运行时,才加载需要的库。库代码不直接复制到每个程序中,而是由多个程序共同使用。
查看程序依赖哪些动态库:
bash
ldd hello
ldd 是查看动态链接依赖的命令。输出中通常会看到类似:
text
libc.so.6 => /lib64/libc.so.6
printf 的具体实现就在 C 标准库的动态库 libc.so.6 中。gcc 链接程序时,会根据需要去系统库目录中寻找它,常见目录包括 /usr/lib 或 /lib64。这就是链接的作用之一:找到程序所需的外部代码,并记录或合并它们。
动态链接把公共库留在系统中,程序运行时再加载;静态链接则在生成程序时把库代码复制进去。
一般都是使用动态链接
3-4 静态库和动态库
静态库 .a
静态库 是提前打包好的代码集合,文件后缀通常是 .a。进行静态链接时,库中被需要的代码会被复制到可执行文件中。
text
静态库 .a + 目标文件 .o
↓ 链接
可执行程序
程序生成后,即使删除这个静态库,程序通常仍然可以运行,因为所需代码已经被放进可执行文件。
动态库 .so
动态库 也是提前准备好的公共代码集合,文件后缀通常是 .so。进行动态链接时,库代码不会全部复制进可执行文件,而是在程序运行时才加载。
text
可执行程序 + 动态库 .so
↓ 运行时加载
程序运行
gcc 默认使用动态链接。也就是说,直接执行:
bash
gcc hello.c -o hello
通常会生成依赖动态库的程序。
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(用于条件编译、功能裁剪)【易忘】 |
验证与静态链接准备
bash
# 查看可执行文件类型,以及是否为动态链接
file hello
# 动态链接通常会显示:dynamically linked
# 静态链接通常会显示:statically linked
# 查看动态链接依赖的 .so 共享库
ldd hello
# 动态程序:列出依赖的共享库
# 静态程序:通常显示 not a dynamic executable


静态链接方式:gcc -static
bash
gcc -static hello.c -o hello

验证链接方式,使用 file 查看文件基本信息:
bash
file hello

本系统是自带了静态库,就是默认安装好了,没有安装的可以使用命令:
bash
# 如果需要完整的 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++ 静态库
sudo apt update
sudo apt install -y libc6-dev libstdc++-11-dev
# ==================== CentOS / RHEL ====================
# 静态链接前安装 C/C++ 静态库
sudo yum install -y glibc-static libstdc++-static
报错 cannot find -lc = 找不到 C 标准库的静态版本 → 装 glibc-static。
下期预告
基础开发工具(中)------makefile、进度条、git
结语
** 本文到此结束,感谢大家的阅读!如果觉得本文对你有所帮助,欢迎点赞、收藏、关注,也欢迎在评论区一起交流讨论。**
** 也欢迎订阅我的**
深入理解 C++系列:从语法入门到底层原理,系统掌握现代 C++
算法系列:从入门到精通,蓝桥杯、ACM、LeetCode 与面试算法全路线
快速复习系列:知识梳理、查漏补缺,考前冲刺必备
Linux系列:从零带你系统学习Linux系统,深入理解计算机组成原理!
** 愿每一次敲下键盘,都比昨天更进一步!** ** 愿每一行代码落下,都让未来多一种可能!**