当前位置: 首页 > news >正文

Makefile精读 · M01-02 | make 如何找到并执行 Makefile:`-f` `-C` 与默认文件名

模块:M01 心智模型与 make 入口
篇号:M01-02 / 41
预计阅读:30 分钟
主线:GNU Make


文章目录

    • 本篇目标
    • 30 秒速览
    • 正文
      • 1. 默认找谁:三种文件名,顺序固定
      • 2. `-f`:我指定读这份
      • 3. `-C`:先换目录,再找 Makefile
      • 4. 工作目录决定相对路径落在哪
      • 5. 多目录仓库:如何快速锁定「入口」
      • 6. 对照表:本篇选项与概念
    • 读 Makefile 检查清单
    • 练习
      • 判断题(对 / 错)
      • 改错题
      • 动手题
    • 下一篇预告

本篇目标

搞清一件「看似简单、工程里却常踩坑」的事:你敲下make时,程序到底读了哪一份文件、在哪个目录当工作目录。掌握默认文件名顺序、-f-C,以及它们如何组合。学完本篇,你在多目录仓库根目录执行make,能立刻定位真正的入口 Makefile,而不是「为什么改了文件却没生效」。


30 秒速览

  • 未指定-f时,GNU Make 在当前工作目录按顺序找:GNUmakefilemakefileMakefile,用第一个找到的
  • -f FILE:显式指定读哪份文件;可写相对/绝对路径,可指定多次(少见)。
  • -C DIR(或--directory=DIR):先chdirDIR,再按上面规则找 Makefile(或再配合-f)。
  • 配方里的相对路径、生成文件落点,都相对make 进程的工作目录(受-C影响),不是「Makefile 文件所在目录」的魔法自动切换——除非你用-C或配方里自己cd
  • 读大型工程:先确认文档要求你在哪一级目录执行,再用make -p/ 看仓库根是否有入口Makefile

正文

1. 默认找谁:三种文件名,顺序固定

在某个目录执行裸命令:

$make

GNU Make不会全盘搜索仓库,只在当前工作目录查找,顺序为:

优先级文件名常见用途
1GNUmakefile明确只给 GNU Make 用(其它 make 通常不认这个名)
2makefile全小写;部分项目偏好
3Makefile最常见;许多风格指南推荐这个

规则:

  • 找到第一个存在的文件就用它,不会把三个都读一遍再合并。
  • 若三个都不存在,报错类似:make: *** No targets specified and no makefile found. Stop.(具体文案随版本略有差异)。

实践建议(本专栏约定)

  • 自己写工程时,优先用Makefile(首字母大写),和多数开源 C/C++ 项目一致。
  • 只有在「必须排除非 GNU make」时才考虑GNUmakefile
  • 避免在同一目录同时放makefileMakefile——在大小写不敏感的文件系统(如默认的 macOS)上极易混淆。

对照实验(在空目录):

$echo'all:; @echo from-Makefile'>Makefile $makefrom-Makefile $echo'all:; @echo from-gnu'>GNUmakefile $makefrom-gnu

一旦出现GNUmakefile,同目录的Makefile会被盖过。这是读他人项目时的高频坑:你改了Makefile,实际生效的却是GNUmakefile


2.-f:我指定读这份

make-fpath/to/rules.mkmake-fbuild/Makefile

含义:

  • 不要再按默认三文件名去猜(对该次指定而言,以-f为准)。
  • path/to/rules.mk可以是任意名字:rules.mkproject.makeAndroid.mk(仅作文件名举例)都行。
  • 路径是相对当前工作目录解析的(若同时用了-C,见下一节)。

常见场景:

场景示例
一份文件多种构建配置make -f Makefile.debug
子目录里的片段当入口试跑make -f src/module/rules.mk
文档明确写了非默认名make -f GNUmakefile.custom

也可以写成:

make--file=Makefilemake--makefile=Makefile

-f等价。

读文档检查点:若 README 写的是make -f ...,不要省略-f直接make——你可能读到另一份默认文件,行为完全不同。


3.-C:先换目录,再找 Makefile

make-Csubdirmake--directory=subdir

等价于:make 先切换到subdir,再在该目录按默认名(或你再给的-f)读取并构建。

示意:

你在: /home/you/proj 执行: make -C build make 的工作目录变成: /home/you/proj/build 然后在 build/ 下找 GNUmakefile / makefile / Makefile

组合:

