Linux 开发工具(四) 熟悉自动化构建 make/Makefile
目录一. make/makefile 的概念1.1 Makefile的基本语法1.2 代码示例二. make/makefile 的使用2.1 文件的清理2.2 make 的使用细节2.2.1 make/make【目标名】2.2.2 make 的执行规则2.2.2.1 stat2.3 makefile 的使用细节2.3.1 .PHONY2.3.2 makefile 的依赖关系推导三. make/makefile的进阶使用3.1 变量的定义和使用3.1.1 变量实现代码的编译3.1.2 特殊变量 $ $^3.2 多文件情况3.2.1 版本13.2.2 版本2一. make/makefile 的概念make是 Linux 中的一个自动化构建工具主要用于自动执行编译、链接等操作。你可以把它理解为帮我们自动调用 gcc/g不用每次手动输入一大堆编译命令。makefile是一个描述构建规则的文件告诉 make哪些文件需要生成生成文件需要依赖哪些文件应该执行什么命令。1.1 Makefile的基本语法目标文件: 依赖文件1 依赖文件2 ...依赖列表可为空 依赖方法1 依赖方法2 ...myproc: myproc.cpp g myproc.cpp -o myproc myproc → 目标文件最终要生成的文件 myproc.cpp → 依赖文件生成目标所需要的文件 : → 依赖关系表示 myproc 依赖 myproc.cpp g ... → 依赖方法告诉 make 如何生成目标文件1.2 代码示例# 使用相对路径 bin/myproc: src/myproc.cpp mkdir -p bin g -o bin/myproc src/myproc.cpp # 也可以使用绝对路径 # /home/lzx/myproc: /home/lzx/code/myproc.cpp # g -o /home/lzx/myproc /home/lzx/code/myproc.cpp# 默认读取当前目录中的 Makefile make # -f指定 Makefile 文件路径不切换工作目录 make -f /home/lzx/project/Makefile # -C指定工作目录切换目录后执行 make make -C /home/lzx/project # -C 和 -f 组合使用 make -C /home/lzx/project -f Makefile二. make/makefile 的使用2.1 文件的清理当我们完成编译想要清除编译好的可执行文件时可以在makefile输入以下指令2.2 make 的使用细节2.2.1 make/make【目标名】make默认选择 Makefile 中的第一个目标进行构建但我们也可以通过make【目标名】指定其他目标。#Makefile myproc: myproc.cpp g myproc.cpp -o myproc test: test.cpp g test.cpp -o test hello: hello.cpp g hello.cpp -o hellomake # 默认构建第一个目标 myproc make test # 指定构建 test make hello # 指定构建 hello2.2.2 make 的执行规则make也并不是一定会对目标进行构建为什么呢因为 make的作用不仅是执行编译命令还会根据目标文件和依赖文件的时间戳判断是否需要重新构建。myproc: myproc.cpp g myproc.cpp -o myproc情况make 的行为myproc不存在执行命令生成目标文件myproc.cpp比myproc更新重新编译更新目标文件myproc已存在且比myproc.cpp更新不重新编译认为目标已经是最新的2.2.2.1 stat我们之前提到 make 会根据目标文件和依赖文件的时间戳来判断是否构建指令stat可以让我们更直观的理解。stat是 Linux 中用于查看文件或目录详细属性信息的命令。时间含义什么情况下会变化Accessatime最近一次访问文件内容的时间读取文件内容时时间可能更新Modifymtime文件内容最后修改的时间修改文件内容时更新Changectime文件状态最后变化的时间修改权限、所有者、硬链接数等信息时更新修改文件内容也会更新Birth文件创建时间表示文件创建的时间前提是文件系统支持记录make 正是基于目标文件、依赖文件的修改时间(Modify)来判断的。2.3 makefile 的使用细节2.3.1 .PHONY.PHONY 用于声明伪目标告诉make这个目标不是一个真正需要生成的文件而是一个需要执行的任务。我们在之前提到了make的执行规则要判断执行文件和目标文件的时间戳而.PHONY 的作用就是告诉 make指定的目标是伪目标不对应一个需要生成的实际文件因此不需要通过检查同名目标文件的时间戳来判断是否执行命令。2.3.2 makefile 的依赖关系推导make从上往下寻找目标的依赖关系找到最底层的依赖后再从下往上依次执行构建命令。#Makefile myproc: myproc.o gcc myproc.o -o myproc myproc.o: myproc.s gcc -c myproc.s -o myproc.o myproc.s: myproc.i gcc -S myproc.i -o myproc.s myproc.i: myproc.c gcc -E myproc.c -o myproc.i① 从上往下查找依赖入栈myproc ↓ myproc.o ↓ myproc.s ↓ myproc.i ↓ myproc.c源文件已存在② 从下往上构建目标出栈gcc -E myproc.c -o myproc.i # 预处理 gcc -S myproc.i -o myproc.s # 编译 gcc -c myproc.s -o myproc.o # 汇编 gcc myproc.o -o myproc # 链接三. make/makefile的进阶使用3.1 变量的定义和使用Makefile 中可以使用定义变量通过$(变量名)引用变量。我们会发现每行命令前面都有符号的作用主要是取消命令的回显如果不加结果如下3.1.1 变量实现代码的编译3.1.2 特殊变量 $ $^$和$^都是Makefile 中的自动变量用于简化构建命令。自动变量含义$当前规则的目标文件$^当前规则的所有依赖文件去重3.2 多文件情况3.2.1 版本1BIN myproc CC g OBJ myproc.o FLAGS -c # 1. 默认目标是 myproc依赖 myproc.o $(BIN): $(OBJ) $(CC) $^ -o $ # 2. % 是模式匹配符用于匹配文件名中的相同部分 # 例如make 需要生成 myproc.o # %.o → myproc.o此时 % 匹配到 myproc # %.cpp → myproc.cpp将 myproc 代入依赖文件名 # 因此推导出myproc.o 依赖 myproc.cpp %.o: %.cpp $(CC) $(FLAGS) $ -o $ # 3. $ 是自动变量表示当前规则的第一个依赖文件 # 这里 $ → myproc.cpp # 而 $ → myproc.o表示当前目标文件 # 所以上面的命令展开后为 # g -c myproc.cpp -o myproc.o%模式匹配符根据目标文件名匹配相同部分推导出依赖文件名。$自动变量表示当前规则的第一个依赖文件。$自动变量表示当前规则的目标文件。3.2.2 版本2# 1. 定义变量 BIN myproc # 最终生成的可执行文件 CC g # 编译器 SRC $(shell ls *.cpp) # 获取当前目录下所有 .cpp 文件 # SRC $(wildcard *.cpp) # 另一种写法更推荐 OBJ $(SRC:.cpp.o) # 将所有 .cpp 后缀替换为 .o LFLAGS -o # 指定输出文件名 FLAGS -c # 只编译生成 .o不链接 RM rm -f # 删除命令 # 2. 定义最终目标及其依赖关系 # $(BIN) → myproc # $(OBJ) → main.o add.o sub.o假设存在这三个源文件 # 表示 myproc 依赖这些 .o 文件 $(BIN): $(OBJ) $(CC) $^ $(LFLAGS) $ echo linking... $^ to $ # $^ → 所有依赖文件即 main.o add.o sub.o # $ → 当前目标文件即 myproc # 实际执行g main.o add.o sub.o -o myproc # 3. 定义模式规则分别生成 .o 文件 # % 是模式匹配符 # 需要生成 main.o 时% 匹配 main推导出 main.cpp # 需要生成 add.o 时% 匹配 add推导出 add.cpp # 每次匹配都对应一条独立的编译规则 %.o: %.cpp $(CC) $(FLAGS) $ echo compiling... $ to $ # $ → 当前规则的第一个依赖文件例如 main.cpp # $ → 当前规则的目标文件例如 main.o # 实际执行g -c main.cpp # 默认生成 main.o # 表示不回显命令本身1.$( )引用变量或调用函数引用变量$(CC)获取变量CC的值。调用函数例如$(wildcard *.cpp)。示例CC g那么$(CC)就会展开为g。2.wildcard使用 Makefile 自带的功能查找文件示例SRC $(wildcard *.cpp)。*.cpp表示匹配所有以.cpp结尾的文件。查找结果会赋值给变量SRC。按照make的工作目录查找而不是 Makefile 所在的目录。3.shell执行 Shell 命令并获取输出示例SRC $(shell ls *.cpp)。$(shell ...)会执行括号中的 Shell 命令并获取其标准输出。ls *.cpp用于列出匹配的.cpp文件结果赋值给SRC。同样以make的工作目录为基

