当前位置: 首页 > news >正文

Linux 开发工具:yum、vim 与 gcc 实操指南

Linux 开发工具:yum、vim 与 gcc 实操指南

会写代码只是起点。在 Linux 上把代码编译成能跑的程序——这中间隔着一套你迟早要掌握的工具链。

本文讲三个最核心的开发工具:包管理器 yum、编辑器 vim、编译器 gcc。每个都从"这是什么"讲到"怎么用",不讲虚的。


写在前面:Linux 怎么装软件?

Windows 上的习惯是:打开浏览器 → 搜索软件名 → 下载 .exe → 双击安装。每一步都是手动操作的。

Linux 不这样。Linux 用包管理器——一个命令行工具,统一负责软件的搜索、安装、升级和卸载。你不需要知道软件从哪下载,包管理器替你处理一切:从哪个服务器拉取、依赖哪些其他包、安装到哪个目录。

这就像手机上的应用商店——只不过 Linux 的应用商店是命令行里敲出来的,而且比任何一个 App Store 都早出现了十几年。

📖 参考:《鸟哥的 Linux 私房菜》软件管理篇 + linux-command 网站


yum:Linux 软件包管理器

什么是 yum

yum(Yellow dog Updater, Modified)是 Fedora、RedHat、CentOS 等发行版使用的软件包管理工具。Ubuntu 系用apt(Advanced Package Tool),原理完全一样,只是命令名不同。