# 进入 build/,并明确读该目录下的 rules.mkmake-Cbuild-frules.mk# 进入 build/,用绝对路径指定文件(少见,但合法)make-Cbuild-f/home/you/proj/top.mk

为何工程里大量用-C

  • 顶层Makefile常写:$(MAKE) -C src去构建子树(递归 Make,M08-02 详讲)。
  • 你在仓库根目录,却想只构建某个子项目:make -C tools/foo

与「自己 cd 再 make」对照

cdbuild&&make# 大致相当于make-Cbuild

差别在于:-C由 make 自己切换目录,且可以和其它选项干净组合;脚本里更不容易写错「cd 之后忘了回来」。


4. 工作目录决定相对路径落在哪

这是本篇最容易忽略的一点。

假设仓库布局:

proj/ Makefile # 入口 src/hello.c build/ # 希望产物放这里

Makefileproj/,且你在proj/执行make,配方里写:

build/hello: src/hello.c gcc -o build/hello src/hello.c

这里的src/hello.cbuild/hello都相对proj/(当前工作目录)。

若有人习惯:

cdsrcmake-f../Makefile

则工作目录是src/,同一份 Makefile 里的相对路径src/hello.c会变成去找src/src/hello.c——路径全错
此时更稳妥的是:

make-C..-fMakefile# 或在 proj/ 下直接make

经验法则:

