一、Linux 三种软件安装方式
源代码安装
把软件的原始 C/C++ 代码下载到本机,自己编译成可执行程序。
优点:可以自定义编译参数;缺点:麻烦,需要手动解决依赖。
rpm 安装
rpm 是 CentOS 系列的软件包格式(类似 Windows 的 exe 安装包)。
rpm -ivh xxx.rpm直接安装本地下载好的包。缺点:不会自动帮你装依赖,缺库就要自己一个个去找包。
yum 安装(重点)
yum 是 rpm 包的包管理器。
✅ 自动解决依赖、自动下载、自动安装对应版本。
类比:手机应用商店,点一下安装,自动下载 + 自动补齐需要的组件。
依赖 = 这个软件运行必须要的其他程序 / 库文件。
一个软件不是孤立的,它要靠别的小工具、底层库才能跑起来,这些必须的东西,就叫依赖。
- rpm:只装你指定的那一个包,缺东西不会主动补。
- yum:装软件前先查全部依赖,自动把所有需要的配套库一起安装。
二、Linux 软件生态(这张思维导图核心)
1. yum 源是什么
yum 不是凭空下载软件,需要去yum 源服务器拿包。
- 官方 yum 源:操作系统厂商(如 CentOS、华为)维护的服务器,存放官方软件包。
- 扩展 yum 源:第三方、公司、个人搭建的服务器,提供官方没有的软件。
流程:
Linux 本机(客户端) → 通过网络 → 访问 yum 源服务器 → 下载 rpm 包 + 自动安装依赖
类比:
Windows:软件管家;Ubuntu:apt-get;CentOS:yum。
不同系统有各自的 “应用商店客户端”。
2. 两个角色
- 使用者:我们程序员、服务器运维人员,下载软件来用。
- 提供者:操作系统厂商、开源社区、公司,维护 yum 源、打包软件,给大家提供下载服务。
思考问题:客户端怎么知道去哪里下载?
答:系统里保存了 yum 源的地址配置文件,yum 命令读取这个地址,找到对应的服务器。
3. 开源的两层理解
- 开源是一种商业战略:开放源代码,吸引大量开发者使用、贡献代码,壮大软件生态。
- 开源 ≠ 免费:源代码公开,但商业服务、技术支持可以收费,所以开源有时候也很贵。
4. 操作系统选型逻辑
新人 / 企业选操作系统,优先看生态好不好:软件多不多、好不好安装、资料多不多。
操作系统设计者要做的事:搭建包管理体系(yum/apt)、维护软件源,打造完善生态,吸引用户。
yum install -y epel-release
逐段解释这条命令
yum install:yum 安装软件-y:自动回答 yes,安装过程不再弹出确认提问epel-release:EPEL 扩展源CentOS 官方自带的 yum 源里软件数量有限。EPEL 是额外的第三方软件仓库,装上它之后,yum 就能搜到很多官方源没有的软件。
vim 是多模式编辑器
不同模式下,键盘按键作用完全不一样,这是它和记事本最大区别。
三个模式
命令模式(默认模式)
打开 vim 直接进入这个模式。
笔记原话:所有输入都会被当成命令,不会当成文字。
你按字母
i不是输入字母 i,而是触发 “进入插入模式” 这个指令。
- 插入模式(写文字 / 写代码)
- 切换:命令模式按
i,进入插入模式,此时键盘打字才是输入文本。 - 退出:按
ESC回到命令模式。
- 底行模式(保存、退出、查找)
切换:必须先在命令模式,输入
shift + ;也就是冒号:,屏幕最下面出现冒号,就是底行模式。常用指令:
:wq保存并退出(w=write 写入保存,q=quit 退出)
❗重点坑:插入模式不能直接进底行模式!必须先按 ESC 回到命令模式,才能打
:。图里红叉就是这个意思。
模式切换流程图记忆
plaintext
命令模式(默认) ├─按 i → 插入模式(打字),ESC返回命令模式 └─按 : → 底行模式(保存退出),执行完命令自动回命令模式常考小考点
i:命令模式 → 插入模式ESC:任何模式回到命令模式:wq:底行模式,保存并退出:q!:底行模式,不保存强制退出
vim【命令模式】快捷键
【必背,天天要用,优先记住】(这几个一定要熟练)
- 光标移动:
gg跳到文件开头、G(shift+g)跳到末尾、hjkl方向 - 复制剪切粘贴:
yy复制一行,dd删除一行,p粘贴 - 撤销:
u撤销,ctrl+r反撤销 - 分窗口:
:vs分垂直窗口,ctrl ww切换窗口
理由:写代码、改文件几乎每次 vim 都要用到,敲多了自然记住,不用死背。
【熟悉就行,不用硬背,知道有这个功能,需要再查笔记】
nG跳指定行、shift+$行尾、shift+^行首w/b单词跳转、3yy/5dd多行复制删除、x删字符r替换字符、shift+~大小写切换
理由:偶尔用,考试会出选择题,认识看得懂就行,不用默写。
【了解概念,记住有这个东西即可,不用背按键】
shift+R替换模式、vim 用户独立配置、一键配置脚本那条 curl 命令
只需要知道:存在这个功能,知道是干嘛的,实操很少用。
专门给新手做的一键 vim 配置包,目标:把服务器上的 vim 一键改成适合 C++ 写代码的简易 IDE,自动装好代码高亮、自动缩进、代码补全插件。
bash
运行
curl -sLf https://gitee.com/HGtz2222/VimForCpp/raw/master/install.sh -o ./install.sh && bash ./install.shMakefile
一、基础概念
make:Linux 命令(程序)
Makefile:当前目录下名字固定的文本文件,里面写编译规则、依赖关系。
执行
make,程序自动读取Makefile,按照里面规则编译代码。
二、make 的核心工作原理(最重要考点)
make不会无脑每次全部重编译。
判断逻辑:对比目标文件(可执行程序)和依赖的源码文件的最后修改时间
- 源码修改时间新于可执行文件 → 需要重新编译
- 源码没有改动,可执行文件更新(比源码文件新) → 提示
is up to date,跳过编译,提升编译效率
文件 = 文件内容 + 文件属性(修改时间就存在文件属性里)
C 语言完整 4 步编译流程(图里四条 gcc)
bash
运行
gcc -E mycode.c -o mycode.i #预处理 .c → .i gcc -S mycode.i -o mycode.s #编译 .i → .s汇编 gcc -c mycode.s -o mycode.o #汇编 .s → .o目标文件 gcc -o mycode mycode.o #链接 .o → 最终可执行程序mycodeMakefile 可以描述这种链式依赖。
这种写法会把 4 步拆开,每一步都会生成对应的中间文件 (.i .s .o)
make 会顺着链条检查时间:
- 如果只改了
mycode.c:全部环节重新跑一遍 - 如果只改了
mycode.s:只重新汇编 + 链接,前面预处理、编译全部跳过
链式依赖 Makefile(课件例子):手动拆分 4 个阶段,中间文件保存在磁盘;大项目优势巨大,只重新编译改动的那一环。
预处理:拿头文件(声明,说明书)
链接:拿库文件(函数真正的二进制实现本体)
真正 printf 的代码本体,在系统库文件里(shturl.)
这个库文件是编译好的二进制机器码,不是 C 源码,头文件里面不会包含它
链接阶段的工作:把你的.o 和系统库里面 printf 的二进制代码拼在一起,
三、清理工程(make clean)
编译后会产生.i .s .o中间文件 + 可执行文件。
写一个 clean 规则,一次性删掉这些产物,叫清理工程。
普通目标的问题:
如果当前目录真的存在一个名叫 clean 的文件,make clean会认为这个目标已经是最新,不会执行删除命令。
四、.PHONY 伪目标(必考)
.PHONY: clean
含义:声明 clean 是伪目标
- 伪目标不是磁盘上真实存在的文件
- 不管有没有同名文件,每次执行 make clean 都会强制运行里面的命令,不对比文件时间
一句话:伪目标用来保证指令一定执行,最常用场景就是 clean 清理。
这句话告诉 make:clean 不是磁盘上的文件,只是一个命令名字,不要去检查文件时间。
举例子
写了这个 Makefile:
makefile
clean: rm -f test这里clean是目标。
场景:如果当前目录,真的有一个文件,名字就叫 clean。
执行make clean的时候:
make 一看:目标clean这个文件已经存在。
又因为 clean 目标没有写任何依赖文件,make 判定:这个目标已经是最新的,不需要执行命令。
👉rm 命令根本不会跑!不会删除 test。
五、Makefile 自动变量(图底部特殊符号)
$@:代表目标名(冒号左边)$^:代表所有依赖文件(冒号右边全部文件)
示例:
makefile
mycode:mycode.c @gcc -o $@ $^$@= mycode;$^= mycode.c
等价:gcc -o mycode mycode.c
命令最前面的@的作用:执行这条命令时,不在屏幕上打印这条命令本身
一、\r和\n区分(回车、换行)
\n换行:光标跳到下一行的开头(我们平时敲回车换行)\r回车:光标回到当前这一行的最开头,不跳到下一行
进度条 / 倒计时就是靠
\r,新内容直接覆盖本行旧文字,实现原地刷新。
二、缓冲区(本节课最核心考点)
示例代码
c
运行
printf("hello world"); sleep(2); return 0;现象:程序先 sleep 休眠 2 秒,2 秒结束之后,才一次性打印 hello world
疑惑:明明 printf 写在 sleep 前面,为什么不是先打印,再休眠?
大白话解释
stdout(标准输出,就是屏幕)自带输出缓冲区(一块内存空间)
printf("hello world");字符串不会直接送到屏幕,先放进缓冲区内存里存起来。
sleep(2);程序休眠 2 秒,此时文字还躺在缓冲区,屏幕啥都不显示。函数结束 return,程序退出,缓冲区自动刷新,把文字一次性输出到屏幕。
✅ 缓冲区本质:C 语言帮我们维护的一块临时内存,用来暂存要输出的数据。
什么时候缓冲区会自动刷新?
- 遇到
\n换行符(最常见) - 程序运行结束,自动刷新
- 缓冲区存满了,自动刷出去
- 手动强制刷新:
fflush(stdout);
修改代码,强制立刻打印
c
运行
printf("hello world"); fflush(stdout); // 强制把缓冲区内容立刻刷到屏幕 sleep(2); return 0;现在效果:立刻打印 hello world,然后等待 2 秒
三、三个标准流
stdin:标准输入,对应键盘stdout:标准输出,对应显示器屏幕(带行缓冲,就是咱们上面讲的缓冲区)stderr:标准错误,报错信息,无缓冲,直接输出
✅stdin(标准输入,键盘)也有缓冲区,叫输入缓冲区
1. stdin 输入缓冲区是干嘛的
你在键盘敲字符,不会一个字直接交给程序,先暂时存到输入缓冲区这块内存。
等到你按下回车Enter,这一整行的内容,才一次性交给 C 程序读取
输入缓冲区经典坑(考试常考)
c
运行
int a; char ch; scanf("%d", &a); scanf("%c", &ch);输入:10+ 回车
你输入 10,敲回车,回车
\n会留在 stdin 缓冲区里面第二个
scanf("%c")直接读到这个换行符,不会等你再次输入。这就是输入缓冲区残留带来的 bug。
四、和前面倒计时代码关联
c
运行
printf("%-2d\r", cnt); fflush(stdout);\r只把光标移到行首,不会触发缓冲区刷新,必须手动fflush(stdout),才能立刻把数字打印到屏幕,实现动态倒计时。
倒计时程序
1、什么是版本控制(图里实验报告例子)
就像写实验报告:
你写了 v1 版本 → 修改保存成 v2 → 再改 v3。
版本控制工具,自动帮你保存每一次修改的版本记录。
可以随时:
- 回看历史任意一版
- 回退到旧版本
- 多人一起修改同一个项目,合并大家的代码
新手程序员做法(不用 git):手动复制文件报告v1、报告v2、报告最终版、最终版真的不改了,容易乱、丢文件。
老手直接用 git 自动管理版本。
2、Git 和 SVN 的核心区别
SVN:集中式版本控制
有一台单独的中心服务器(server),本地只是客户端 client。
所有版本记录全部存在远端服务器,断网基本没法看历史版本。
Git:分布式版本控制(重点)
client 和 server 是一体的。
✅每个人电脑上都有完整的仓库(全部历史版本),也就是本地仓库
远端仓库只是一个备份 / 多人协作的中转站。断网也能提交、查看版本、回滚。
一句话:Git 本地自带完整仓库,SVN 本地没有完整版本库。
3、两个仓库概念
- 本地仓库:在你自己电脑 / 服务器上,
.git文件夹,存放全部版本历史。 - 远端仓库:放在网络上的仓库(github/gitee),用来多人同步、备份代码。
Git 程序本身既可以当客户端,也可以当服务端。
王五可以把自己本地仓库,推送到远端仓库;李四再从远端拉代码到自己本地。
4、Github / Gitee
它们不是 git!
是基于 git 做的商业网站,提供远端仓库托管服务。
就像:git 是发动机,github 是装了发动机的汽车平台。
类比:
Linux 内核是底层系统,CentOS、Ubuntu 是基于内核做出来的发行版;
git 是底层版本工具,Github/Gitee 是基于 git 的代码托管网站。