
Linux 构建工具核心:make 命令、进度条与 Gitee 使用
本文介绍了 Linux 环境下 make 构建工具的原理及 Makefile 编写规范,详细讲解了 C 语言中缓冲区机制与进度条实现方法,并演示了 Gitee 远程仓库在 Linux 终端中的安装、配置及代码提交操作流程。

本文介绍了 Linux 环境下 make 构建工具的原理及 Makefile 编写规范,详细讲解了 C 语言中缓冲区机制与进度条实现方法,并演示了 Gitee 远程仓库在 Linux 终端中的安装、配置及代码提交操作流程。



**前引:**在 Linux 开发与运维场景中,当我们面对包含数十个甚至上百个源文件的项目时,手动输入 gcc 编译命令不仅繁琐易错,更会因文件依赖关系混乱导致编译效率极低。修改一个核心头文件后,如何快速定位并重新编译所有关联的源文件?如何统一管理编译选项、输出路径与清理操作?make 指令与 Makefile 文件正是解决这些问题的利器!
首先我们需要知道:make属于命令,Makefile(Makefile 也可以)属于文件。二者配套使用。
make是一个命令行工具,本质是一个'构建引擎'。它的核心功能是:根据预先定义的'规则',自动判断项目中哪些文件需要重新编译,并执行相应的编译命令,最终生成可执行程序或目标文件。
Makefile是一个文本文件(通常命名为Makefile或makefile),它是make工具的'操作手册'。
简而言之:通过执行make命令来调用Makefile文件,而过程的实现放在Makefile文件里面!
在学习编写之前,我们需要学习依赖关系和依赖方法的概念:
首先我们打开创建的 makefile 文件,编写格式解读如下:

首先是目标文件:目标文件代表整个过程输出的可执行程序(例如编译之后需要产生 Hello 文件)。
依赖关系文件:代表生成可执行程序需要涉及到的文件(例如这里是源文件)。
依赖方法:代表方法的实现(例如这里采用 gcc 编译)。**注:**依赖方法前面是 tab 键,不是四个空格。
clean:代表自动清理,不需要依赖任何关系文件。

这是因为 make 的执行是根据源文件或者文件修改时间来判断的,执行 stat 命令可以查看文件的各种信息:例如最近读取时间(一般固定时间刷新)、文件内容修改、元数据修改(大小……)。

我们可以使用 touch 命令来刷新文件的所有信息,只要文件各种数据信息发生变化,就可二次执行 make 和 make file!例如:

而我们一般将 clean 使用 .PHONY 修饰 clean 或者目标文件,这样被修饰可以直接二次执行。

同时我们可以用 $@ 代表目标文件,$^ 代表后面所有的依赖关系,用 @ 修饰的依赖方法可以在 make 执行文件的时候不显示具体的执行命令!

现在我有一个完成编写的代码文件:
现在我们来用 make 和 makefile 完成源文件到可执行程序:
- 我们先在当前目录下 touch 一个命令为 makefile/Makefile 的文件
- vim 打开这个文件,完成编写
- 用 make 命令执行 makefile,生成可执行文件和删除可执行文件
这样我们就完成从源文件到可执行程序再到删除可执行程序的过程!
在开始,回车、换行其实是两个键:
回车是回到当前行的开头,换行是换到第二行但是不回开头,现在将两个键合二为一了!例如:
| 术语 | 英文缩写 | ASCII 码 | 转义字符 | 核心功能(现代终端) |
|---|---|---|---|---|
| 回车 | CR | 0x0D | \r | 将光标移动到当前行的开头(不换行) |
| 换行 | LF | 0x0A | \n | 将光标移动到下一行的同一列(不回开头) |

