对于刚踏入 Linux 后端开发领域的同学来说,黑框框里的命令行世界往往让人望而却步。但事实上,Linux 开发的核心基本功,都围绕着一套标准化的基础开发工具展开。本文将系统梳理 Linux 环境下 7 个核心开发工具的使用方法与底层逻辑,从软件安装、代码编写、编译构建,到版本控制、程序调试,配合实战案例带你一站式吃透,看完即可上手实操。
一、软件包管理器:yum 与 apt,Linux 软件安装的核心
在 Linux 系统中,软件安装不再是 Windows 下的 “下一步” 式操作,而是通过包管理器完成一键化的下载、安装、依赖解决与卸载。我们最常用的两大包管理器,分别是CentOS/RedHat/Fedora系列的yum,以及Ubuntu/Debian系列的apt,二者的关系就如同不同手机品牌的应用商店,核心能力一致,仅命令语法略有差异。
1. 核心概念
Linux 下的软件包,是开发者提前编译好的程序安装包,包管理器会自动处理软件之间的依赖关系(比如安装 A 软件必须先安装 B 库),无需我们手动下载源码编译,极大降低了软件安装门槛。
国内使用时,建议先替换为国内镜像源,解决官方源下载慢、连接超时的问题,常用的优质镜像源包括阿里云、清华大学、中国科学技术大学开源镜像站等,文末附镜像源替换完整步骤。
2. 核心常用命令
| 操作场景 | CentOS (yum) 命令 | Ubuntu (apt) 命令 |
|---|---|---|
| 查找软件包 | yum list | grep 软件名 | apt search 软件名 |
| 安装软件 | sudo yum install -y 软件名 | sudo apt install -y 软件名 |
| 卸载软件 | sudo yum remove -y 软件名 | sudo apt remove -y 软件名 |
| 安装扩展源 | sudo yum install -y epel-release | 按需添加对应 ppa 源 |
注意:所有安装 / 卸载操作都需要
sudo提权或 root 账户,且必须保证服务器网络畅通,可通过ping www.baidu.com验证网络状态。
二、Vim 编辑器:终端里的代码编辑神器
Vim 是 vi 编辑器的升级版本,是 Linux 终端下最核心的代码编辑工具,支持语法高亮、可视化操作、插件扩展,是后端开发者必须掌握的技能。很多新手刚接触 Vim 时,连 “如何输入、如何退出” 都搞不明白,核心原因是没有搞懂 Vim 的模式设计。
1. Vim 的三大核心模式
Vim 的操作围绕三种基础模式展开,所有操作都基于模式切换完成:
- 命令模式(Normal mode):Vim 打开文件后的默认模式,用于光标移动、文本删除 / 复制 / 替换、模式切换,无法直接输入文本;
- 插入模式(Insert mode):唯一可进行文本输入的模式,编辑代码的核心场景;
- 底行模式(Last line mode):用于文件保存、退出、查找替换、显示行号等全局操作。
模式切换核心操作
- 命令模式 → 插入模式:按
i(光标当前位置输入)、a(光标下一个位置输入)、o(新起一行行首输入); - 插入模式 → 命令模式:按
ESC键; - 命令模式 → 底行模式:按
shift+:(即输入冒号:)。
2. 高频必记命令
命令模式核心操作
| 操作类型 | 高频命令 | 功能说明 |
|---|---|---|
| 光标移动 | h/j/k/l | 光标左 / 下 / 上 / 右移动一格 |
| gg / G | 跳转到文件开头 / 文件末尾 | |
| ^ / $ | 跳转到当前行行首 / 行尾 | |
| w / b | 跳转到下一个单词开头 / 上一个单词开头 | |
| 文本删除 | x / dd | 删除光标所在字符 / 删除光标所在整行 |
| #dd | 从光标所在行开始,向下删除 #行(如 6dd 删除 6 行) | |
| 复制粘贴 | yy / #yy | 复制光标所在行 / 复制向下 #行 |
| p | 将复制的内容粘贴到光标所在位置 | |
| 撤销恢复 | u / ctrl+r | 撤销上一步操作 / 恢复撤销的操作 |
| 替换 | r / R | 替换光标所在单个字符 / 进入替换模式,直到按 ESC 退出 |
底行模式核心操作
| 命令 | 功能说明 |
|---|---|
| :w | 保存当前文件 |
| :wq | 保存并退出 Vim |
| :q! | 不保存强制退出 Vim |
| set nu | 显示文件行号 |
| / 关键字 / ? 关键字 | 向下 / 向上查找指定关键字,按 n 跳转到下一个匹配项 |
| : 数字 | 跳转到指定行号(如:15 跳转到第 15 行) |
3. 极简 Vim 配置
Vim 支持个性化配置,系统全局配置文件为/etc/vimrc,用户私有配置文件为用户根目录下的~/.vimrc,常用基础配置如下:
" 开启语法高亮 syntax on " 显示行号 set nu " 设置缩进空格数为4 set shiftwidth=4 " 设置Tab键对应的空格数 set tabstop=4三、gcc/g++ 编译器:C/C++ 程序的编译全流程
gcc 是 GNU 推出的 C 语言编译器,g++ 则对应 C++ 语言,二者是 Linux 下编译 C/C++ 程序的核心工具。要掌握编译器的使用,核心是理解 C/C++ 程序从源码到可执行文件的四大编译阶段。
1. 编译的四大阶段与对应选项
一个.c/.cpp源码文件,要经过预处理→编译→汇编→链接四个步骤,才能生成系统可执行的二进制文件,gcc 的选项精准对应每个阶段:
| 编译阶段 | 核心作用 | gcc 命令 | 生成文件 |
|---|---|---|---|
| 预处理 | 宏替换、去注释、头文件展开、条件编译 | gcc -E hello.c -o hello.i | .i 预处理后的 C 源码文件 |
| 编译 | 检查代码语法规范性,将 C 代码翻译成汇编语言 | gcc -S hello.i -o hello.s | .s 汇编代码文件 |
| 汇编 | 将汇编代码翻译成机器可识别的二进制指令 | gcc -c hello.s -o hello.o | .o 二进制目标文件 |
| 链接 | 将多个目标文件、库文件链接在一起,生成可执行文件 | gcc hello.o -o hello | 无后缀的可执行文件 |
核心速记:
-E预处理、-S编译、-c汇编、-o指定输出文件,日常开发中可直接执行gcc hello.c -o hello一键完成全流程编译。
2. 动态链接与静态链接
链接阶段的核心,是处理程序对库函数的调用,分为动态链接和静态链接两种模式,也是面试高频考点。
静态链接:编译链接时,直接把库文件的代码全部拷贝到可执行文件中。
- 优点:程序运行时不依赖外部库,运行速度快;
- 缺点:生成的可执行文件体积大,浪费磁盘和内存空间,库更新后必须重新编译程序。
- 静态库后缀:Linux 下为
.a,Windows 下为.lib。
动态链接(gcc 默认模式):编译时不拷贝库代码,只记录库的引用关系,程序运行时由系统动态加载库文件到内存。
- 优点:多个程序可共享同一个库文件,节省系统资源,库更新后无需重新编译程序;
- 缺点:程序运行必须依赖对应的动态库,缺失则无法运行。
- 动态库后缀:Linux 下为
.so,Windows 下为.dll。
可通过ldd 可执行文件名命令,查看程序依赖的动态库列表;通过-static选项强制 gcc 使用静态链接生成程序。
3. 其他高频选项
-g:生成 debug 调试信息,是后续 gdb 调试的必备选项;-O0/-O1/-O2/-O3:编译器优化级别,O0 为无优化,O3 为最高优化级别;-Wall:生成所有编译警告信息,帮助提前发现代码问题;-w:关闭所有编译警告(不推荐使用)。
四、Makefile:自动化构建项目的利器
会不会写 Makefile,从侧面反映了开发者是否具备大型工程的开发能力。当一个项目存在数十个、上百个源码文件时,手动执行 gcc 命令编译不仅繁琐,还会浪费大量时间,而 Makefile 就是解决这个问题的核心工具。
简单来说,make 是一个命令工具,Makefile 是一个描述编译规则的文件,二者搭配实现项目的 “一键自动化编译”,一次编写,终身受益。
1. Makefile 的核心概念
Makefile 的核心由两部分组成:依赖关系+依赖方法。
- 依赖关系:说明要生成的目标文件,依赖哪些源文件;
- 依赖方法:生成目标文件,需要执行的具体编译命令。
同时还有一个核心关键字.PHONY,用于修饰伪目标,伪目标的特性是 “总是被执行”,不受文件修改时间的影响,最常用的就是clean清理目标。
2. 最简 Makefile 示例
以hello.c源码为例,最简 Makefile 写法如下:
# 目标文件:依赖文件 hello:hello.c # 依赖方法(注意:行首必须是Tab键,不能是空格) gcc -o hello hello.c # 伪目标clean,用于清理编译产物 .PHONY:clean clean: rm -f hello编写完成后,在终端执行make即可一键编译程序,执行make clean即可一键清理生成的可执行文件。
3. 进阶通用 Makefile 写法
针对多文件项目,我们可以通过变量、自动变量、通配符,写出通用的 Makefile,无需每次新增文件都修改规则:
# 定义变量 BIN=myproc # 最终生成的可执行文件名 CC=gcc # 编译器 SRC=$(wildcard *.c) # 自动获取当前目录下所有.c文件 OBJ=$(SRC:.c=.o) # 将所有.c文件名替换为.o文件名 RM=rm -f # 清理命令 # 终极目标:生成可执行文件 $(BIN):$(OBJ) $(CC) -o $@ $^ # $@代表目标文件,$^代表所有依赖文件 # 模式规则:将所有.c文件编译为对应的.o文件 %.o:%.c $(CC) -c $< # $<代表每一个待编译的.c文件 # 伪目标 .PHONY:clean clean: $(RM) $(OBJ) $(BIN) # 调试用:打印变量值 .PHONY:test test: @echo $(SRC) @echo $(OBJ)五、实战:手写 Linux 进度条程序
学完前面的 Vim、gcc、Makefile,我们通过一个实战案例把知识点串联起来,手写一个 Linux 终端下的进度条程序,这也是 Linux 入门的经典练手项目。
1. 前置核心知识点
(1)回车与换行的区别
- 换行
\n:光标跳到下一行的当前列; - 回车
\r:光标回到当前行的行首。
进度条的核心原理,就是通过\r让光标每次回到行首,覆盖上一次的输出内容,实现 “进度刷新” 的效果。
(2)行缓冲区机制
printf 输出的内容,不会立即刷新到屏幕上,而是先存放在行缓冲区中。只有遇到\n、程序结束、手动调用fflush(stdout)时,才会刷新缓冲区。这就是为什么不加\n的 printf,在 sleep 之后才会显示的原因,必须通过fflush(stdout)手动刷新缓冲区。
2. 进度条完整代码实现
我们采用多文件工程的方式编写,分为头文件、功能实现文件、主函数文件,配合 Makefile 编译。
(1)process.h 头文件
#pragma once #include <stdio.h> // 基础版进度条 void process_v1(); // 通用版进度条,支持传入总大小和当前进度 void FlushProcess(double total, double current);(2)process.c 功能实现
#include "process.h" #include <string.h> #include <unistd.h> #define NUM 101 #define STYLE '=' // 基础版进度条 void process_v1() { char buffer[NUM]; memset(buffer, 0, sizeof(buffer)); // 旋转动画,模拟加载效果 const char *lable="|/-\\"; int len = strlen(lable); int cnt = 0; while(cnt <= 100) { // 核心:\r回到行首,覆盖输出 printf("[%-100s][%d%%][%c]\r", buffer, cnt, lable[cnt%len]); fflush(stdout); // 手动刷新缓冲区 buffer[cnt] = STYLE; cnt++; usleep(50000); // 50ms延时,控制进度速度 } printf("\n"); // 进度完成后换行 } // 通用版进度条 void FlushProcess(double total, double current) { char buffer[NUM]; memset(buffer, 0, sizeof(buffer)); const char *lable="|/-\\"; int len = strlen(lable); static int cnt = 0; // 计算进度百分比 int num = (int)(current*100/total); for(int i = 0; i < num; i++) { buffer[i] = STYLE; } double rate = current/total; cnt %= len; printf("[%-100s][%.1f%%][%c]\r", buffer, rate*100, lable[cnt]); cnt++; fflush(stdout); }(3)main.c 主函数
#include "process.h" #include <unistd.h> // 模拟文件下载场景 double total = 1024.0; // 总大小1024MB double speed = 1.0; // 下载速度1MB/次 void DownLoad() { double current = 0; while(current <= total) { FlushProcess(total, current); usleep(3000); // 模拟下载耗时 current += speed; } printf("\ndownload %.2lfMB Done\n", current); } int main() { // 调用基础版进度条 process_v1(); // 调用8次下载模拟,测试通用进度条 for(int i=0; i<8; i++) { DownLoad(); } return 0; }(4)Makefile
SRC=$(wildcard *.c) OBJ=$(SRC:.c=.o) BIN=processbar $(BIN):$(OBJ) gcc -o $@ $^ %.o:%.c gcc -c $< .PHONY:clean clean: rm -f $(OBJ) $(BIN)3. 编译运行
- 通过 Vim 编写好上述 4 个文件;
- 执行
make命令一键编译,生成processbar可执行文件; - 执行
./processbar,即可看到终端中的进度条效果。
六、Git:代码版本控制与 GitHub 托管
开发过程中,我们总会遇到 “文件改坏了想回退、多个版本分不清改了什么、多人协作代码冲突” 的问题,而 Git 就是解决这些问题的分布式版本控制系统,也是目前业界最主流的代码管理工具。
1. 核心基础操作
(1)安装与基础配置
# CentOS安装Git sudo yum install git -y # 验证安装 git --version # 配置用户信息(必须配置,否则无法提交代码) git config --global user.name "你的用户名" git config --global user.email "你的邮箱地址"(2)GitHub 仓库创建与克隆
- 登录 GitHub,点击
New repository创建新的仓库,填写仓库名,选择公开 / 私有,点击创建; - 复制仓库的 HTTPS 链接,在 Linux 终端执行克隆命令,将远程仓库拉取到本地:
git clone 你的仓库HTTPS链接(3)Git 核心 “三板斧”
这是 Git 最核心的三个操作,日常开发 90% 的场景都围绕这三个命令展开:
- git add:将需要管理的文件 / 改动告知 Git,添加到暂存区
# 添加单个文件 git add 文件名 # 添加当前目录所有改动文件 git add . - git commit:将改动提交到本地 Git 仓库,必须填写提交日志,描述本次改动内容
git commit -m "本次提交的描述,比如:实现进度条程序功能" - git push:将本地仓库的改动同步到远程 GitHub 仓库
git push
(4)其他常用命令
git status:查看当前仓库的文件改动状态;git log:查看提交历史记录;git pull:拉取远程仓库的最新改动到本地。
七、gdb 调试器:定位程序问题的手术刀
程序开发中,bug 是不可避免的,而 gdb 就是 Linux 下调试 C/C++ 程序的核心工具,能够帮助我们逐行执行代码、查看变量值、定位崩溃原因,是解决程序问题的 “手术刀”。
1. 调试前置条件
Linux 下 gcc/g++ 默认生成的是 release 模式的程序,不包含调试信息,无法被 gdb 调试。必须在编译时添加-g选项,生成 debug 模式的可执行文件:
# 必须加-g选项,生成可调试的程序 gcc mycmd.c -o mycmd -g # 启动gdb调试 gdb mycmd2. 高频调试命令
| 命令缩写 | 完整命令 | 功能说明 |
|---|---|---|
| l / list | list 行号 / 函数名 | 显示源代码,默认每次显示 10 行 |
| r / run | run | 从头开始运行程序,遇到断点会暂停 |
| n / next | next | 单步执行,不进入函数内部(逐过程) |
| s / step | step | 单步执行,进入函数内部(逐语句) |
| b / break | break 行号 / 函数名 | 在指定位置设置断点 |
| info b | info break | 查看所有断点的信息 |
| d / delete | delete 断点编号 | 删除指定断点 |
| c / continue | continue | 从当前位置继续执行,直到下一个断点 |
| p / print | print 变量名 / 表达式 | 打印变量 / 表达式的值 |
| set var | set var 变量 = 值 | 运行时修改变量的值 |
| finish | finish | 执行到当前函数返回后暂停 |
| bt / backtrace | backtrace | 查看函数调用栈,定位程序崩溃位置 |
| display | display 变量名 | 跟踪显示变量,每次暂停都自动打印 |
| q / quit | quit | 退出 gdb 调试器 |
3. 高级调试技巧
- watch 监视点:监视一个变量 / 表达式的值,一旦值发生变化,程序立即暂停并通知,完美定位变量被意外修改的问题
# 监视result变量,值变化时暂停 watch result - 条件断点:只有满足指定条件时,断点才会触发,适合循环中定位特定场景的问题
# 新增条件断点:在第9行,当i等于30时触发 b 9 if i == 30 # 给已有的2号断点添加条件i==30 condition 2 i==30 - set var 修改变量:运行时动态修改变量的值,无需修改代码重新编译,快速验证问题根因
# 将flag变量的值修改为1 set var flag=1
八、写在最后
本文梳理的 yum/apt、Vim、gcc/g++、Makefile、Git、gdb,以及配套的进度条实战,是 Linux 后端开发最核心的基本功。这些工具的掌握,从来不是靠死记硬背命令,而是靠多敲、多练、多用,在实际开发中反复实操,自然就能形成肌肉记忆。
对于新手来说,建议按照本文的顺序,逐个工具实操,亲手把进度条程序写出来、跑起来,再尝试用 Git 把代码上传到 GitHub,用 gdb 调试一下程序中的小问题,走完这一整套流程,你对 Linux 开发的理解会有质的飞跃。
附录:镜像源替换完整步骤
CentOS 7 yum 源替换(阿里云 / 清华源)
# 1. 备份原有源 sudo mkdir /etc/yum.repos.d/backup sudo mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup/ # 2. 下载新的源配置文件(阿里云源) sudo curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo # 3. 清理旧缓存,生成新缓存 sudo yum clean all sudo yum makecache # 4. 验证源是否生效 sudo yum repolistUbuntu 20.04 apt 源替换(阿里云 / 清华源)
# 1. 备份原有源 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak # 2. 下载新的源配置文件(清华源) sudo wget -O /etc/apt/sources.list https://mirrors.tuna.tsinghua.edu.cn/ubuntu/sources.list # 3. 更新缓存 sudo apt update # 4. 验证源是否生效 sudo apt policy