Makefile学习笔记

  • Makefile文件定义了一系列规则指定文件的编译操作,可以实现“自动化编译”,使得只需要一个make命令就能实现整个工程的编译。

Makefile文件命名及规则

  • 文件命名:makefile或者Makefile

  • Makefile规则

    • 一个Makefile文件可以有一个或者多个规则:
      目标 ...: 依赖 ...
      命令(Shell 命令)
      ...
      • 目标:最终要生成的文件(伪目标除外)
      • 依赖:生成目标所需要的文件或者目标
      • 命令:通过执行命令对依赖操作生成目标(命令前必须有Tab缩进)
    • Makefile中的其他规则一般都是为第一个规则服务的

工作原理

  • 命令在执行前,需要先检查规则中的依赖是否存在

    • 如果存在,执行命令
    • 如果不存在,向下检查其他规则是否有规则是用来生成依赖的,若找到就执行该规则中的命令。
  • 检测更新,在执行规则中的命令时,会比较目标和依赖文件的时间

    • 如果依赖的时间比目标的时间晚,需要重新生成目标
    • 如果依赖的时间比目标的时间早,目标不需要更新,对应规则中的命令不需要被执行

变量

  • 自定义变量
    变量名=变量值 var=hello $(var)
  • 预定义变量
    AR : 归档维护程序的名称,默认值为 ar
    CC : C 编译器的名称,默认值为 cc
    CXX : C++ 编译器的名称,默认值为 g++
    $@ : 目标的完整名称
    $< : 第一个依赖文件的名称
    $^ : 所有的依赖文件
  • 获取变量的值
    $(变量名)
  • 使用例子:
    app:main.c a.c b.c
      gcc -c main.c a.c b.c
    #自动变量只能在规则的命令中使用
    app:main.c a.c b.c
      $(CC) -c $^ -o $@
    

模式匹配

%.o:%.c

  • %:通配符,匹配一个字符串
  • 一个规则中的%匹配的是同一个字符串

%.o:%.c
gcc -c $< -o $@

函数

  • $(wildcard PATTERN...)

    • 功能:获取指定目录下指定类型的文件列表
    • 参数:PATTERN 指的是某个或多个目录下的对应的某种类型的文件,如果有多个目录,一般使用空格间隔
    • 返回:得到的若干个文件的文件列表,文件名之间使用空格间隔
    • 示例:
      $(wildcard *.c ./sub/*.c)
      返回值格式: a.c b.c c.c d.c e.c f.c
  • $(patsubst <pattern>,<replacement>,<text>)

    • 功能:查找<text>中的单词(单词以“空格”、“Tab”或“回车”“换行”分隔)是否符合模式<pattern>,如果匹配的话,则以<replacement>替换。
    • <pattern>可以包括通配符%,表示任意长度的字串。如果<replacement>中也包含%,那么,<replacement>中的这个%将是<pattern>中的那个%所代表的字串。(可以用\来转义,以\%来表示真实含义的%字符)
    • 返回:函数返回被替换过后的字符串
    • 示例:
      $(patsubst %.c, %.o, x.c bar.c)
      返回值格式: x.o bar.o
posted @   浮生的刹那  阅读(29)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
点击右上角即可分享
微信分享提示