发行版包管理器软件包格式
CentOS / RHEL / Fedorayum(新版用dnf.rpm
Ubuntu / Debianapt.deb

软件源与镜像

包管理器需要知道"去哪下载软件"——这个地址叫软件源(Repository)

CentOS 的软件源配置在/etc/yum.repos.d/目录下:

ls-l/etc/yum.repos.d/# CentOS-Base.repo # 基础软件源# epel.repo # EPEL 扩展源

Ubuntu 的软件源在/etc/apt/sources.list

默认软件源在国外,国内访问慢得让人想掀桌。建议换成国内镜像站:

镜像站地址
阿里云https://developer.aliyun.com/mirror/
清华大学https://mirrors.tuna.tsinghua.edu.cn/
中科大http://mirrors.ustc.edu.cn/
网易http://mirrors.163.com/

EPEL(Extra Packages for Enterprise Linux)是一个重要的扩展源,很多官方源里没有的软件包都在这里:

sudoyuminstall-yepel-release# 先装 EPEL 源,才能搜到更多包

查找软件包

不确定软件包的确切名字?用yum list配合grep筛选:

# CentOS — 搜索包含 lrzsz 的包yum list|greplrzsz# 输出: lrzsz.x86_64 0.12.20-36.el7 @base# Ubuntu — 等价操作aptsearch lrzszaptshow lrzsz# 查看包的详细信息

解读一下包名里的信息:lrzsz.x86_64x86_64表示 64 位架构(i686是 32 位);el7表示适配 CentOS 7 / RHEL 7;@base表示该包来自 base 软件源。

安装与卸载

# === 安装 ===# CentOSsudoyuminstall-ylrzsz# Ubuntusudoaptinstall-ylrzsz# === 卸载 ===# CentOSsudoyum remove-ylrzsz# Ubuntusudoaptremove-ylrzsz

几个需要注意的点:

  • -y表示对所有确认提示自动回答 “yes”——省去安装过程中手动敲y的麻烦
  • 看到Complete!就说明安装成功
  • 安装软件是系统级操作,需要sudo提权(或直接用 root)
  • yum/apt在同一时刻只能运行一个实例——如果提示 “Another app is currently holding the yum lock”,等上一个装完再跑

⚠️ 执行yum installapt install之前,先ping www.baidu.com确认网络是通的。网络不通的时候 yum 不会报"网络不可达",只会卡在那转圈——这对新手来说是个常见的困惑来源。


vim:在终端里写代码

IDE 的反面

Windows 上有 VS、VS Code、CLion——图形化的 IDE 帮你完成代码补全、语法检查、一键编译,甚至连 main 函数的框架都能自动生成。

vim 是这一切的反面。它不帮你写代码,不自动补全(除非你自己装插件),甚至退出都要先学三个按键。

那为什么还要学它?

因为在生产环境中,没有图形界面。你通过 SSH 连上服务器,面对的只有一个黑底白字的终端窗口。想改配置?改代码?查日志?只有 vim。它不是"一个选择",它是"唯一的工具"。vim 内置于几乎所有 Unix/Linux 发行版中,跨平台可用,你学到的东西不会因为换了一台机器就失效。

📖 参考:《鸟哥的 Linux 私房菜》vim 章节 + vimtutor 内置教程(终端输入vimtutor即可打开)

vim 的核心设计:三种模式

vim 和所有你见过的文本编辑器都不同——它有模式。同一个按键,在不通模式下做不同的事。这是 vim 初学者最大的困惑,也是 vim 效率的来源。

模式进入方式作用提示符
命令模式(Normal)打开 vim 就是浏览文件、删除、复制、粘贴
插入模式(Insert)命令模式下按i/a/o像普通编辑器一样打字左下角-- INSERT --
底行模式(Last Line)命令模式下按Shift + ;(即:保存、退出、搜索、设置底部出现:

用一张图来表示三种模式之间的切换:

打开 vim │ ▼ ┌──────────┐ i / a / o ┌──────────┐ │ 命令模式 │ ──────────────────► │ 插入模式 │ │ (Normal) │ ◄────────────────── │ (Insert) │ └─────┬────┘ ESC └──────────┘ │ │ Shift + ; (即 :) ▼ ┌──────────┐ │ 底行模式 │ │ (Cmdline) │ └──────────┘

核心规则就两条:

  1. 从任何地方按ESC都能回到命令模式
  2. 从命令模式按:进入底行模式

如果你不知道自己在哪个模式——按ESC。如果你不知道该按什么——按ESC。ESC 是 vim 里的"安全词"。

基本操作:生存手册

vimtest.c# 打开 test.c(文件不存在则新建)
插入模式 — 三种进入方式
按键效果
i光标前插入
a光标后插入(append)
o下一行新起一行插入

刚学的时候用i就够了。等熟练了,o是换行利器,a在行尾补分号的时候很顺手。

命令模式 — 光标移动

vim 的精髓在于:手不离开主键盘区域就能移动光标。

按键移动目标
h/j/k/l← / ↓ / ↑ / →
0/$行首 / 行尾
gg/G文件开头 / 文件末尾
w/b下一词开头 / 上一词开头
e当前词结尾
Ctrl+f/Ctrl+b向下翻页 / 向上翻页
Ctrl+u/Ctrl+d向上翻半页 / 向下翻半页
:N(如:15跳到第 N 行

h/j/k/l看起来反直觉——四个方向键不好吗?方向键当然可以,但需要右手离开主键盘去够。hjkl的好处是你的手指保持在 touch-typing 位置,移动完光标立刻就能敲字。一天敲八小时代码的话,这个差异会被放大很多倍。

命令模式 — 编辑操作
操作按键记忆技巧
删一个字符x(光标处)/X(光标前)像剪刀
删 N 个字符Nx(如6x删 6 个)
删一行dddelete
删 N 行Ndd(如5dd
复制一行yyyank
复制 N 行Nyy(如6yy
复制一个词ywyank word
粘贴ppaste
替换一个字符r+ 新字符replace
修改一个词cwchange word
撤销uundo
重做Ctrl+rredo

删除和复制的底层原理是一样的——被dd删掉的内容和yy复制的内容,都进入了同一个缓冲区,之后用p粘贴。所以dd+p等于"剪切粘贴"。

底行模式 — 保存、退出、搜索
:w# 保存(write):q# 退出(quit):wq# 保存并退出:q!# 强制退出(不保存修改)

搜索功能:

/搜索词# 向下搜索?搜索词# 向上搜索n# 跳转到下一个匹配N# 跳转到上一个匹配

设置:

:set nu# 显示行号:set nonu# 隐藏行号

vim 的配置

vim 的系统级配置文件是/etc/vimrc,每个用户可以有自己的~/.vimrc。常用配置:

# 在 ~/.vimrc 中添加:syntax on# 语法高亮setnu# 默认显示行号setshiftwidth=4# 缩进宽度设为 4 个空格

vim 通过插件可以扩展出接近 IDE 的功能——TagList(函数列表导航)、WinManager(文件浏览器+标签窗口)等。但入门阶段不建议折腾插件,先把基本操作练熟。

💡 终端里输入vimtutor,会打开 vim 自带的互动式教程。30 分钟跟着敲一遍,比看任何教程都管用。


gcc:从源码到可执行程序

编译不是一个动作

写 C/C++ 的人,每天都在"编译"。但"编译"这个词其实掩盖了一个事实——从源码到可执行文件,中间经过了四个独立的步骤。

📖 参考:TLPI(《Linux/UNIX 系统编程手册》)第 3 章系统编程概念 + gcc 官方手册

编译的四步流水线

hello.c hello.i hello.s hello.o hello 源码 ──► 预处理后 ──► 汇编代码 ──► 目标文件 ──► 可执行文件 预处理 编译 汇编 链接 (gcc -E) (gcc -S) (gcc -c) (gcc 默认)

以一个最简单的 C 程序为例:

// hello.c#include<stdio.h>intmain(){printf("hello gcc!\n");return0;}

第一步:预处理(Preprocessing)

gcc-Ehello.c-ohello.i

-E告诉 gcc:只做预处理,到此为止。预处理阶段做三件事:

  1. 展开头文件——把#include <stdio.h>的内容原封不动地粘贴进来
  2. 替换宏定义——处理所有#define
  3. 删除注释

你可以用cat hello.i看一眼——一个几行的 hello.c 经过预处理后变成几百行甚至上千行,因为 stdio.h 里又包含了其他头文件。-o hello.i指定输出文件名,.i后缀表示这是预处理后的 C 语言文件。

第二步:编译(Compiling)

gcc-Shello.i-ohello.s

-S告诉 gcc:只编译到汇编,不往下走。这一步是真正的"翻译"——将 C 语言代码转换为该架构的汇编语言。生成的.s文件是纯文本的汇编代码,你可以直接打开看底层是什么指令,这是理解 C 语言"到底在干什么"的最佳途径。

第三步:汇编(Assembly)

gcc-chello.s-ohello.o

-c告诉 gcc:只汇编,不链接。汇编器把.s翻译成机器码,输出.o文件(目标文件)。.o文件已经是二进制了——距离可执行只差最后一步。

第四步:链接(Linking)

gcc hello.o-ohello

默认行为——把.o文件和它依赖的库文件链接成一个完整的可执行文件。这也是为什么你可以直接一步到位gcc hello.c -o hello——gcc 自动调用前面三步和这一步。

ldd命令可以看到一个可执行文件依赖哪些动态库:

ldd hello# linux-vdso.so.1 => ...# libc.so.6 => /lib64/libc.so.6 (0x00007f...)# /lib64/ld-linux-x86-64.so.2 (0x00007f...)

你用的printf函数——它的实现不在你的代码里,不在.o文件里,而是藏在libc.so.6(C 标准库的动态库)里。链接阶段,gcc 在/usr/lib/下找到libc.so.6,把printf的地址填进你的可执行文件。运行时,动态链接器负责解析这个地址。

所以"undefined reference to…"这个经典报错,本质是链接阶段找不到某个函数的具体实现。你包含了头文件(预处理通过),但没告诉链接器去哪找对应的库。

动态库 vs 静态库

链接分为两种方式:

动态链接静态链接
Linux 文件后缀.so(Shared Object).a(Archive)
Windows 文件后缀.dll.lib
运行时需要库文件吗需要(库独立存在)不需要(库内容已嵌入)
可执行文件大小
库更新替换 .so 即可需重新编译
gcc 选项默认,无需额外参数-static
# 静态链接编译(把库一起打包进可执行文件)gcc-statichello.o-ohello_static# 安装静态库(CentOS)yuminstall-yglibc-static libstdc++-static

gcc 常用选项速查

选项作用使用场景
-E只预处理排查宏展开问题
-S编译到汇编学习/优化汇编代码
-c编译+汇编,不链接多文件项目分步编译
-o <file>指定输出文件名总是用,别让 a.out 满天飞
-g加入调试信息配合 gdb 使用
-O0/-O1/-O2/-O3优化等级(0=无,3=激进)调试用 -O0,发布用 -O2
-Wall显示所有警告始终加上,警告不要忽略
-w关闭所有警告别用——警告是有原因的
-static静态链接需要独立部署的场景
-shared生成动态库自己写 .so 时使用

⚠️ 一个忠告:养成编译时加-Wall的习惯。C/C++ 编译器的很多警告是逻辑错误的信号,忽略警告等于在代码里埋雷。


本节要点

  • yum/apt 是 Linux 的"应用商店",一条命令搞定软件搜索、安装、升级、卸载。装包前先ping确认网络通畅,然后yum install [-y]安装
  • 软件源(Repository)决定了你能装到哪些软件,国内用户换阿里云/清华镜像会快很多。yum list | grep 关键词是搜包的常用姿势
  • vim 有三种模式,核心规则是:i进入插入模式开始打字,ESC回到命令模式,:进入底行模式保存退出。不确定在哪个模式就狂按 ESC
  • vim 的光标移动靠hjkl,不用方向键——手不离主键盘是效率的来源。dd删一行,yy复制一行,p粘贴,u撤销,这四个组合是每天用得最多的
  • 编译不是一步完成——从.c到可执行文件经过了预处理→编译→汇编→链接四步。gcc -E/-S/-c可以在每一步停下来,理解每一步在做什么比记命令更重要
  • 链接阶段才真正调用库函数——你的代码里的printf实现存在于libc.so.6中。动态链接省空间,静态链接可独立部署,各有适用场景
  • ldd看依赖,-Wall开警告,-g加调试,-O2做优化——这几个选项是 gcc 使用者早晚要记住的

http://www.cnnetsun.cn/news/3076566.html

相关文章:

  • MVT:手机取证工具,查你的手机有没有被监控
  • 百万年薪、创始股权,OpenCSG招聘最懂AI的应届生
  • TVA与具身智能深度融合的内在必然性(5)
  • 计算机Java毕设实战-基于 SpringBoot 的二次元游戏周边购物商城系统的设计与实现 基于 SpringBoot 的游戏周边商品买卖管理【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 【毕业设计】基于 SpringBoot 的动漫游戏周边线上交易服务系统的设计与实现 基于 SpringBoot 的游戏手办周边销售管理系统(源码+文档+远程调试,全bao定制等)
  • OpenCV 核心算法全套原理详解(滤波 / 阈值 / 直方图 / 边缘 / 轮廓 / 形态学 / 特征匹配 / 霍夫 / 光流)
  • 画出动态数学」:让数学可视化触手可及的Manim入门课2025-11-0722.让你的动画“活”过来:Manim 节奏控制指南 (Rate Functions)2025-11-2323.M
  • 信息学奥赛一本通提高篇刷题路线图:从贪心到博弈论,如何高效攻克这1670道题?
  • VSCode Remote SSH 中 Codex 连接超时的排查与解决记录
  • 新手买翡翠避坑指南:7个可落地的“硬核”核对标准
  • One API:用一套接口调遍所有大模型
  • 死磕Spring Boot Validation校验
  • 一句话讲透向量数据库:它把“语义相似“变成了可计算的东西
  • 快速替换文本中的上下标
  • 项目包含项目源码、项目文档、数据库脚本、软件工具等资料;
  • 2024年最全Minecraft矿石透视模组指南:Advanced XRay从零配置到高效挖矿
  • key 为出现的数字, value 为该数字出现的次数。遍历⾥⾯所有的数字,如果 hashmap 中存在,那么 value (次数)+1,如果 hashmap 中不存在,那么 value 置为1。
  • .算数操作符
  • AI编程Token成本将与开发者薪资持平,企业如何应对?
  • 报错解决org.springframework.web.method.annotation Failed to convert value of type ‘java.lang.String‘ to
  • ESP32 + 传感器:手把手教你做土壤监测终端
  • 微信小程序:农户手机上的「农场管家」
  • 自动灌溉系统:AI 什么时候浇水,比老农还准?
  • 批量处理远程共享目录中的特定类型文件(如 .hex、.csv 等)。
  • OpenGL学习笔记-05-着色器-数据类型/输入输出/uniform
  • 基于OpenCV与YOLO的实时目标检测系统搭建指南
  • Docker部署PostgreSQL
  • Playwright混沌工程实战:构建AI增强的韧性Web自动化测试体系
  • 【LeetCode】反转字符串
  • 京东开源实时视频视觉语言交互模型:全栈方案解析与落地实践