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

【Makefile/GNU Make】知识总结

文章目录

  • 1. 总体认识
  • 2. 编写Makefile
    • 2.1. Makefile的组成
    • 2.2. Makefile文件名
    • 2.3. 包含其他Makefile
  • 3. 编写规则
  • 4. 编写规则中的构建命令
  • 5. 如何使用变量
  • 6. 条件判断
  • 7. 转换文本的函数
  • 8. 如何运行make
  • 9. 使用模糊规则
  • 10. 使用make来更新存档文件
  • 11. 扩展GNU make
  • 12. 集成GNU make
  • 13. GNU make的特性
  • 14. 不兼容和缺少的特性
  • 15. makefile文件约定

1. 总体认识

  • GNU Make是一个命令工具,用于控制从源文件生成可执行文件和其他非源文件。使用前需要进行安装(以ubuntu为例):
    sudo apt install make
    
  • Make从Makefile中了解如何构建程序,该文件列出了每个非源文件及其构建方法,因此需要编写Makefile以供make命令构建项目。
  • GNU Make的具体用途
    • 能够使用户在不知道如何完成的情况下构建和安装包。
    • 能够根据更改的源文件,自动确定需要更新哪些文件
    • 不限于任何特定的语言,最常用于C/C++项目的构建。对于程序中的每个非源文件,Makefile指定用于构建它的shell命令。这些shell命令可以运行编译器来生成目标文件,可以运行链接器来生成可执行文件,可以更新库,也可以运行TeX或Makeinfo来格式化文档。
    • 不限于构建包。还能控制软件包的安装或卸载,为其生成标记表,或者执行经常做的任何任务。
  • 默认情况下,make命令只执行完遇到的第一条规则,包括递归执行生成先决条件的规则,其他的规则不执行。要执行其他规则,需要指定目标,比如make clean

2. 编写Makefile

2.1. Makefile的组成

Makefile包括明确的规则、模糊的规则、变量的定义、指令和注释。

  • 明确的规则(explicit rule)规定何时以及如何构建目标,其基本结构如下:
    targets ... : prerequisites ...recipe	# 注意Tab键开头...
    
    • 目标(targets):通常是生成的文件名,也可以是要执行的操作名(伪目标)。
    • 先决条件(prerequisites):是构建命令需要输入的所有文件,用空格隔开。
    • 构建方法(recipe):每行以Tab键开头,内容是构建目标文件的shell命令。
    • 如果先决条件比目标更新,或者目标不存在,那么会重新构建目标
  • 模糊的规则(implicit rule)规定了何时以及如何基于文件名重新构建一类文件。比如源文件编译成目标文件:
    main.o : defs.h
    
    不用写源文件名和编译命令。
  • 变量的定义(variable definition)指定了后续变量要替换的文本字符串值。
  • 指令(directive)用于读取Makefile时执行一些特殊的操作,包括
    • 读取另一个makefile文件
    • 基于变量的值决定使用还是忽略makefile的一部分
    • 定义多行变量(用一个变量替换多行命令)
  • 注释(comment)
    • #后面的内容忽略,如果有反斜杠折行则会跨行注释
    • 使用#字符要转义:\#
    • 不能在变量引用和函数调用中使用注释,#号都会当字面量处理。
    • 构建命令中的注释会传递给shell,shell决定如何处理。
    • define指令中注释不会被忽略,而是作为变量的值,根据变量展开时的上下文,被视为注释或构建命令文本。
  • 使用反斜杠\可以将长行折成多行。
  • 使用$\可以去掉多余的空格。

2.2. Makefile文件名

  • 默认情况下,make会尝试查找以下文件名:GNUmakefile、makefile和Makefile。推荐使用Makefile
  • 如果make没找到默认文件名,则需要通过命令参数-f--file=指定。
  • 如果使用多个-f--file=参数,则可以指定多个生成文件。所有的制作文件都按照指定的顺序有效地连接起来。
  • 如果指定-f--file=参数,默认文件名的makefile不会自动检查。

