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

Makefile 详解

文章目录

    • 1.什么是Makefile
    • 2.Makefile文件命名规则
    • 3.编写Makefile
    • 4.Makefile 的工作原理
    • 5.Makefile中的变量
    • 6.模式匹配
    • 7.函数


1.什么是Makefile

  • 一个工程中的源文件不计其数,按期类型、功能、模块分别放在若干个文件中,MakeFile文件定义了一系列的规则来制定哪些文件需先要编译、哪些文案需要后编译、哪些文件需要重新编译、甚至于进行更加复杂的操作,因为Makefile文件就像是一个shell脚本一样,也可以执行操作系统的命令

  • Makefile 带来的好处就是 自动化编译,一旦写好,只需要一个make命令,整个工程完全自动化编译,极大提高了软件开发效率,make是一个命令工具,是一个解释Makefile文件中指令的命令工具,一般来说,大多数的IDE都有这个命令,例如Delphi的make、Visual C++的nmaek、Linux下Gun的make。

2.Makefile文件命名规则

  • 文件命名:Makefile或者makefile
  • makefile规则
    • 一个Makefile文件中可以有一个或者多个命名规则
      目标… : 依赖 …
      命令(shell命令)
      • 目标:最终要生成的文件
      • 依赖:生成目标所需要的文件或者目标
      • 命令:通过执行命令对依赖金慈宁宫操作从而生成目标(命令前必须tab缩进)
  • Makefile中的其他规则一般都是为第一条规则服务的

3.编写Makefile

  1. 创建Makefile文件
vim Makefile
  • 编辑Makefile文件,行其中编写编译命令
app:add.cpp div.cpp mutil.cpp subtract.cpp
        gcc -lstdc++  add.cpp div.cpp mutil.cpp subtract.cpp main.cpp  -o app

在这里插入图片描述

  • 执行编译后的程序
    在这里插入图片描述

4.Makefile 的工作原理

  • 执行命令之前需先检查规则中的依赖是否存在
    • 如果存在,执行命令
    • 如果不存在,向下检查其他规则,检查有没有一个规则是用来生成这个依赖的,如果找到了则执行改规则中的命令
  • 检测更新
    • 如果依赖的时间比目标的时间晚,则需要重新生成目标
    • 如果依赖的时间比目标的时间早,目标不需要更新,对应规则中的目标不需要执行。

在这里插入图片描述
Makefile

app:add.o div.o mutil.o subtract.o main.o
        gcc -lstdc++  add.o div.o mutil.o subtract.o main.o  -o app

add.o:add.cpp
        gcc -c add.cpp -o add.o
div.o:div.cpp
        gcc -c div.cpp -o div.o
mutil.o:mutil.cpp
        gcc -c mutil.cpp -o mutil.o
subtract.o:subtract.cpp
        gcc -c subtract.cpp -o subtract.o
main.o:main.cpp
        gcc -c main.cpp -o main.o

5.Makefile中的变量

  • 自定义变量
    变量名 = 变量值 var = hello 获取变量:$var

  • 预定义变量
    AR:归档维护程序的名称,默认为ar
    CC:c编译器的名称,morenwcc
    CXX:C++b编译器的名称,默认为g++
    $@:目标的完整名称
    $<:第一个依赖文件的名称
    $^:所有依赖文件

  • 获取变量的值
    $()变量名
    自动变量只能在规则的命令中使用

app:main.c  a.c  b.c
	$(CC) -c $^ -o  $@

示例:

#定义变量
src=add.o div.o mutil.o subtract.o main.o
target=app
$(target):$(src)
        $(CC) -lstdc++ $(src) -o $(target)

add.o:add.cpp
        gcc -c add.cpp -o add.o

div.o:div.cpp
        gcc -c div.cpp -o div.o
mutil.o:mutil.cpp
        gcc -c mutil.cpp -o mutil.o
subtract.o:subtract.cpp
        gcc -c subtract.cpp -o subtract.o
main.o:main.cpp
        gcc -c main.cpp -o main.o

6.模式匹配

%.o:%.c
%:通配符,匹配一个字符串
两个%之间匹配的是同一个字符串

在这里插入图片描述

#定义变量
src=add.o div.o mutil.o subtract.o main.o
target=app
$(target):$(src)
        $(CC) -lstdc++ $(src) -o $(target)

#通配指令
%.o:%.c
        $(CC) -c $< -o $@

7.函数

  • $(wildcard PATTERN…)

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

    • 功能:查找 中的单词(单词以“空格”、“Tab”、或者“回车”、“换行”分割)是否符合模式,如果匹配的话,用进行替换
    • 可以包括通配“%”,标识任意长度的字符串,如果 中也包含“%”,那么 中的“%”就是中的“%”所代表的的字符串
    • 返回:函数返回被替换过的字符串
      $(patsubst %.c, %.o,x.c bar.c)
      返回格式:x.o bar.o
      在这里插入图片描述

相关文章:

  • 赣州做网站公司哪家好/百度第三季度财报2022
  • 网站首页百度收录怎么做/视频号的网站链接
  • 合肥网站建设平台/网络推广的主要内容
  • 大连模板网站制作哪家专业/百度seo排名教程
  • 凡科论坛网站制作/适合口碑营销的产品
  • 公安网站备案变更主体要关站么/各城市首轮感染高峰期预测
  • [1007]魔法少女小Scarlet
  • 点击试剂Methyltetrazine-PEG4-NHS ester,甲基四嗪-PEG4-琥珀酰亚胺酯,CAS:1802907-9
  • 【设计模式】设计模式
  • 详解C语言二级指针三种内存模型
  • python自学入门(打卡十二)2022-12-04
  • LTspice XVII > Transformer 变压器仿真
  • 17-JavaSE基础巩固练习:Math类API两道数学算法水题
  • [附源码]JAVA毕业设计课程答疑系统(系统+LW)
  • 7 8051 C51 使用_getkey对scanf输入重定向,实现标准输入输出,getchar
  • 逻辑回归模型和Python代码实现
  • Web 性能测试
  • 关于小程序session_key漏洞问题的解决2022-12-01