缓冲区:
操作系统在内存中开辟的临时存储区域,你可以这么理解:由用户程序(如 C 语言、Shell 脚本)在用户空间(非内核空间)自行分配的缓冲区,用于暂存程序处理的数据,减少与内核缓冲区的交互次数(即先将程序处理数据存到缓冲区,程序运行完毕,再输出程序结果)。而使用 会触发刷新缓冲区,即直接刷新缓冲区,例如:
// 代码 1:无换行符,不刷新
#include <stdio.h>
#include <unistd.h>
int main() {
printf("hello"); // 数据存入行缓冲,不显示
sleep(3); // 等待 3 秒
printf("\n"); // 遇到\n,刷新缓冲区,显示"hello"
return 0;
}
// 代码 2:有换行符,立即刷新
#include <stdio.h>
#include <unistd.h>
int main() {
printf("hello\n"); // 遇到\n,立即显示"hello"
sleep(3);
return 0;
}
**实现思路:**输出 -> 刷新缓冲区 -> (可以使用 sleep 控制休眠)-> 循环
补充:
fflush(stdout)并非 Linux 系统指令,而是 C 语言标准库(stdio.h)中的一个函数,主要作用是 强制刷新标准输出流(stdout)的缓冲区,将缓冲区中暂存的数据立即写入到对应的输出设备(通常是终端或文件),而不等待默认的缓冲刷新条件(如缓冲区满、遇到换行符或程序结束)。
这里为什么用函数指令而不是
?:以换行为主,刷新为辅,仅在行缓冲模式下附带刷新效果,本质是控制字符;fflush(stdout):以刷新为主,与换行无关,无视缓冲模式(除无缓冲)强制刷新,本质是函数。
实现:
我们先创建三个文件,类似 C/C++ 工程项目:

然后像语言那样完成程序的写入和头文件的包含:


然后我们用 makefile 完成文件的依赖关系准备编译:

我们查看执行结果:

安装上面我们学习的缓冲区原理,我们来做一个简单的进度条!
说明:进度条的实现无非是利用回车或者换行……这些刷新缓冲区,打印结果显示出来。


注意: 会回到当行开头,不要放错位置了!

这是基本的实现,有其它想法可以自己利用缓冲区刷新、 、 的特性去丰富!
进度条的实现主要是利用了两个关键的地方:
- ** ** 每次打印完回到开头,后面会不断覆盖
- fflush(stdout) 直接刷新缓冲区立刻输出,否则会等程序全部跑完一起输出
可理解为 Gitee 是用来维护你的代码的,那维护的过程又是怎么样的呢?
个人开发者(你)->提交代码到本地仓库->远程仓库。解释如下:
提交到本地仓库:是为了给自己的开发过程'留痕',解决'个人开发中的版本管理、分支并行、回滚需求',让你敢改代码、不怕出错。 同步到远程仓库:是为了让团队'对齐进度',解决'多人协作、数据备份、权限管控'的问题,让团队开发有序、可靠。
下面我们开始学习 Linux 指令版的本地\远程仓库的安装和上传!
- 首先我们检查是否安装了 Gitee:
- 如果没有安装 Gitee,(Centos)执行下面命令:
需要输入下面两个指令:
# 替换为你的 Gitee 用户名(不是昵称,是登录账号)
git config --global user.name "你的 Gitee 用户名"
# 替换为你的 Gitee 绑定邮箱
git config --global user.email "你的 Gitee 邮箱"
**注意:**用户名是@后面的字符
**注意:**邮箱需要打开设置,在邮箱管理里面即可查看
- 首先进入一个项目目录下
- 初始化本地仓库 执行后会生成一个隐藏 git 文件,可以查看:
- 将文件添加到暂存区 暂存区:临时存放待提交的文件,可多次执行
git add添加不同文件- 提交代码到本地仓库 例如:
- 查看本地提交记录 例如:
首先需要在 Gitee 上建立一个仓库:选择开源公开最好 2. 创建之后然后选择初始化 3. 点击克隆/下载,复制这个 然后回到 Linux 指令界面,执行下面命令:
可以查看自己仓库是main还是master:
**注意:**提交需要进入到本次仓库,进入里面创建文件,执行下面一连串指令即可正确提交!
# 1. 假设在本地修改了 app.py(修复 bug)
vim app.py # 编辑文件(或用其他编辑器)
# 2. 将修改的 app.py 加入暂存区
git add app.py
# 3. 提交到本地仓库(写清楚修改内容)
git commit -m "fix: 修复 app.py 中用户登录失败的 bug(处理空密码场景)"
# 4. 拉取远程最新代码(避免冲突)
git pull origin master
# 5. 推送到远程仓库(让团队看到修改)
git push
如果删除我们需要使用 rm -rf 仓库名
后面要建立新的仓库,直接跳到(5)开始操作即可


微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML 转 Markdown 互为补充。 在线工具,Markdown 转 HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML 转 Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online
将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online