编写Makefile

简介: 编写Makefile

C++程序员必会知识


什么是makefile??

  • 一个工程中的源文件不计其数,其按类型,功能,模块分别放在若干个目录中。
  • Makefile文件定义了一系列的规则来指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为Makefile文件镜像一个shell脚本一样,也可以执行操作系统的命令。
  • Makefile带来的好处就是"自动化编译",一旦写好只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
  • make是一个命令工具,是一个解释Makefile文件中指令的工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make  vc++的nmake  Linux的GNU的make

下载安装make

sudo apt install make

makefile文件命名规则

  • makefile
  • Makefile

makefile的规则

规则中的三要素:目标、依赖、命令

  • 目标:最终要生成的文件(伪目标除外   .PHONY:目标名)
  • 依赖:生成目标所需要的文件或目标
  • 命令:通过执行命令对所依赖文件操作生成目标(命令前必须Tab缩进)

格式

       目标:依赖文件

               命令

使用

       make

编写一个简单的Makefile

案例1:

案例2:

注1:如果说下面的规则与终极规则没有关系,默认是不会执行的

注2:案例1和案例2相比,当某一个 .c 文件发生了改变,案例1所有的 .c文件都要重新编译

Makefile的工作原理

  • 命令执行之前,需要检查规则中的依赖是否存在
  1. 如果存在,执行命令
  2. 如果不存在,向下检查其它的规则(规则由目标、依赖、命令组成),检查有没有一个规则是用来生成这个依赖的,如果有,则执行该规则中的命令
  •  检查更新,在执行规则中的命令时,会比较目标文件和依赖文件的时间
  1. 如果依赖文件的时间比目标文件的时间晚,需要重新生成目标
  2. 如果依赖文件的时间比目标文件的时间早,目标不需要更新,规则中的命令不被执行
  • 关系依赖树

  • 执行流程图

  • 更新流程图(有一个依赖文件保存时间比目标的后面,就执行命令进行目标更新)

Makefile中的变量

  • 自定义变量
  1. 变量名 = 变量值
  • 预定义变量(只能在命令中使用)      
AR 归档维护程序的名称,默认值为 ar(做静态库的时候用到了这个工具吧)
CC C编译器的名称,默认值为cc  (gcc)
CXX c++编译器的名称,默认为g++
@ 目标的完整名称
< 第一个依赖文件按的名称
^ 所有的依赖文件
  • 获取变量的值
  1. $(变量名)
  • 事例
app:main.c a.c b.c
    gcc main.c a.c b.c -o app
等价
app:main.c a.c b.c
    gcc $^ -o $@

   

  •  模式匹配
  1. %.o:%.c
  2. %:通配符,匹配一个字符串,两个%匹配的是同一个字符串

Makefile中的函数

$(wildcard PATTERN...)

  • 功能:获取指定目录下指定参数的文件列表
  • 参数:PATTERN指的是某个或多个目录下的对应的某种类型的文件,如果有多个目录,一般使用空格隔开
  • 返回:得到的若干个文件的文件列表,文件名直接使用空格隔开
  • 示例:$(wildcard  ../library/*.c ./*c)

$(patsubst <pattern>,<replacement>,<text>)

  • 功能:查找<text>中的单词,是否符合pattern,如果匹配的话,则以<replacement>中的%将是<pattern>中的%
  • 返回:函数返回被替换之后的字符串
  • 示例:$(patsubst %.c,%.o,x.c b.c)

其它(清除不必要的临时文件)

声明伪目标   .PHONY:目标名

make 目标   ==》执行目标文件中特定的目标所对应的命令

相关文章
|
JavaScript
Vue 父传子组件传参 defineProps
Vue 父传子组件传参 defineProps
194 0
二叉树查找值为x的结点、树的高度、第k层结点个数的代码实现
二叉树查找值为x的结点、树的高度、第k层结点个数的代码实现
|
开发者
WinRAR 5.40 & 4.20 & 3.93 的注册码 - rarreg.key
把下面的数据复制到“记事本”中,用文件名“rarreg.key”命名该文件,保存到WinRAR安装文件夹即完成注册。以下4个Key随便选一个复制都可以。WinRAR 5.40 版Key,复制箭头中间内容,上下无空格。
14961 1
|
11月前
|
Web App开发 数据采集 JavaScript
CDP与Selenium相结合——玩转网页端自动化数据采集/爬取程序
本文介绍了Selenium、Chrome DevTools及Chrome DevTools Protocol (CDP) 的基本功能与应用。Selenium是一款开源自动化测试工具,适用于网页端应用程序测试和数据采集,具备跨平台特性。Chrome DevTools内置浏览器中,提供调试、分析Web应用程序的功能,包括元素、控制台、源代码和网络选项卡等。CDP是一套用于与Chromium内核浏览器通信的API,支持自动化测试和性能分析。文中还展示了Selenium与CDP结合使用的示例,如捕获网络请求数据和打印网页内容,并推荐了相关书籍和资源以供深入学习。
1413 39
CDP与Selenium相结合——玩转网页端自动化数据采集/爬取程序
|
设计模式 开发者 Python
Python中循环依赖问题及其解决方案
循环依赖是 Python 开发中需要特别注意的问题。通过重新设计模块结构、延迟导入、依赖注入、利用 Python 的动态特性以及代码重构等方法,可以有效地解决循环依赖问题。这些策略不仅有助于提高代码的可维护性和可读性,还能避免潜在的运行时错误。在实际开发中,开发者应该根据具体情况选择合适的解决方案。
|
11月前
|
缓存 Java 调度
多线程编程核心:上下文切换深度解析
在现代计算机系统中,多线程编程已成为提高程序性能和响应速度的关键技术。然而,多线程编程中一个不可避免的概念就是上下文切换(Context Switching)。本文将深入探讨上下文切换的概念、原因、影响以及优化策略,帮助你在工作和学习中深入理解这一技术干货。
278 10
|
8月前
|
供应链 算法 数据挖掘
课时14:工业大脑介绍
阿里云ET工业大脑以数据为驱动,融合算法模型和互联网技术,优化工业生产全流程。它通过数据分析、参数调节、故障预测、智能质检和供应链管理等手段,提升产品质量、生产效率及资源利用率,助力企业实现智能化转型,推动绿色工厂建设,成功应用于光伏、橡胶等行业,显著提高经济效益与环保水平。
254 0
|
JavaScript
ThreeJs通过DragControls实现物体拖动
这篇文章详细讲解了如何在Three.js中使用DragControls实现3D物体的鼠标拖动功能。
516 1
ThreeJs通过DragControls实现物体拖动
|
监控 JavaScript 安全
《VitePress 简易速速上手小册》第5章:社交媒体和网络互动(2024 最新版)
《VitePress 简易速速上手小册》第5章:社交媒体和网络互动(2024 最新版)
435 1
|
SQL Java HIVE
常用的Prestosql
常用的Prestosql
337 0