做法工作目录相对路径相对于
在含 Makefile 的目录执行make该目录该目录
make -C DIRDIRDIR
make -f other/dir/Makefile(无-C你仍在的当前目录当前目录,不是 Makefile 所在目录

第三行尤其重要:-f只指定读哪个文件,默认不改变工作目录。


5. 多目录仓库:如何快速锁定「入口」

读陌生项目时,建议按这个顺序:

  1. 看文档:README / 构建说明要求在哪一级目录执行?是否写了-f/-C
  2. 看仓库根:有没有Makefile/GNUmakefile?打开看默认目标是什么(M01-03),有没有include子文件或$(MAKE) -C ...
  3. 用搜索辅助,但别盲信文件名:很多*/Makefile是子目录片段,不是你该直接make的入口。
  4. 验证:在文档指定的目录执行make -n(只打印将执行的命令,不真正跑;M01-04 / M09 还会用到),看路径是否合理。

可选自检命令(在你认为的入口目录):

# 看 make 认为自己在读什么(调试输出里会提到 Reading makefiles...)make-d2>&1|head-n40

更干净的做法是看内置变量(M03 会系统讲变量;这里先作工具用):

make-p-f/dev/null2>/dev/null|head-n5# 仅演示 -p;日常更常用下面方式

日常推荐在入口目录:

make-n

若输出的命令路径明显「高一层 / 低一层」,说明工作目录或入口选错了。


6. 对照表:本篇选项与概念

作用
GNUmakefile默认查找优先级最高
makefile其次
Makefile再次;本专栏推荐自用名
-f FILE/--file显式指定 Makefile;不改工作目录
-C DIR/--directory先进入DIR再构建
工作目录解析相对路径、默认找文件名所在的「当前目录」
入口 Makefile文档或仓库根约定的、你应该启动的那一份

常见组合记忆:

make# 当前目录 + 默认文件名make-frules.mk# 当前目录 + 指定文件make-Cbuild# build/ + 默认文件名make-Cbuild-frules.mk

读 Makefile 检查清单

接到一个「去跑一下构建」的任务时:

  • 文档要求的工作目录是哪一级?你现在是否在那一级?
  • 该目录下是否同时存在GNUmakefileMakefile?若是,默认生效的是前者
  • 命令是否带-f/-C?两者含义是否分清(指定文件 vs 换目录)
  • 你改的那份文件,是不是 make实际读取的那份?
  • 配方里的相对路径,是相对「当前工作目录」,还是有人误以为相对「Makefile 所在目录」?

练习

判断题(对 / 错)

  1. 同一目录下若同时有GNUmakefileMakefile,GNU Make 默认会合并二者再执行。
  2. make -f build/Makefile会自动把工作目录改成build/
  3. make -C build会先进入build/,再按默认文件名查找。
  4. 本专栏推荐日常新建工程使用文件名Makefile
参考答案
  1. 错。只用第一个找到的;顺序是GNUmakefilemakefileMakefile
  2. 错。-f不改变工作目录;相对路径仍相对你执行命令时所在目录。
  3. 对。
  4. 对。

改错题

某仓库结构如下:

proj/ Makefile # 内含:hello: src/hello.c 与配方 gcc -o hello src/hello.c src/hello.c

同事在proj/src/下执行:

make-f../Makefile

结果找不到src/hello.c。为什么?如何改命令更合理?

参考答案

原因:-f ../Makefile只指定读上层文件,工作目录仍是proj/src/,于是去打开proj/src/src/hello.c

更合理:

cd/path/to/projmake# 或在任意处make-C/path/to/proj

动手题

  1. 在临时目录创建Makefile,再创建GNUmakefile,确认make打印的是后者规则。
  2. make -C ...在上一级目录触发子目录构建,观察生成文件出现在哪。
  3. 故意使用make -f sub/Makefile(不-C),体会相对路径错位。

下一篇预告

M01-03:《默认目标、.PHONYall/clean约定》— 不带目标名时 make 构建谁、为何clean必须做成伪目标、以及社区常见的all/install/test命名习惯。学完 M01-03,你读入口 Makefile 时能第一眼抓住「默认构建什么、清理什么」。

http://www.jsqmd.com/news/1214371/

相关文章:

  • 如何识别企业真实有效的技术需求?
  • 2026年郑州屋顶防水翻新施工值得推荐的品牌有哪些:洛达森建材防水专业靠谱 - GrowUME
  • 弱网测试方案:衰减器如何模拟真实环境的信号衰减?
  • 2026年实测靠谱个体户店铺手续代办机构TOP5推荐
  • 2026洛阳防水补漏实测推荐|楼顶/屋面/卫生间/外墙/地下室防水堵漏、免砸砖维修、阳台飘窗漏水修复口碑榜全维度测评(7月洛阳深度测评) - 吉林同城获客
  • 一个人、一个App、700万营收:AI时代的小生意开始成立了
  • 2026无锡黄金回收正规商家名录:持证经营,坚决拒绝暗箱操作 - 商业信息快查
  • Windows系统文件dnsext.dll丢失找不到问题解决
  • 上海亨得利钟表官方售后服务中心地址|2026年7月恒隆广场/港汇恒隆官方地址全公开|全国统一服务电话400-901-0695权威发布 - 亨得利腕表维修中心
  • Allegro批量查看走线长度
  • 线上死锁解决方法
  • 佛山连锁奢侈品回收优势:告别街边小店,鉴定透明、打款更快更靠谱 - 全城热点
  • 暑假带娃去哪?李良济沉浸式中医药亲子研学,边玩边学国粹文化
  • 2026实测豆包视频去水印方法,豆包能否去除视频水印及合法方式汇总
  • 5个实用Python开源项目解析与应用指南
  • 色素碳黑在发泡海绵(海波丽)鞋材中的应用:性能提升与工艺优化全解析
  • C# LINQ 从入门到精通——用 SQL 一样的语法操作集合,Where、Select、GroupBy 带你告别 foreach 地狱
  • 秀英区伯爵金饰回收实测,连锁门店盘点,逸程全海口四区可预约上门 - 全城热点
  • 2026上海杨浦五角场黄金回收避坑经验,本地连锁大品牌无套路报价,免费上门收金当场转账 - 一日一测评
  • Java实现列车时刻表数据处理:从时间格式化到业务逻辑完整实战
  • 八字排盘命理软件推荐:2026最新先看退出与迁移成本
  • AutoMQ x 阿里云 OSS Tables:基于 Iceberg 构建流表一体的实时入湖
  • 2026年UV油墨丨UV水晶标签打印机丨UV 打印机丨UV DTF水晶标签打印机厂家排名 高口碑实力品牌行业参考指南 - 变量人生001
  • 济南哪家民办中专学校比较不错
  • 跨国多云架构设计:如何优雅搞定 AWS / 阿里云 / 腾讯云国际站的多云治理与 FinOps 实践
  • 强力磁铁高吸力耐用 工业通用强磁 源头厂家定制 - 优企甄选
  • 2026西安闲置大牌包包出售怎么避坑?易奢福正规回收全方位解析 - 易奢福
  • AI Agent自动化代码安全扫描与智能修复实践指南
  • 北海黄金贵金属回收指南:六家靠谱店铺全区域覆盖推荐 - 清奢黄金上门回收
  • 从轨迹复现到通用智能:解析特斯拉Optimus与宇树机器人的技术路线差异