Linux 开发工具:yum、vim 与 gcc 实操指南
Linux 开发工具yum、vim 与 gcc 实操指南会写代码只是起点。在 Linux 上把代码编译成能跑的程序——这中间隔着一套你迟早要掌握的工具链。本文讲三个最核心的开发工具包管理器 yum、编辑器 vim、编译器 gcc。每个都从这是什么讲到怎么用不讲虚的。写在前面Linux 怎么装软件Windows 上的习惯是打开浏览器 → 搜索软件名 → 下载 .exe → 双击安装。每一步都是手动操作的。Linux 不这样。Linux 用包管理器——一个命令行工具统一负责软件的搜索、安装、升级和卸载。你不需要知道软件从哪下载包管理器替你处理一切从哪个服务器拉取、依赖哪些其他包、安装到哪个目录。这就像手机上的应用商店——只不过 Linux 的应用商店是命令行里敲出来的而且比任何一个 App Store 都早出现了十几年。 参考《鸟哥的 Linux 私房菜》软件管理篇 linux-command 网站yumLinux 软件包管理器什么是 yumyumYellow dog Updater, Modified是 Fedora、RedHat、CentOS 等发行版使用的软件包管理工具。Ubuntu 系用aptAdvanced Package Tool原理完全一样只是命令名不同。发行版包管理器软件包格式CentOS / RHEL / Fedorayum新版用dnf.rpmUbuntu / 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/EPELExtra 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_64中x86_64表示 64 位架构i686是 32 位el7表示适配 CentOS 7 / RHEL 7base表示该包来自 base 软件源。安装与卸载# 安装 # CentOSsudoyuminstall-ylrzsz# Ubuntusudoaptinstall-ylrzsz# 卸载 # CentOSsudoyum remove-ylrzsz# Ubuntusudoaptremove-ylrzsz几个需要注意的点-y表示对所有确认提示自动回答 “yes”——省去安装过程中手动敲y的麻烦看到Complete!就说明安装成功安装软件是系统级操作需要sudo提权或直接用 rootyum/apt在同一时刻只能运行一个实例——如果提示 “Another app is currently holding the yum lock”等上一个装完再跑⚠️ 执行yum install或apt 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) │ └──────────┘核心规则就两条从任何地方按ESC都能回到命令模式从命令模式按:进入底行模式如果你不知道自己在哪个模式——按ESC。如果你不知道该按什么——按ESC。ESC 是 vim 里的安全词。基本操作生存手册vimtest.c# 打开 test.c文件不存在则新建插入模式 — 三种进入方式按键效果i在光标前插入a在光标后插入appendo在下一行新起一行插入刚学的时候用i就够了。等熟练了o是换行利器a在行尾补分号的时候很顺手。命令模式 — 光标移动vim 的精髓在于手不离开主键盘区域就能移动光标。按键移动目标h/j/k/l← / ↓ / ↑ / →0/$行首 / 行尾gg/G文件开头 / 文件末尾w/b下一词开头 / 上一词开头e当前词结尾Ctrlf/Ctrlb向下翻页 / 向上翻页Ctrlu/Ctrld向上翻半页 / 向下翻半页: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重做Ctrlrredo删除和复制的底层原理是一样的——被dd删掉的内容和yy复制的内容都进入了同一个缓冲区之后用p粘贴。所以ddp等于剪切粘贴。底行模式 — 保存、退出、搜索:w# 保存write:q# 退出quit:wq# 保存并退出:q!# 强制退出不保存修改搜索功能/搜索词# 向下搜索?搜索词# 向上搜索n# 跳转到下一个匹配N# 跳转到上一个匹配设置:set nu# 显示行号:set nonu# 隐藏行号vim 的配置vim 的系统级配置文件是/etc/vimrc每个用户可以有自己的~/.vimrc。常用配置# 在 ~/.vimrc 中添加syntax on# 语法高亮setnu# 默认显示行号setshiftwidth4# 缩进宽度设为 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#includestdio.hintmain(){printf(hello gcc!\n);return0;}第一步预处理Preprocessinggcc-Ehello.c-ohello.i-E告诉 gcc只做预处理到此为止。预处理阶段做三件事展开头文件——把#include stdio.h的内容原封不动地粘贴进来替换宏定义——处理所有#define删除注释你可以用cat hello.i看一眼——一个几行的 hello.c 经过预处理后变成几百行甚至上千行因为 stdio.h 里又包含了其他头文件。-o hello.i指定输出文件名.i后缀表示这是预处理后的 C 语言文件。第二步编译Compilinggcc-Shello.i-ohello.s-S告诉 gcc只编译到汇编不往下走。这一步是真正的翻译——将 C 语言代码转换为该架构的汇编语言。生成的.s文件是纯文本的汇编代码你可以直接打开看底层是什么指令这是理解 C 语言到底在干什么的最佳途径。第三步汇编Assemblygcc-chello.s-ohello.o-c告诉 gcc只汇编不链接。汇编器把.s翻译成机器码输出.o文件目标文件。.o文件已经是二进制了——距离可执行只差最后一步。第四步链接Linkinggcc 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.6C 标准库的动态库里。链接阶段gcc 在/usr/lib/下找到libc.so.6把printf的地址填进你的可执行文件。运行时动态链接器负责解析这个地址。所以undefined reference to…这个经典报错本质是链接阶段找不到某个函数的具体实现。你包含了头文件预处理通过但没告诉链接器去哪找对应的库。动态库 vs 静态库链接分为两种方式动态链接静态链接Linux 文件后缀.soShared Object.aArchiveWindows 文件后缀.dll.lib运行时需要库文件吗需要库独立存在不需要库内容已嵌入可执行文件大小小大库更新替换 .so 即可需重新编译gcc 选项默认无需额外参数-static# 静态链接编译把库一起打包进可执行文件gcc-statichello.o-ohello_static# 安装静态库CentOSyuminstall-yglibc-static libstdc-staticgcc 常用选项速查选项作用使用场景-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回到命令模式:进入底行模式保存退出。不确定在哪个模式就狂按 ESCvim 的光标移动靠hjkl不用方向键——手不离主键盘是效率的来源。dd删一行yy复制一行p粘贴u撤销这四个组合是每天用得最多的编译不是一步完成——从.c到可执行文件经过了预处理→编译→汇编→链接四步。gcc -E/-S/-c可以在每一步停下来理解每一步在做什么比记命令更重要链接阶段才真正调用库函数——你的代码里的printf实现存在于libc.so.6中。动态链接省空间静态链接可独立部署各有适用场景ldd看依赖-Wall开警告-g加调试-O2做优化——这几个选项是 gcc 使用者早晚要记住的