目录
[1.1 软件包的依赖](#1.1 软件包的依赖)
[1.2 镜像源](#1.2 镜像源)
[1.3 查找/安装/卸载软件](#1.3 查找/安装/卸载软件)
[2.1 命令模式(默认)](#2.1 命令模式(默认))
[2.1.1 撤销与反撤销](#2.1.1 撤销与反撤销)
[2.1.2 光标定位](#2.1.2 光标定位)
[2.1.3 复制&&剪切(删除)&&粘贴](#2.1.3 复制&&剪切(删除)&&粘贴)
[2.1.4 替换](#2.1.4 替换)
[2.1.5 插入模式](#2.1.5 插入模式)
[2.1.6 V-Block模式](#2.1.6 V-Block模式)
[2.2 底行模式](#2.2 底行模式)
[2.3 命令行使用vim的技巧](#2.3 命令行使用vim的技巧)
[2.4 vim的配置](#2.4 vim的配置)
[3.1 预处理](#3.1 预处理)
[3.2 编译](#3.2 编译)
[3.3 汇编](#3.3 汇编)
[3.4 链接](#3.4 链接)
[3.4.1 动态库(动态链接)](#3.4.1 动态库(动态链接))
[3.4.2 静态库(静态链接)](#3.4.2 静态库(静态链接))
[3.4.4 库的本质](#3.4.4 库的本质)
[4.1 make](#4.1 make)
[4.2 Makefile](#4.2 Makefile)
[1. 目标 (Target)](#1. 目标 (Target))
[2. 依赖 (Prerequisites)](#2. 依赖 (Prerequisites))
[3. 命令 (Recipe)](#3. 命令 (Recipe))
[4.3 Makefile的一些细节](#4.3 Makefile的一些细节)
[5.1 安装和clone](#5.1 安装和clone)
[5.2 add&&commit&&push](#5.2 add&&commit&&push)
[6.1 预备知识](#6.1 预备知识)
[6.2 常用指令](#6.2 常用指令)
[1. r_q](#1. r_q)
[2. 断点](#2. 断点)
[3. 跳转](#3. 跳转)
[4. 查看](#4. 查看)
前言:
作者使用的是Centos7.9。
从现在开始 ,使用普通用户 (root用户权限太高,有点危险),需要更高的权限 ,sudo即可。
1、包管理器yum
Linux,Centos,一般使用yum 来下载软件。apt类似。
1.1 软件包的依赖

yum,会解决 包的依赖问题(即一起帮你下载)。
1.2 镜像源
Linux通过内置链接 ,下载软件 ,可是由于国家安全(不能访问外网),内地社区就拷贝资源 ,使用自己社区的链接。
镜像站 | 官网 | 支持发行版 |
---|---|---|
清华大学 | https://mirrors.tuna.tsinghua.edu.cn | CentOS, Ubuntu, Debian, Arch, EPEL |
阿里云 | https://mirrors.aliyun.com | CentOS, Ubuntu, Docker |
华为云 | https://mirrors.huaweicloud.com | CentOS, Ubuntu |
网易 | http://mirrors.163.com | Ubuntu, Debian |
中科大 | https://mirrors.ustc.edu.cn | Arch Linux, Docker |
可以通过更改yum的配置文件 ,更改下载链接(从哪里下载)。


1.3 查找/安装/卸载软件
bash
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模式。
常用于:
批量注释,
Ctrl+v(进入V-Block模式),
hjkl(选择区域,也可以n+hjkl),

shift+i,进入插入模式,输入//,

Esc,进入命令模式,就一起注释了。

批量删除注释,
Ctrl+v(进入V-Block模式),
hjkl(选择区域,也可以n+hjkl),
直接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,没有自动缩进,没有自动补齐等等,用起来不太方便,需要一些配置。
这里推荐一个自动化配置(自己配置比较麻烦):
bash
curl -sLf https://gitee.com/HGtz2222/VimForCpp/raw/master/install.sh -o ./install.sh && bash ./install.sh
注意:
在普通用户下一键式安装(root用户容易出问题)。就改变了普通用户的vim配置。
只支持Centos7。
失败就多试几次 。安装成功 后,可能需要重启一下。
默认是两个空格的缩进。
如果要改成四个空格的缩进,vim 家目录下的vimrc,

都改成4。
3、编译器gcc/g++
gcc/g++ 默认情况下会执行完整的编译流程 ,包括 预处理、编译、汇编、链接 这四个步骤,并最终生成可执行文件(或库)。
gcc只能编译.c文件,g++既能编译.c文件也能编译.cpp文件,其他基本相同,以下以gcc为例。
bash
// 将code.c编译为code的两种格式
gcc code.c -o code // 常用
gcc -o code code.c
3.1 预处理
- 修改代码 ,通过头文件展开 ,宏替换 ,条件编译 (进行功能裁剪),去注释等。
- -E 选项仅 进行预处理。
- 生成 .i文件。
bash
gcc -E code.c -o code.i
3.2 编译
- 将预处理后的代码 转换为汇编代码。
- -S 选项仅 生成汇编代码。
- 生成 .s文件。
bash
gcc -S code.i -o code.s
3.3 汇编
- 将汇编代码 转换为机器码 (CPU能直接执行的二进制指令)。
- -c 选项仅 生成汇编代码。
- 生成 .o目标文件。
bash
gcc -c code.s -o code.o
gcc -c code.c // 默认生成,同名的.o文件
3.4 链接
-
将多个 .o****目标文件 和库文件 (.so/.a)合并,生成最终的可执行文件或动态库。
-
直接运行 gcc 或 g++ 默认 会执行链接:
bash
gcc code.o -o code
Linux中,是lib+库名+后缀。
注意:
自己写 的可执行程序 ,需要指定目录 ,才能执行 。./(当前目录)
3.4.1 动态库(动态链接)
- Linux,.so后缀,Windows,.dll后缀。
- 动态库,又称共享库,被多程序共享。可执行程序的动态库不能缺失。
- 执行目标方法 ,需跳转到库中。文件体积小。
ldd****可执行文件 或动态库 ,可以查看 需要的动态库。
3.4.2 静态库(静态链接)
- Linux,.a后缀,Windows,.lib后缀。
- 执行目标方法 ,会将方法拷贝过来 ,再执行。文件体积大。可执行程序的对静态库的依赖度小。
3.4.4 库的本质
库可以理解为,.o文件 和**.h****文件** 的集合。
一般把文件编译 到**.o文件** ,再与库文件 链接,形成可执行程序。
两个编译过程:
-
文件包含1.h(有方法的声明),可以过编译这关,然后给1.o(有方法实现),链接,没问题。
-
C++模板不支持声明和定义分离到.h.c,因为文件虽然包含了.h,预处理展开头文件,编译时实例化了声明,可以过编译这关,但是.o的方法没有实例化,所以链接时找不到方法的实现,所以有问题。
4、自动化构建工具make/Makefile
4.1 make
make,是命令 ,可以指定目标,默认执行 当前目录下Makefile中的第一个目标。
4.2 Makefile
Makefile或makefile,是文件(包含编译的指令 或 各种自动化任务)。
Makefile 主要由以下三部分组成:
bash
目标(target): 依赖(prerequisites)
[TAB]命令(recipe)
1. 目标 (Target)
-
通常是最终要生成的文件名 (如
main.o
) -
也可以是一个操作名称 (如
clean
) -
一个 Makefile 可以有多个目标
2. 依赖 (Prerequisites)
-
构建目标所需的文件或其他目标
-
可以是多个文件 ,用空格分隔
-
如果依赖文件比目标文件新 (目标文件应该是更新的,因为最后生成的是目标文件,当依赖文件被修改了,此时依赖文件更新,会重新编译),make 会重新构建目标 。(即当改了依赖文件 ,make 会重新构建目标)
注意:
通过文件 的Modify (最近文件内容修改时间)判断 ,是否更新。
默认没改依赖文件,就不会重新构建目标。这里会引出一个问题。如果
bash
clean:
rm -f *.o main
当执行 make clean 时,rm -f *.o main 会正常执行。
但是如果当前目录下恰好存在一个名为 clean 的文件或目录 ,make 会认为 clean目标已经是最新的(因为 clean没有依赖项),从而拒绝执行 rm 命令。
加上 .PHONY 的作用
bash
.PHONY: clean
clean:
rm -f *.o main
- 明确声明 clean 是伪目标 (不是实际文件),强制 make 执行其命令,无论是否存在同名文件。
- 避免意外行为 :即使有人创建了 clean文件,make clean 也能正确执行清理操作。
- 提高可读性 :明确告知开发者这是一个用于执行操作(而非生成文件)的目标。
3. 命令 (Recipe)
-
必须以 Tab 开头(不能用空格代替)
-
是要执行的 shell 命令
-
可以有多条命令,每条占一行
4.3 Makefile的一些细节

-
直接make ,默认执行第一个目标test (因为依赖,所以不断执行),test依赖test.o,test.o依赖test.c,所以先生成test.o,再生成test。
-
执行的命令会回显,前面加@ 就不会回显了。如:



- Makefile 中确实使用了类似宏定义(变量)和类似解引用(变量展开)的机制。这种设计使得 Makefile更加灵活和可维护。如:
bash
# 变量定义 需要$(),类似于解引用,才能使用
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,只编译需要的.o
%.o: %.c
$(CC) -c $< # 默认生成同名的.o文件
# $<,是单个依赖,将.c分别编译为.o
# 伪目标
.PHONY: clean
clean:
rm -f $(OBJS) $(TARGET)
5、版本控制器git
5.1 安装和clone
安装git
bash
sudo yum install -y git
在gitee创建远端仓库,


复制https的地址,

将远端仓库克隆到本地。
bash
git clone https地址

5.2 add&&commit&&push

可以多次add,然后一次commit,push。
第一次需:
填写gitee的名字和邮箱,
git add .,git commit(需要gitee的名字和邮箱),git push(需要gitee的名字和登入密码)。
git log,查看提交记录。
git status
-
检查哪些文件被修改(但未暂存)。
-
查看哪些文件已暂存(准备提交)。
-
显示未跟踪的文件(新文件,Git 尚未管理)。
-
提示当前分支状态(是否与远程分支同步)。
git pull,将远程仓库同步到本地。(远程仓库认为是最新的,当本地仓库和远端仓库不同时,需要同步)
注意:
一个文件/目录,每次提交修改都需要****add,commit,push,
Windows的小乌龟第一次add,commit,push,后面只需commit,push,简化了而已。
6、调试器gdb/cgdb
6.1 预备知识
- 程序发布模式
Debug模式 :包含调试信息 ,便于调试程序。
Release模式 :默认 模式,不包含调试信息 ,程序更高效。
bash
gcc code.c -o code // gcc/g++默认release模式
gcc code.c -o code -g // -g添加调试信息
- gdb不太好用,再下载个cgdb,封装一层,便于调试。
bash
sudo yum install -y gdb
sudo yum install -y cgdb
- 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 变量名=值 。手动修改变量的值。