【Linux系统】05 Linux开发工具(下)
目录1 make 与 Makefile 自动化构建1.1 为什么需要 Makefile1.2 Makefile 基础规则1.3 make 工具推演执行逻辑1.4 伪目标 .PHONY1.5 Makefile 进阶语法自定义变量三大自动变量高频面试wildcard 通配符 后缀替换模式规则 %.o:%.c1.6 多文件项目通用 Makefile 模板​编辑2 实战Linux 终端进度条程序2.1 \r回车 与 \n换行2.2 完整进度条代码​编辑3 Git 版本控制基础3.1 版本控制解决什么痛点3.2 Git 简单历史3.3 安装与基础配置3.4 Github 基础三板斧​编辑4 gdb 调试器基础4.1 debug 版本与 release 版本gdb 常用核心命令5 本篇小结6 面试 实操高频问答Q1 make 和 Makefile 关系Q2 .PHONY 伪目标作用Q3 $ $^ $ 分别是什么Q4 \r 和 \n 区别fflush 作用Q5 gdb 调试为什么编译要加‑g1 make 与 Makefile 自动化构建1.1 为什么需要 Makefile小项目只有一两个.c文件可以直接手动敲 gcc 命令。 当项目源文件数量变多每次修改源码手动敲编译命令非常麻烦。make命令行工具用来解析 Makefile 文件规则Makefile文本文件记录项目编译的依赖规则。价值写好 Makefile 之后只输入make一条命令就自动编译make 会对比文件修改时间只重新编译被修改过的文件不会全部重编译提升编译效率。1.2 Makefile 基础规则每条规则格式目标: 依赖文件列表 Shell命令 # 必须Tab制表符开头不能用空格目标 (target)想要生成的文件例如可执行程序依赖生成目标所需要的文件依赖方法Tab 开头 shell 指令描述如何由依赖生成目标简单示例test.c源码#include stdio.h int main() { printf(hello Makefile!\n); return 0; }Makefile内容test:test.c gcc -o test test.c终端执行make ./test1.3 make 工具推演执行逻辑make 在当前目录寻找Makefile或者makefile读取文件取第一条规则的目标作为终极目标判断目标文件是否存在如果目标不存在执行命令生成目标如果目标已经存在对比目标文件修改时间 和 所有依赖文件修改时间。任意依赖文件比目标新 → 执行命令重新编译全部依赖比目标旧 → 什么都不做提示is up to date。如果依赖本身是另一条规则的目标则递归先执行这条规则生成依赖文件。测试时间逻辑make #生成test make #输出 is up to date touch test.c #更新c文件时间 make #重新编译1.4 伪目标.PHONYclean目标用来删除编译生成的中间文件与可执行程序clean: rm -f test *.o *.i *.s问题如果当前目录刚好存在名叫clean的普通文件执行make clean不会执行 rm 命令make 会认为 clean 文件已经是最新不需要执行规则。使用.PHONY把 clean 声明为伪目标 伪目标不在乎磁盘有没有同名文件只要执行make clean无条件执行对应命令不做时间戳对比。正确写法.PHONY:clean clean: rm -f test *.o *.i *.s运行清理make clean1.5 Makefile 进阶语法自定义变量CCgcc RMrm -f test:test.c $(CC) -o test test.c .PHONY:clean clean: $(RM) test$(变量名)取出变量内容。三大自动变量高频面试表格变量含义$当前规则的目标$^全部依赖文件集合自动去重$依赖列表第一个文件改写CCgcc RMrm -f test:test.c $(CC) -o $ $^ .PHONY:clean clean: $(RM) testwildcard 通配符 后缀替换wildcard *.c获取当前目录所有.c文件名$(SRC:.c.o)把列表中.c后缀替换为.oSRC$(wildcard *.c) OBJ$(SRC:.c.o)模式规则%.o:%.c%代表通配任意文件名。含义任意 xxx.o 文件依赖 xxx.c 源文件。%.o:%.c $(CC) -c $ -o $命令前面加代表不在终端回显这条 shell 命令静默执行。%.o:%.c $(CC) -c $ -o $1.6 多文件项目通用 Makefile 模板可以直接复制用于多 c 文件小项目CCgcc RMrm -f TARGETapp SRC$(wildcard *.c) OBJ$(SRC:.c.o) $(TARGET):$(OBJ) $(CC) $^ -o $ %.o:%.c $(CC) -c $ -o $ .PHONY:clean clean: $(RM) $(OBJ) $(TARGET)使用make make clean注意头文件.h不会被 wildcard 捕获大型项目需要手动把头文件加入依赖。2 实战Linux 终端进度条程序2.1\r回车 与\n换行老式打字机模型理解\n换行光标移动到下一行行首\r回车光标回到当前这一行的最开头不向下换行示例区分现象// 1 会sleep之后才打印hello printf(hello); sleep(3); // 2 \n会刷新行缓冲 printf(hello\n); sleep(3);Linux stdout 是行缓冲遇到\n才刷新缓冲区输出内容没有换行内容留在缓冲区不会立刻打印。fflush(stdout);强制刷新标准输出缓冲区立刻输出缓冲区内容。倒计时 demo#include stdio.h #include unistd.h int main() { int i 10; while(i 0) { printf(%2d\r,i); fflush(stdout); sleep(1); i--; } printf(\n); return 0; }2.2 完整进度条代码process.h#pragma once #include stdio.h void process_v1(); void FlushProcess(double total, double current);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) { printf([%-100s][%d%%][%c]\r, buffer, cnt, lable[cnt%len]); fflush(stdout); buffer[cnt] STYLE; cnt; usleep(50000); } 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); int i 0; for(; 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); }main.c#include process.h #include unistd.h double total 1024.0; double speed 1.0; void DownLoad() { double current 0; while(current total) { FlushProcess(total, current); usleep(3000); current speed; } printf(\ndownload Done\n); } int main() { DownLoad(); return 0; }配套简易 MakefileCCgcc RMrm -f TARGETprocessbar SRC$(wildcard *.c) OBJ$(SRC:.c.o) $(TARGET):$(OBJ) $(CC) $^ -o $ %.o:%.c $(CC) -c $ -o $ .PHONY:clean clean: $(RM) $(OBJ) $(TARGET)运行make ./processbar3 Git 版本控制基础3.1 版本控制解决什么痛点写代码经常复制一大堆副本v1、v2、最终版、最终版改改版本混乱分不清每版改了什么回滚麻烦。 Git 是分布式版本控制系统记录每一次文件修改历史支持版本回退、多人协同开发。3.2 Git 简单历史Linux 内核社区早期使用商业 BitKeeper2005 年合作终止。Linus Torvalds 开发 Git目标速度快、分布式、支持海量项目、强大分支管理。3.3 安装与基础配置CentOS 安装 gitsudo yum install git -y git --version首次使用配置用户名邮箱提交记录会携带git config --global user.name 你的名字 git config --global user.email 你的邮箱3.4 Github 基础三板斧Github 网页注册账号新建仓库New repository复制仓库 https/ssh 地址。克隆仓库到本地git clone 仓库地址进入仓库目录修改文件。三板斧git add 文件名 # 将改动加入暂存区 git commit -m 写本次修改说明 # 提交到本地仓库 git push # 推送到远端Github辅助常用命令git status #查看当前状态 git log #查看提交日志 git pull #拉取远端最新代码到本地.gitignore文件配置哪些文件不需要 git 管理比如编译生成的可执行程序、中间.o文件。4 gdb 调试器基础4.1 debug 版本与 release 版本gcc 默认生成 release 版本没有调试信息不能 gdb 调试。 想要使用 gdb编译的时候必须加上‑g选项生成 debug 调试信息。示例代码sum.c#include stdio.h int Sum(int s, int e) { int result 0; for(int i s; i e; i) { result i; } return result; } int main() { int start 1; int end 100; printf(I will begin\n); int n Sum(start, end); printf(running done, result is: %d\n, n); return 0; }编译带调试信息gcc -g sum.c -o sum gdb sumgdb 常用核心命令表格命令功能list/l查看源码l 行号run/r开始运行程序break/b 行号设置断点info breakpoints查看所有断点delete d 断点编号删除断点next/n逐过程不进入函数step/s逐语句遇到函数进入函数内部print/p 变量打印变量值display 变量持续跟踪打印变量continue/c运行到下一个断点quit/q退出 gdb5 本篇小结make/Makefile 实现自动化编译目标、依赖、Tab 命令.PHONY伪目标$ $^ $自动变量。\r回到行首、\n换行stdout 行缓冲fflush强制刷新实现终端进度条。git 分布式版本控制add commit push三板斧管理代码版本。gdb 调试编译必须加‑g掌握断点、next、step、print 基础调试命令。6 面试 实操高频问答Q1 make 和 Makefile 关系make 是可执行工具Makefile 是保存编译规则的文本文件make 读取该文件执行构建。Q2 .PHONY 伪目标作用忽略文件时间戳不管磁盘是否存在同名文件执行 make 伪目标就无条件执行规则典型用于 clean。Q3 $ $^ $ 分别是什么$当前规则目标$^全部依赖$第一个依赖。Q4 \r 和 \n 区别fflush 作用\n光标跳到下一行开头\r光标回到本行开头stdout 行缓冲fflush 强制刷新缓冲区立刻输出内容。Q5 gdb 调试为什么编译要加‑g-g生成调试符号信息release 版本没有调试信息无法 gdb 断点调试。系列回顾 04 上yum vim gcc/g 04 下make/Makefile 进度条 git gdb 调试 后续预告Linux 进程基础