相关新闻

OpenCode 双雄限时免费:GLM-5.3-Flash 与 DeepSeek V4.1 Flash 免登录白嫖

OpenCode 双雄限时免费:GLM-5.3-Flash 与 DeepSeek V4.1 Flash 免登录白嫖

OpenCode 双雄限时免费:GLM-5.3-Flash 与 DeepSeek V4.1 Flash 免登录白嫖一句话速览:2026 年 10 月 15–16 日,OpenCode 连续宣布 DeepSeek V4.1 Flash、GLM-5.3-Flash 两款开源旗舰限时免费,免登录、免密钥、安装即用。本文讲清…

2026/10/19 7:20:13 阅读更多 →
真机实验知识点汇总

真机实验知识点汇总

IPIP网络位主机位网络位---IP所在的网段(广播域)主机位---主机编号同一个广播域,使用相同的网络位,不同的主机位的IP地址不同广播域中,使用网络位不同的IP地址掩码32位二进制,连续的1和连续的0组成掩码和IP…

2026/10/19 7:20:13 阅读更多 →
模电前置知识

模电前置知识

一、基尔霍夫定律1、几个专有名词支路:电路中通过同一电流的分支结点:三条或三条以上支路的连接点称结点回路:由支路组成的闭合路径网孔:对平面电路,其内部不含任何支路的回路成网孔(网孔是回路&#xff0c…

2026/10/19 7:19:13 阅读更多 →

最新新闻

基础模型重塑广告竞价环境建模:Bid2X 解读

基础模型重塑广告竞价环境建模:Bid2X 解读

广告竞价这个领域,真正难的不是“怎么出价”,而是“出价之后到底会发生什么”。KDD25 这篇 Bid2X,标题里最抓人的就是“环境建模”这四个字——它把视角从策略本身拉远到了策略所处的整个动态拍卖市场。基础模型视角的引入,让环境…

2026/10/19 7:59:32 阅读更多 →
Linux下Gitee托管实战:从SSH配置到高频报错排查

Linux下Gitee托管实战:从SSH配置到高频报错排查

年前有个朋友从 Windows 桌面端切到 Linux 环境干活,第一天就差点把键盘拍碎——他在 Gitee 上建好了仓库,本地也写好代码了,结果对着那个黑底白字的终端窗口发了好一会儿呆,完全不知道该敲什么。后来他问我,Gitee 在 …

2026/10/19 7:59:32 阅读更多 →
LSTM财务因子选股:时间序列建模与A股非平稳数据实战

LSTM财务因子选股:时间序列建模与A股非平稳数据实战

简介:本资源是一套基于LSTM神经网络的财务因子选股预测模型完整实现,专为计算机、人工智能及财经交叉方向的本科生毕业设计与课程设计打造,面向AI、自动化、电子信息等专业学生及初入量化领域的学习者,解决金融时序数据建模与股票…

2026/10/19 7:59:32 阅读更多 →
室内墙面缺陷检测实战:VOC/YOLO双格式数据集与目标检测训练要点

室内墙面缺陷检测实战:VOC/YOLO双格式数据集与目标检测训练要点

做了几年计算机视觉相关的工作,我接过不少“看着简单、做起来抓狂”的项目,墙面缺陷检测就是其中一个。前段时间参与一个旧房翻新前评估的项目,需要统计室内墙面的剥落、污渍和滴痕分布,我一开始天真地想拿通用目标检测模型直接跑…

2026/10/19 7:59:32 阅读更多 →
MSP432+OpenMV寻迹小车控制方案:从寄存器到PID调优

MSP432+OpenMV寻迹小车控制方案:从寄存器到PID调优

简介:2022年电子设计竞赛C题江苏省赛区一等奖的完整工程资料,主控采用MSP432,适合电赛备赛学生、嵌入式开发者与机器视觉入门者参考。作品围绕主从双车寻迹与OpenMV视觉导航展开,包含主车图像处理、停止线识别、障碍物测距以及双车…

2026/10/19 7:59:32 阅读更多 →
U8G2 OLED中文显示全攻略:字体包安装与编译配置

U8G2 OLED中文显示全攻略:字体包安装与编译配置

简介:本资源是面向Arduino嵌入式开发者的U8G2中文字体定制工具包,专为解决OLED/SSD1306等小型显示屏在U8G2库中无法直接显示中文的痛点而设计。包内集成GUI字体生成工具GUITool及完整u8g2-master源码,支持用户自定义字库提取、BDF格式转换与C…

2026/10/19 7:58:32 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 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/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 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/19 2:54:50 阅读更多 →
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/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练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/18 12:16:16 阅读更多 →