跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Shell / Bash

Linux 基础开发工具

Linux 基础开发工具,涵盖包管理器 yum、编辑器 vim、编译器 gcc/g++、构建工具 make/Makefile、版本控制 git 以及调试器 gdb/cgdb。内容包括软件安装与依赖处理、vim 的各种模式与快捷键、C/C++ 编译流程详解、Makefile 编写规范、Git 基本操作以及 GDB 调试技巧。文章基于 CentOS 7.9 环境,适合初学者搭建 Linux 开发环境。

KernelLab发布于 2026/3/26更新于 2026/7/2041 浏览
Linux 基础开发工具

1、包管理器 yum

CentOS 一般使用 yum 来下载软件,Ubuntu 则使用 apt。

1.1 软件包的依赖

yum 会解决包的依赖问题(即一起帮你下载)。

1.2 镜像源

Linux 通过内置链接下载软件,由于网络限制,内地社区会拷贝资源并使用自己的链接。

镜像站官网支持发行版
清华大学https://mirrors.tuna.tsinghua.edu.cnCentOS, Ubuntu, Debian, Arch, EPEL
阿里云https://mirrors.aliyun.comCentOS, Ubuntu, Docker
华为云https://mirrors.huaweicloud.comCentOS, Ubuntu
网易http://mirrors.163.comUbuntu, Debian
中科大https://mirrors.ustc.edu.cnArch Linux, Docker

可以通过更改 yum 的配置文件,更改下载链接。

文章配图 文章配图

1.3 查找/安装/卸载软件

yum list  # 有哪些安装包
yum list | grep 安装包  # 查找指定的安装包
sudo yum install -y 安装包  # 下载指定的安装包 (-y 确认下载)
sudo yum remove -y 软件  # 删除指定的软件 (-y 确认删除)

注意: 安装和删除需要 root 权限。安装到系统目录(不是其他用户的家目录),任何人都能使用。

2、编辑器 vim

注意: Esc 键可能有点慢。

2.1 命令模式 (默认)

2.1.1 撤销与反撤销
  • u:撤销。
  • Ctrl+r:撤销 u 操作,反撤销。

注意: 一旦退出,就不能撤销了。

2.1.2 光标定位

可以先通过底行模式显示行号。

  • gg:光标定位到第一行第一个非空字符。n+gg:光标定位到第 n 行第一个非空字符。
  • G (shift+g):光标定位到最后一行第一个非空字符。n+G:光标定位到第 n 行第一个非空字符。
  • ^ (shift+6):光标定位到光标所在行的第一个非空白字符。
  • $ (shift+4):光标定位到光标所在行的最后一个字符。
  • h (左) j (下) k (上) l (右):键盘的上下左右键在一些场景下不可用。n+hjkl:移动 n 个字符。
  • b:移动到上一个单词的首字母。n+b:移动到上 n 个单词的首字母。
  • w:移动到下一个单词的首字母。n+w:移动到下 n 个单词的首字母。

搜索:

  • # (shift+3):向上搜索当前光标下的单词,n 上一个 (正向搜索),N 下一个 (反向搜索)。
  • / (shift+8):向下搜索当前光标下的单词,n 下一个 (正向搜索),N 上一个 (反向搜索)。

可以通过底行模式删除高亮。

2.1.3 复制 && 剪切 (删除) && 粘贴
  • yy:复制当前行,n+yy:复制从当前行开始的 n 行。p:在下一行新建一行,粘贴。
  • dd:剪切 (删除) 当前行,n+dd:剪切 (删除) 从当前行开始的 n 行。
  • x:剪切 (删除) 光标位置的字符,n+x:剪切 (删除) 从光标开始的 n 个字符。
  • X (shift+x):剪切 (删除) 光标前面的字符,n+X:剪切 (删除) 光标前面的 n 个字符。