相关新闻

Java 启动报 NoClassDefFoundError: feign/Request$Options 排查:provided scope 被 dependencyManagement 继承

Java 启动报 NoClassDefFoundError: feign/Request$Options 排查:provided scope 被 dependencyManagement 继承

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 4:54:53 阅读更多 →
Service层命名规范:见名知意,让代码自解释

Service层命名规范:见名知意,让代码自解释

说实话,我这两年接手和复盘过的后端项目里,十个有八个都栽在同一个问题上—— Service 层膨胀得像个黑洞。一个订单模块的 Service 类动辄七八百行,方法名不是handle就是process,参数列表长得像购物清单,改一个需求得在…

2026/10/12 4:53:53 阅读更多 →
SkiaSharp Issue-Repro 复现结论判定指南:8 种 conclusion 值的选择逻辑与证据要求

SkiaSharp Issue-Repro 复现结论判定指南:8 种 conclusion 值的选择逻辑与证据要求

图形学图像处理跨平台 【免费下载链接】SkiaSharp SkiaSharp is a cross-platform 2D graphics API for .NET platforms based on Googles Skia Graphics Library. It provides a comprehensive 2D API that can be used across mobile, server and desktop models to render i…

2026/10/12 4:53:53 阅读更多 →

最新新闻

mediamtx v1.21.2发布:UDP、JWT、RTSP、RTMP、HLS、WebRTC全面修复,稳定性与安全性再提升