2.3. 包含其他Makefile

3. 编写规则

4. 编写规则中的构建命令

5. 如何使用变量

6. 条件判断

7. 转换文本的函数

8. 如何运行make

9. 使用模糊规则

10. 使用make来更新存档文件

11. 扩展GNU make

12. 集成GNU make

13. GNU make的特性

14. 不兼容和缺少的特性

15. makefile文件约定

相关文章:

【Makefile/GNU Make】知识总结

文章目录 1. 总体认识2. 编写Makefile2.1. Makefile的组成2.2. Makefile文件名2.3. 包含其他Makefile 3. 编写规则4. 编写规则中的构建命令5. 如何使用变量6. 条件判断7. 转换文本的函数8. 如何运行make9. 使用模糊规则10. 使用make来更新存档文件11. 扩展GNU make12. 集成GNU …...

腾讯云轻量服务器和云服务器CVM该怎么选?区别一览

腾讯云轻量服务器和云服务器CVM该怎么选?不差钱选云服务器CVM,追求性价比选择轻量应用服务器,轻量真优惠呀,活动 https://curl.qcloud.com/oRMoSucP 轻量应用服务器2核2G3M价格62元一年、2核2G4M价格118元一年,540元三…...

MySQL定时备份实现

一、备份数据库 –all-databases 备份所有数据库 /opt/mysqlcopy/all_$(date “%Y-%m-%d %H:%M:%S”).sql 备份地址 docker exec -it 容器名称 sh -c "mysqldump -u root -ppassword --all-databases > /opt/mysqlcopy/all_$(date "%Y-%m-%d %H:%M:%S").sq…...

Nginx 不同源Https请求Http 报strict-origin-when-cross-origin

原因: nginx代理配置url指向只开放了/* 而我/*/*多了一层路径 成功:...

openGauss学习笔记-175 openGauss 数据库运维-备份与恢复-导入数据-管理并发写入操作示例

文章目录 openGauss学习笔记-175 openGauss 数据库运维-备份与恢复-导入数据-管理并发写入操作示例175.1 相同表的INSERT和DELETE并发175.2 相同表的并发INSERT175.3 相同表的并发UPDATE175.4 数据导入和查询的并发 openGauss学习笔记-175 openGauss 数据库运维-备份与恢复-导入…...

pnpm、npm、yarn是什么?怎么选择?

pnpm、npm、yarn三者是前端常用的包管理器,那么他们有什么区别呢? 1. npm (Node Package Manager) npm是Node.js的默认包管理器。自Node.js发布以来,npm就一直作为它的一个组成部分存在,因此,安装Node.js时也会自动安…...

MySQL8 一键部署

#!/bin/bash ### 定义变量 mysql_download_urlhttps://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.33-linux-glibc2.12-x86_64.tar.xz mysql_package_namemysql-8.0.33-linux-glibc2.12-x86_64.tar.xz mysql_dec_namemysql-8.0.33-linux-glibc2.12-x86_64 mysql_download_…...

12 UVM Driver

目录 12.1 uvm_driver class hierarchy 12.2 How to write driver code? 12.3 UVM Driver example 12.4 How to get sequence items from the sequencer? 12.5 UVM driver methods 12.5.1 Using get_next_item/ try_next_item and item_done methods 12.5.2 Using get…...

“暂存”校验逻辑探讨

1、背景 在业务中可能会遇到这种场景,前端页面元素多且复杂,一次性填完提交耗时很长,中间中断面临着丢失数据的风险。针对这个问题,“暂存”应运而生。 那“暂存”的时候,是否需要对数据校验,如何进行校验…...

探究element-ui 2.15.8中<el-input>的keydown事件无效问题

一、问题描述 今天看到一个问题&#xff0c;在用Vue2element-ui 2.15.8开发时&#xff0c;使用input组件绑定keydown事件没有任何效果。 <template><div id"app"><el-input v-model"content" placeholder"请输入" keydown&quo…...