对于 yy,dd:

  • p:粘贴到光标下面的新建行;P (shift+p):粘贴到光标上面的新建行。
  • 当然,也可以 n+p,n+P,粘贴 n 次。

对于 x,X:

  • p:粘贴到光标前面;P (shift+p):粘贴到光标后面。
  • 当然,也可以 n+p,n+P,粘贴 n 次。
2.1.4 替换
  • r:替换光标所在的字符,n+r:替换光标及后面的 n 个字符。
  • R (shift+r):命令模式进入替换模式,直接替换。
  • ~ (shift+`):大小写切换。n+~:将光标及后面的 n 个字符切换大小写。
2.1.5 插入模式

插入模式可以插入字符。

  • i:命令模式进入插入模式,光标不动。
  • a:命令模式进入插入模式,光标后移一位。
  • o:命令模式进入插入模式,向下新建一行,光标在新建行的行首。
2.1.6 V-Block 模式

Ctrl+v:进入 V-Block 模式。

常用于批量注释:

  1. Ctrl+v (进入 V-Block 模式)
  2. hjkl (选择区域,也可以 n+hjkl)
  3. shift+i,进入插入模式,输入 //
  4. Esc,进入命令模式,就一起注释了。

批量删除注释:

  1. Ctrl+v (进入 V-Block 模式)
  2. hjkl (选择区域,也可以 n+hjkl)
  3. 直接 x (删除光标位置的字符),自动切换到命令模式。

2.2 底行模式

  • : (shift+;):英文的冒号,命令模式进入底行模式。
  • set nu:显示行号,set nonu:取消行号。
  • %s/src/dst/:批量替换,把所有的 src 换成 dst。
  • vs new_src:再打开一个 new_src 源文件,Ctrl+ww:光标切屏。
  • w (保存 vim),q (退出 vim),q! (强制退出 vim),wq (保存并退出 vim),wq! (强制保存并退出 vim)。

2.3 命令行使用 vim 的技巧

在命令行:

  • vim 不存在的文件:只要 w (保存),文件会自动生成。
  • vim 文件 +n:+ 号要写,打开文件,光标直接跳到第 n 行,方便快速定位编译报错的位置。
  • !v:执行最近 v 开头的命令。

2.4 vim 的配置

vim 没有自动缩进,没有自动补齐等等,用起来不太方便,需要一些配置。

这里推荐一个自动化配置 (自己配置比较麻烦):

curl -sLf https://gitee.com/HGtz2222/VimForCpp/raw/master/install.sh -o ./install.sh && bash ./install.sh

注意:

  • 在普通用户下一键式安装 (root 用户容易出问题)。就改变了普通用户的 vim 配置。
  • 只支持 CentOS 7。
  • 失败就多试几次。安装成功后,可能需要重启一下。
  • 默认是两个空格的缩进。

如果要改成四个空格的缩进,vim 家目录下的 vimrc,都改成 4。

3、编译器 gcc/g++

gcc/g++ 默认情况下会执行完整的编译流程,包括预处理、编译、汇编、链接这四个步骤,并最终生成可执行文件(或库)。

gcc 只能编译.c 文件,g++ 既能编译.c 文件也能编译.cpp 文件,其他基本相同,以下以 gcc 为例。

// 将 code.c 编译为 code 的两种格式
gcc code.c -o code  // 常用
gcc -o code code.c

3.1 预处理

  • 修改代码,通过头文件展开,宏替换,条件编译 (进行功能裁剪),去注释等。
  • -E 选项仅进行预处理。
  • 生成 .i 文件。
gcc -E code.c -o code.i

3.2 编译

  • 将预处理后的代码转换为汇编代码。
  • -S 选项仅生成汇编代码。
  • 生成 .s 文件。
gcc -S code.i -o code.s

3.3 汇编

  • 将汇编代码转换为机器码 (CPU 能直接执行的二进制指令)。
  • -c 选项仅生成目标文件。
  • 生成 .o 目标文件。
  • 每个源文件都编译成对应的.o 文件,能以较小的成本将代码程序编译。
gcc -c code.s -o code.o
gcc -c code.c  // 默认生成,同名的.o 文件

3.4 链接

  • 将多个 .o 目标文件和库文件 (.so/.a) 合并,生成最终的可执行文件或动态库。
  • 直接运行 gcc 或 g++ 默认会执行链接:
gcc code.o -o code
gcc -o code code.o  // 或者

Linux 中,是 lib+ 库名 + 后缀。

注意: 自己写的可执行程序,需要指定目录,才能执行。./ (当前目录)

3.4.1 动态库 (动态链接)
  • Linux,.so 后缀,Windows,.dll 后缀。
  • 动态库,又称共享库,被多程序共享。可执行程序的动态库不能缺失。
  • 执行目标方法,需跳转到库中。文件体积小。

ldd 可执行文件或动态库,可以查看需要的动态库。

3.4.2 静态库 (静态链接)
  • Linux,.a 后缀,Windows,.lib 后缀。
  • 执行目标方法,会将方法拷贝过来,再执行。文件体积大。可执行程序的对静态库的依赖度小。
3.4.4 库的本质

库可以理解为,.o 文件和.h 文件的集合。

一般把文件编译到.o 文件,再与库文件链接,形成可执行程序。

两个编译过程:
  1. 文件包含 1.h(有方法的声明),可以过编译这关,然后给 1.o(有方法实现),链接,没问题。
  2. C++ 模板不支持声明和定义分离到.h.c,因为文件虽然包含了.h,预处理展开头文件,编译时实例化了声明,可以过编译这关,但是.o 的方法没有实例化,所以链接时找不到方法的实现,所以有问题。

4、自动化构建工具 make/Makefile

4.1 make

make 是命令,可以指定目标,默认执行当前目录下 Makefile 中的第一个目标。

4.2 Makefile

Makefile 或 makefile,是文件 (包含编译的指令 或 各种自动化任务)。

Makefile 主要由以下三部分组成:

目标 (target): 依赖 (prerequisites) [TAB] 命令 (recipe)
1. 目标 (Target)
  • 通常是最终要生成的文件名(如 main.o)
  • 也可以是一个操作名称(如 clean)
  • 一个 Makefile 可以有多个目标
2. 依赖 (Prerequisites)
  • 构建目标所需的文件或其他目标
  • 可以是多个文件,用空格分隔
  • 如果依赖文件比目标文件新 (目标文件应该是更新的,因为最后生成的是目标文件,当依赖文件被修改了,此时依赖文件更新,会重新编译),make 会重新构建目标。(即当改了依赖文件,make 会重新构建目标)

注意: 通过文件的 Modify(最近文件内容修改时间) 判断,是否更新。 默认没改依赖文件,就不会重新构建目标。这里会引出一个问题。如果

clean: rm -f *.o main

当执行 make clean 时,rm -f *.o main 会正常执行。

但是如果当前目录下恰好存在一个名为 clean 的文件或目录,make 会认为 clean 目标已经是最新的(因为 clean 没有依赖项),从而拒绝执行 rm 命令。

加上 .PHONY 的作用

.PHONY: clean
clean: rm -f *.o main
  • 明确声明 clean 是伪目标(不是实际文件),强制 make 执行其命令,无论是否存在同名文件。
  • 避免意外行为:即使有人创建了 clean 文件,make clean 也能正确执行清理操作。
  • 提高可读性:明确告知开发者这是一个用于执行操作(而非生成文件)的目标。
3. 命令 (Recipe)
  • 必须以 Tab 开头(不能用空格代替)
  • 是要执行的 shell 命令
  • 可以有多条命令,每条占一行

4.3 Makefile 的一些细节

  1. 直接 make,默认执行第一个目标 test(因为依赖,所以不断执行),test 依赖 test.o,test.o 依赖 test.c,所以先生成 test.o,再生成 test。
  2. 执行的命令会回显,前面加@就不会回显了。
  3. Makefile 中确实使用了类似宏定义(变量)和类似解引用(变量展开)的机制。这种设计使得 Makefile 更加灵活和可维护。如:
# 变量定义
CC := gcc
TARGET := myprogram
SRCS := main.c test.c  # 空格隔开
# SRC := $(wildcard *.c)  # 当前目录下所有的.c 文件
OBJS := $(SRCS:.c=.o)  # 将 .c 替换为 .o

# 默认目标
$(TARGET): $(OBJS)
	$(CC) -o $@ $^

# $@,是目标,$^,是所有的依赖

# 模式规则:编译 .c 到 .o,.c 为当前目录下的.c,只编译需要的.o
%.o: %.c
	$(CC) -c $<

# 默认生成同名的.o 文件
# $<,是单个依赖,将.c 分别编译为.o

# 伪目标
.PHONY: clean
clean: rm -f $(OBJS) $(TARGET)

5、版本控制器 git

5.1 安装和 clone

安装 git:

sudo yum install -y git

在 gitee 创建远端仓库,点击克隆/下载,复制 https 的地址,将远端仓库克隆到本地。

git clone https地址

5.2 add&&commit&&push

可以多次 add,然后一次 commit,push。

  • git add:工作区的 dir/file。
  • git push(需要 gitee 的名字和登入密码)。
  • git commit -m "日志信息"。第一次 commit,需填写 gitee 的名字和邮箱。

运行下面的两个指令。

注意: 一个文件/目录,每次提交修改都需要 add,commit,push,Windows 的小乌龟第一次 add,commit,push,后面只需 commit,push,简化了而已。

5.3 其他操作

  • git log:查看提交记录。
  • git status:检查哪些文件被修改(但未暂存);查看哪些文件已暂存(准备提交);显示未跟踪的文件(新文件,Git 尚未管理);提示当前分支状态(是否与远程分支同步)。
  • git pull:将远程仓库同步到本地。(远程仓库认为是最新的,当本地仓库和远端仓库不同时,需要同步)
  • 删除本地仓库和远程仓库的文件,git rm 文件名,删除了本地仓库文件,git commit -m "删除文件名",git push,删除了远程仓库文件。
  • 在本地仓库中,将一些文件移动到一个新建的目录下,mkdir 新目录名,git mv 文件 (可多个) 新目录名

6、调试器 gdb/cgdb

6.1 预备知识

  1. 程序发布模式
    • Debug 模式:包含调试信息,便于调试程序。
    • Release 模式:默认模式,不包含调试信息,程序更高效。
gcc code.c -o code  // gcc/g++默认 release 模式
gcc code.c -o code -g  // -g 添加调试信息
  1. gdb 不太好用,再下载个 cgdb,封装一层,便于调试。
sudo yum install -y gdb
sudo yum install -y cgdb
  1. cgdb 携带调试信息的可执行程序。

6.2 常用指令

1. r&&q
  • r/run:启动调试并开始执行程序。或重新调试并执行程序。
  • q/quit:退出 cgdb。
2. 断点

注意: 一般是在 run 之前打断点。

  • b 行号:在该行打断点。b 函数名:在函数的入口打断点。
  • b 行号 if 条件:在该行打条件断点。
  • info b:查看断点。cgdb 不退出,断点的编号一直增加。
  • d 断点编号:删除断点。
  • disable 断点编号:禁用断点。
  • enable 断点编号:启用断点。
3. 跳转
  • n/next:逐过程,类似于 vs2022 的 f10。
  • s/step:逐语句,类似于 vs2022 的 f11。
  • c:跳到逻辑上的下一个断点。
  • until 行号:执行到指定行号。默认只在当前函数内生效,方便局部跳转。
  • finish:直接执行完当前函数。

tip:回车——执行最近的 gdb 命令。

4. 查看
  • p 变量/表达式:显示变量/表达式的值。
  • info locals:显示当前栈帧的局部变量的值。
  • display 变量/表达式:一直显示变量的值。undisplay 编号:不再显示。
  • watch 变量/表达式:只有值变化,才显示。是一种断点,通过 d 断点编号,删除。
  • bt:显示当前函数的调用栈。
  • set var 变量名=值:手动修改变量的值。

目录

  1. 1、包管理器 yum
  2. 1.1 软件包的依赖
  3. 1.2 镜像源
  4. 1.3 查找/安装/卸载软件
  5. 2、编辑器 vim
  6. 2.1 命令模式 (默认)
  7. 2.1.1 撤销与反撤销
  8. 2.1.2 光标定位
  9. 2.1.3 复制 && 剪切 (删除) && 粘贴
  10. 2.1.4 替换
  11. 2.1.5 插入模式
  12. 2.1.6 V-Block 模式
  13. 2.2 底行模式
  14. 2.3 命令行使用 vim 的技巧
  15. 2.4 vim 的配置
  16. 3、编译器 gcc/g++
  17. 3.1 预处理
  18. 3.2 编译
  19. 3.3 汇编
  20. 3.4 链接
  21. 3.4.1 动态库 (动态链接)
  22. 3.4.2 静态库 (静态链接)
  23. 3.4.4 库的本质
  24. 两个编译过程:
  25. 4、自动化构建工具 make/Makefile
  26. 4.1 make
  27. 4.2 Makefile
  28. 1. 目标 (Target)
  29. 2. 依赖 (Prerequisites)
  30. 3. 命令 (Recipe)
  31. 4.3 Makefile 的一些细节
  32. 变量定义
  33. SRC := $(wildcard *.c) # 当前目录下所有的.c 文件
  34. 默认目标
  35. $@,是目标,$^,是所有的依赖
  36. 模式规则:编译 .c 到 .o,.c 为当前目录下的.c,只编译需要的.o
  37. 默认生成同名的.o 文件
  38. $<,是单个依赖,将.c 分别编译为.o
  39. 伪目标
  40. 5、版本控制器 git
  41. 5.1 安装和 clone
  42. 5.2 add&&commit&&push
  43. 5.3 其他操作
  44. 6、调试器 gdb/cgdb
  45. 6.1 预备知识
  46. 6.2 常用指令
  47. 1. r&&q
  48. 2. 断点
  49. 3. 跳转
  50. 4. 查看
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 基于 GLM-4.6V-Flash-WEB 的森林病虫害传播路径图像推断
  • 网文作家 AI 写作技巧与效率提升
  • Python 实现 MCP 客户端调用高德地图天气查询示例
  • Python 调用高德地图 MCP 服务查询天气示例
  • LangChain 核心解析:从 LLM 调用到 Agent 架构
  • Linux C++ 多进程编程:fork 函数与进程管理机制
  • 从空乘转行网络安全:零基础入门经验与面试技巧分享
  • 【面试分享】前端 React 50个基础高频面试题,助你轻松拿 offer!
  • 基于 AI 助手的自然语言转 SQL 查询与数据库优化实践
  • Java 异常处理:从原理到实战最佳实践
  • 位运算实战:判断字符唯一性与查找缺失数字
  • Epoll 水平触发与边缘触发:面试核心考点解析
  • 二叉树层序遍历:BFS 算法可视化与实现
  • Python 中的 == 与 is:本质区别与最佳实践
  • 基于飞算 JavaAI 的在线图书借阅平台设计与实现
  • Spring Web MVC 核心概念与实战指南
  • Java 浮点运算工具类
  • AI 大模型应用场景落地策略:从理论到实践
  • OpenWrt 固件编译:从环境搭建到多架构适配
  • DeepSeek + 通义万相高效制作 AI 视频实战详解

相关免费在线工具

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online

  • JSON美化和格式化

    将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online