Makefile学习笔记

发布时间:2022-06-20 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了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

脚本宝典总结

以上是脚本宝典为你收集整理的Makefile学习笔记全部内容,希望文章能够帮你解决Makefile学习笔记所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。