Unity 代码控制Text自适应文本高度

在使用代码给Text赋值时&#xff0c;且文本有多段&#xff0c;并需要根据实际文本高度适配Text组件的高度时&#xff0c;可以使用以下方法&#xff1a; //Text文本 public TextMeshProUGUI text;void Start() {//代码赋值文本text.text "好!\n很好!\n非常好!";//获…...

TiDB 7.1 多租户在中泰证券中的应用

本文详细介绍了中泰证券在系统国产化改造项目中采用 TiDB 多租户技术的实施过程。文章分析了中泰证券数据库系统现状以及引入 TiDB 资源管控技术的必要性&#xff0c;探讨了 TiDB 多租户的关键特性&#xff0c;并阐述了在实际应用中的具体操作步骤。通过该技术的应用&#xff0…...

嵌入式-stm32-SR04超声波测距介绍及实战

一&#xff1a;超声波传感器介绍 1.1、SR04超声波测距硬件模块 1.2、SR04的四个IO口 vcc:提供电源5V gnd:接地 Trig:是**发送**声波信号的触发器 Echo:是**接收**回波信号的引脚 当TRIG信号被触发时&#xff0c;传感器会发送一定频率的声波信号&#xff0c;该信号被反射后&am…...

智能优化算法应用:基于白鲸算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于白鲸算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于白鲸算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.白鲸算法4.实验参数设定5.算法结果6.参考文献7.MA…...

mac m1芯片 pytorch安装及gpu性能测试

pytorch 使用mac的m1芯片进行模型训练。 #小结&#xff1a;在数据量小和模型参数少&#xff0c;batch_size小时&#xff0c;cpu训练更快&#xff08;原因&#xff1a;每次训练时数据需要放入GPU中&#xff0c;由于batch_size小。数据放入gpu比模型计算时间还长&#xff09; 在…...

go 使用 - sync.WaitGroup

使用 - sync.WaitGroup 简介使用注意点 简介 waitgroup 是等待一组并发操作完成得方法。Goroutines对Go来说是独一无二的&#xff08;尽管其他一些语言有类似的并发原语&#xff09;。它们不是操作系统线程&#xff0c;它们不完全是绿色的线程(由语言运行时管理的线程)&#x…...

Java Web Day07-08_Layui

1. Layui概念介绍 layui&#xff08;谐音&#xff1a;类 UI) 是一套开源的 Web UI 解决方案&#xff0c;采用自身经典的模块化规范&#xff0c;并遵循原生 HTML/CSS/JS 的开发方式&#xff0c;极易上手&#xff0c;拿来即用。其风格简约轻盈&#xff0c;而组件优雅丰盈&#x…...

阿里云华北3(张家口)暂时无法办理经营性ICP许可证

阿里云服务器的华北 3&#xff08;张家口&#xff09;地域暂时无法办理经营性ICP许可证&#xff0c;如有经营性ICP业务请勿选择此地域。如果需要办理经营性ICP业务的用户&#xff0c;不需要选择华北3&#xff08;张家口&#xff09;地域&#xff0c;可以选择华北2&#xff08;北…...

八种常见顺序存储的算法

目录 1、线性枚举 1&#xff09;问题描述 2&#xff09;动图演示 3&#xff09;示例说明 4&#xff09;算法描述 5&#xff09;源码详解 2、前缀和差分 1&#xff09;问题描述 2&#xff09;动图演示 3&#xff09;样例分析 4&#xff09;算法描述 5&#xff09;源码…...

Leetcod面试经典150题刷题记录 —— 栈篇

Leetcod面试经典150题刷题记录 —— 栈篇 1. 有效的括号2. 简化路径3. 最小栈4. 逆波兰表达式求值5. 基本计算器 1. 有效的括号 题目链接&#xff1a;有效的括号 - leetcode 题目描述&#xff1a; 给定一个只包括 ( &#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&…...