mediamtx v1.21.2发布:UDP、JWT、RTSP、RTMP、HLS、WebRTC全面修复,稳定性与安全性再提升

2026年10月10日,mediamtx 发布 v1.21.2 最新版本。本次更新以“修复与改进”为主,覆盖通用逻辑、API、Media-Over-QUIC、RTSP、RTMP、HLS、WebRTC 以及依赖库升级等多个方向。 v1.21.2 没有引入新的功能模块,而是集中处理实际运行中可能出现的…

2026/10/12 5:43:21 阅读更多 →
哪个品牌密码锁最安全 高端市场占比领先全维安防更靠谱安心

哪个品牌密码锁最安全 高端市场占比领先全维安防更靠谱安心

在智能家居全面普及的今天,智能密码锁已经成为了家庭安全防护的核心入口。哪个品牌密码锁最安全,不仅关乎家庭财产安全,更影响着日常进出的便捷体验与全场景安防体验。2026年以来,国内智能门锁行业技术迭代加速,市场格…

2026/10/12 5:43:21 阅读更多 →
2026家用智能锁品牌推荐:德施曼热门产品深度解析

2026家用智能锁品牌推荐:德施曼热门产品深度解析

随着智能家居行业的快速发展,智能门锁已经成为了千家万户的入户安防首选。相较于传统机械锁,智能门锁不仅提供了更加便捷的多种解锁方式,还集成了猫眼可视、AI安防、远程对讲等功能,全方位提升家庭入户安全与使用体验。在2026年上…

2026/10/12 5:43:21 阅读更多 →
本地化企业知识库方案拆解:8 步把文档变成知识库

本地化企业知识库方案拆解:8 步把文档变成知识库

## 背景在项目复盘场景里,企业文档散落各处、找人问半天是效率的主要损耗点。## 核心能力- 全程本地运行,原始文档与知识数据不出电脑- 8 步流水线自动化:解析→结构化→质检→复核→分片→向量库→验收- 内置本地大模型,离线推理…

2026/10/12 5:43:21 阅读更多 →
81 极物科技 | KNX调试 - 个体地址过滤与报文隔离

81 极物科技 | KNX调试 - 个体地址过滤与报文隔离

极物科技 | KNX调试 - 个体地址过滤与报文隔离 前言 工程品质是 KNX 国际标准三十年立足全球的根基,而可观测性是品质的前提。 报文追踪把“看不见的总线”变成“看得见的证据”:每一次收发都有记录、每一次异常都有据可查。本文围绕报文追踪的接收链路、…

2026/10/12 5:43:21 阅读更多 →
百万级缺陷样本开源:工业视觉的「地基」被补上了

百万级缺陷样本开源:工业视觉的「地基」被补上了

1.工业质检的两道坎 ▍坎一:数据各管各的现成的工业缺陷数据集,几乎都窝在单一行当里。VisA、3CAD 盯着 3C 电子,PKU-GoodsAD 盯着包装,Real-IAD、MulSen-AD 盯着材料。覆盖面稍宽些的 VISION、MVTec AD、MMAD,又卡在…

2026/10/12 5:42:21 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →