千家信息网

makefile(01)_初识

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,0. 声明本系列(makefile)文章,从零基础开始,通过实验逐步分析makefile的语法特性,并最终打造一个可复用、可移植的专业编译环境。参考:1.DT 唐老师门徒计划课程2.GNU make
千家信息网最后更新 2026年11月03日makefile(01)_初识

0. 声明

本系列(makefile)文章,从零基础开始,通过实验逐步分析makefile的语法特性,并最终打造一个可复用、可移植的专业编译环境。
参考:
1.DT 唐老师门徒计划课程
2.GNU make 手册:http://www.gnu.org/software/make/manual/make.html

1.Make与makefile

  • Make是一个应用程序:接续源程序之间的依赖关系,根据依赖关系自动维护编译工作,执行宿主操作系统中的各种命令。
  • Makefile是一个描述文件:定义了系列的规则来指定源文件编译后的先后顺序,拥有特定的语法规则,支持函数定义和函数调用,能够直接集成操作系统的各种命令,本质上也是一种脚本。
    两者的联系:
  • Makefile中的描述用于指导make程序如何完成工作;
  • make根据Makefile中的规则执行命令,最后完成编译输出;
    简单示例:
hello:                          // 目标    echo "hello makefile"       // 实现目标要执行的命令,注意行首是一个table(\t)

make -f mf.txt hello // -f表示指定mf.txt文件为规则定义文件(Makefile),并执行文件里的hello目标

make // 执行默认规则定义文件(Makefile/makefile)中的默认目标(第一个目标)

2.Makefile结构

2.1.Makefile的意义:

Makefile 用于定义源文件和依赖关系,说明如何编译各个源文件并生成可执行文件
依赖的定义:

targets:prerequests; command1    Command2

2.2.Makefile中的元素含义:

targets // 通常是需要生成的目标文件名,make所需要执行的命令名称
prerequisite // 当前目标所依赖的其他目标或文件
command // 完成目标所需要的命令

2.3.注意事项:

  • 目标和依赖可以有多个,使用空格分隔
  • 每一个命令行必须以【tab】字符开始,用于高速make程序(解析器),此行时一个命令行
  • 续行符: \ 可以将内容分开写到下一行,提高可读性
  • Makefile中可以在命令前加上@符,作用为命令无回显(Makefile默认会打印执行的每一个条命令)
    技巧:
    开发中可以将可执行文件名和all 同时作为makefile中第一条规则的目标,这样,当执行make命令并且目标已经存在时,将不会继续执行(除非依赖文件有更新)

    2.4.依赖规则:

    当目标对应的文件不存在,执行对应命令
    当依赖在时间上比目标更新,执行对应命令
    当依赖关系发生时,对比依赖链上每一个目标

hello.out all : func.o main.o    gcc -o hello.out func.o main.ofunc.o : func.c    gcc -o func.o -c func.cmain.o : main.c    gcc -o main.o -c main.c

3.伪目标的引入

3.1.Makefile中的目标究竟是什么?

默认情况下,make认为目标对应着一个文件,make会比较文件和依赖关系的新旧关系,决定执行是否执行命令,make以文件处理作为第一优先级。
所以当出现和目标同名的文件时,则在文件不被更新的前提下,目标不会被执行

3.2.Makefile中的伪目标

通过PHONY关键字声明一个伪目标,伪目标不对应任何实际的文件,不管伪目标的依赖时否更新,命令总是执行。
伪目标的语法:先声明,后使用
本质:伪目标是make中特殊的目标:.PHONY的依赖

.PHONY : cleanclean :    rm *.o hello.out -rf 

3.3.伪目标的妙用:

规则调用,模拟C语言函数的概念。
原理:当一个目标的依赖包含伪目标时,伪目标所定义的命令总是会被执行。

.PHONY : rebuild clean allrebuild : clean allall : hello.outclean :    rm *.o hello.out  -rf 

3.4.绕开.PHONY关键字定义伪目标

原理:如果一个规则没有命令或者依赖,并且他的目标不是一个存在的文件名,在执行此规则是,目标总会被认为是最新的。

clean : FORCE    rm *.o hello.out -rf FORCE : 
目标 命令 文件 规则 编译 更新 函数 文件名 源文件 程序 语法 操作系统 关键 关键字 原理 本质 系统 工作 生成 一行 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技产业 科技互联网企业 互联网金融监管科技数据 互联网与科技金融数据 西安互联网科技 互联网科技革命 唐信互联网科技 汉立互联网科技有限公司联系电话 互联网科技公司需要的职位 昭通云南众福互联网科技有限公司 互联网科技创新服务 昊天互联网科技有限公司 辽宁互联网新科技 呼和浩特新华互联网科技学院 玉溪新华互联网科技好不好 山东子淼互联网科技有限公司 伍佰万互联网科技怎么赚钱 北京互联网科技类企业分布 美国五大互联网科技公司市值多少 上海旺乐尼互联网科技有限公司 耶加雪菲 美国互联网科技巨头监管 极限挑战互联网科技 深圳市运趣互联网科技有限公司 互联网还是高科技吗 互联网科技年终奖 陕西云淼互联网科技公司 云鲸互联网络科技有限公司 唐山双旺合互联网科技产业园 如何强化互联网金融科技
0