从B类到连续类:一篇讲透功放效率与带宽的“鱼与熊掌”兼得史

射频功率放大器的进化论&#xff1a;从B类到连续类的带宽革命 在无线通信技术狂飙突进的三十年里&#xff0c;有个看似矛盾的命题始终困扰着工程师&#xff1a;如何让功率放大器同时"吃得少"&#xff08;高效率&#xff09;和"干得多"&#xff08;宽带宽&…...

RT-Thread线程栈初始化详解:从栈溢出到精准内存管理

1. 项目概述&#xff1a;从栈溢出崩溃说起搞嵌入式RTOS开发&#xff0c;尤其是用RT-Thread的朋友&#xff0c;估计没少被“线程栈溢出”这个问题折磨过。程序跑着跑着就HardFault了&#xff0c;或者某个线程莫名其妙地“死”了&#xff0c;数据错乱&#xff0c;查到最后往往发现…...

思源宋体TTF:免费专业中文字体终极使用指南

思源宋体TTF&#xff1a;免费专业中文字体终极使用指南 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 还在为中文排版找不到合适的免费字体而烦恼吗&#xff1f;思源宋体TTF正是你需要…...

163MusicLyrics:一站式音乐歌词获取与处理工具完全指南

163MusicLyrics&#xff1a;一站式音乐歌词获取与处理工具完全指南 【免费下载链接】163MusicLyrics 云音乐歌词获取处理工具【网易云、QQ音乐】 项目地址: https://gitcode.com/GitHub_Trending/16/163MusicLyrics 在音乐欣赏和内容创作中&#xff0c;精准的歌词同步是…...

VK视频下载器:三步实现VKontakte视频永久保存的实用方案

VK视频下载器&#xff1a;三步实现VKontakte视频永久保存的实用方案 【免费下载链接】VK-Video-Downloader Скачивайте видео с сайта ВКонтакте в желаемом качестве 项目地址: https://gitcode.com/gh_mirrors/vk/VK-Video…...

5分钟快速上手:OBS实时字幕插件终极配置指南

5分钟快速上手&#xff1a;OBS实时字幕插件终极配置指南 【免费下载链接】OBS-captions-plugin Closed Captioning OBS plugin using Google Speech Recognition 项目地址: https://gitcode.com/gh_mirrors/ob/OBS-captions-plugin 想要为你的直播或录播内容添加专业的实…...

【亲测免费】 普冉PY32F002A移植FreeRTOS资源文件

普冉PY32F002A移植FreeRTOS资源文件 【下载地址】普冉PY32F002A移植FreeRTOS资源文件 本资源文件提供了将FreeRTOS V9.0移植到普冉M0芯片PY32F002A的完整示例。开发环境基于KEIL&#xff0c;并使用了LL库进行移植。该示例展示了如何在PY32F002A芯片上运行四个任务&#xff0c;并…...

保姆级教程:在华大HC32L136上驱动SPI屏,用DMA发送提升刷屏效率

华大HC32L136单片机SPI屏DMA驱动实战指南 在物联网设备和智能硬件开发中&#xff0c;流畅的图形界面往往能大幅提升用户体验。而实现这一目标的关键&#xff0c;在于高效稳定的显示驱动设计。本文将深入探讨如何利用华大半导体HC32L136单片机的SPI接口与DMA控制器&#xff0c;构…...

别再被格式卡论文了!Paperxie 格式排版功能,一键搞定从本科到博士的规范难题

paperxie-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/AI PPThttps://www.paperxie.cn/format/typesettinghttps://www.paperxie.cn/format/typesetting 论文季里&#xff0c;有多少人的崩溃&#xff0c;不是因为写不出内容&#xff0c;而是死在了格式上&#x…...

高通QCC3084-QCC518X蓝牙耳机项目

高通QCC3084-QCC518X蓝牙耳机项目...