Linux系列(04)——基础开发工具(上)软件包管理器、vim、gcc/g++

⭐️博主: 此生决int-@CSDN博客
** 速胜派就是最大的投降派!!!**

**         🔥热门专栏🔥**

      深入理解 C++ 系列 | 算法系列

      快速复习系列 | Linux系列

Gitee地址:财哥 | GitHub地址:财哥


文章目录

上期回顾

  大家好,这里是此生弃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

批量注释【重点】

  1. 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系统,深入理解计算机组成原理!


**  愿每一次敲下键盘,都比昨天更进一步!** **  愿每一行代码落下,都让未来多一种可能!**

相关推荐
Huangjin007_1 小时前
【Linux 系统篇(二十六)】文件(三): 深入理解 “一切皆文件”、缓冲区
linux·运维·服务器
2401_868534781 小时前
2024年11月软考网规
运维·服务器
谢亮_vipxieliang1 小时前
Go 并发安全性保障
服务器·网络·golang
杨云龙UP1 小时前
Oracle 19c RAC到RAC Active Data Guard标准搭建与巡检指南
运维·服务器·数据库·oracle·adg·data guard·rac到rac
我不会起名字3221 小时前
Redis 入门(一):Redis 是什么,为什么后端都离不开它
linux·redis·docker·安装·cli
都适、隶仁ミ1 小时前
【等保加固】MySQL5.7.38
运维·服务器·mysql·安全·等保
沉下心来学鲁班2 小时前
DeepAgents 记忆机制:让 AI Agent 拥有“跨对话“的记忆
服务器·人工智能·python
Huangjin007_2 小时前
【Linux 系统篇(二十七)】文件(四):Ext 系列文件系统(上):从物理磁盘到逻辑抽象
linux·运维·服务器
鬼手点金2 小时前
opencode-隐私优先配置
服务器·前端·javascript·bug·openclaw