《GNU make》学习笔记(三)---Makefile的规则

GNU make/Makefile 简明实用教程 GNU make/Makefile 简明实用教程 目录: 1. 简介 2. 示例项目 3. 为什么使用make 4. 使用变量 5. 模式规则 6. 使用函数 7. 总结 1. 简介 make(GNU make) 是一个项目构建工具,即方便地编译、链接多个源代码文件,自动决定哪些源文件需要重新编译,从而高效地构建自己地项目。本教程使用最广泛使用make的.c文件为例,但实际上make的使用并不限于 C 语言。 本教程目标: 根据多个源文件(示例为.c、.h文件),编译成多个中间文件(示例为.o文件) 阅读详情

3.2 规则语法

    Makefile中对“$”有特殊的含义(表示变量或者函数的引用),如果我们的规则如果需要“$”,需要书写两个连续的(“$$”)。

    规则的中心思想就是:目标文件的内容是由依赖文件文件决定,依赖文件的任何一处改动,将导致目前已经存在的目标文件的内容过期。


3.3依赖的类型--常规依赖和order-only依赖

     有时,我们需要定义一个这样的规则,在更新目标(目标文件已经存在)时只需要根据依赖文件中的部分来决定目标是否需要被重建,而不是在依赖文件的任何一个被修改后都重建目标。为了实现这个目的,我们需要对依赖进行分类,一类是这些依赖文件的更新需要对应更新目标文件,另一类是这些依赖的更新不会导致目标被重建。第二类的依赖我们就称他为:“order-only”依赖。

     “order-only”依赖使用管道符号“|”开始,作为目标的一个依赖文件。规则的依赖列表中管道符号“|”左边的是常规依赖文件,所有出现在管道符号右边的就是“order-only”依赖。

      TARGETS : NORMAL-PREREQUISITES | ORDER-ONLY-PREREQUISITES

     规则中常规依赖文件可以是空。允许对一个目标声明多行按正确顺序依次追加的依赖。需要注意:规则依赖文件中如果一个文件被同时声明为常规依赖和“order-only”依赖,那么此文件被作为常规依赖处理(因为常规依赖所实现的动作是“order-only”依赖所实现的动作的一个超集)。


3.4 文件名使用通配符

    Maekfile中表示一个单一的文件名时可使用通配符。可使用的通配符有:“*”、“?”和“[…]”。
    Makefile中统配符可以出现在以下两种场合:
1. 可以用在规则的目标、依赖中,此时make会自动将其展开;
2. 可出现在规则的命令中,其展开是在shell在执行此命令时完成。
    如果规则中的某一个文件的文件名包含作为统配符的字符(“*”、“.”字符),在使用文件时需要对文件名中的统配字符进行转义处理,使用反斜线(\)来进行通配符的转义。
    波浪线之后跟一个单词(~word),其代表由这个“word”所指定的用户的宿主目录。例如“~john/bin”就是代表用户john的宿主目录下的bin目录。

    变量定义中使用的通配符不会被展开(因此在定义变量不能按照这这种方式,下一小节将会详细讨论)。如果Makefile有这样一句:“objects = *.o”。那么变量“objects”的值就是“*.o”,而不是使用空格分开的所有.o文件列表。如果需要变量“objects”代表所有的.o文件,则需要是用函数“wildcard”来实现(objects = $(wildcar *.o))。


3.5 目录搜寻

    在一个较大的工程中,一般会将源代码和二进制文件(.o文件和可执行文件)安排在不同的目录来进行区分管理。这种情况下,我们需要使用make提供的目录自动搜索依赖文件功能(在指定的若干个目录下搜索依赖文件)。书写makefile时,指定依赖文件的搜索目录。当工程的目录结构发生变化时,我们就可以不更改Makefile的规则,而只更改依赖文件的搜索目录。

    两种方法:VPATH特殊变量和关键字vpath。

3.5.1 一般搜索VPATH

    特殊变量VPATH可以指定依赖文件的搜索路径,在规则需要的文件在当前目录不存在时,make会在此变量所指定的目录下去寻找这些文件。

    “VPATH”变量所指定的是Makefile中所有文件的搜索路径,包括依赖文件和目标文件。

    变量“VPATH”的定义中,使用空格或者冒号(:)将多个目录分开。make搜索的目录顺序按照变量“VPATH”定义中顺序进行(当前目录永远是第一搜索目录)

3.5.2 选择性搜索vpath

     关键字vpath为不同类型的文件(由文件名区分)指定不同的搜索目录。

vpath 使用方法:

  • vpath <directories>            :: 当前目录中找不到文件时, 就从<directories>中搜索
  • vpath <pattern> <directories>  :: 符合<pattern>格式的文件, 就从<directories>中搜索
  • vpath <pattern>                :: 清除符合<pattern>格式的文件搜索路径
  • vpath                          :: 清除所有已经设置好的文件路径

举个例子:

      vpath %.h ../headers:../include

   Makefile中出现的.h文件,如果不能在当前目录下找到,则到目录“../headers”下和../include寻找。注意:这里指定的路径仅限于在Makefile文件内容中出现的.h文件。并不能指定源文件中包含的头文件所在的路径(在.c源文件中所包含的头文件需要使用GCC的命令行来说明)。

3.5.3 makefile的目录搜索机制

     make在解析Makefile文件执行规则时对文件路径保存或废弃所依据的算法如下

   为了更清楚地描述此算法,我们使用一个例子来说明。存在一个目录“prom”,“prom”的子目录“src”下存在“sum.c”和“memcp.c”两个源文件。在“prom”目录下的Makefile部分内容如下:

LIBS = libtest.a
VPATH = src
libtest.a : sum.o memcp.o
$(AR) $(ARFLAGS) $@ $^

  首先,如果在两个目录(“prom”和“src”)都不存在目标“libtest.a”,执行make时将会在当前目录下创建目标文件“libtest.a”。另外;如果“src”目录下已经存在“libtest.a”,以下两种不同的执行结果:
1) 当它的两个依赖文件“sum.c”和“memcp.c”没有被更新的情况下我们执行make,首先make程序会搜索到目录“src”下的已经存在的目标“libtest.a”。由于目标“libtest.a”的依赖文件没有发生变化,所以不会重建目标。并且目标所在的目录不会发生变化。
2) 当我们修改了文件“sum.c”或者“memcp.c”以后执行make。“libtest.a”和“sum.o”或者“memcp.o”文件将会被在当前目录下创建(目标完整路径名被废弃),而不是在“src”目录下更新这些已经存在的文件。此时在两个目录下(“prom”和“src”)同时存在文件“libtest.a”。但只有“prom/libtest.a”是最新的库文件。


3.5.6 库文件和搜索目录

 如果在命令中有“-lNNAM”的依赖文件名,那么Make的搜索步骤如下:

   1. make在执行规则时会在当前目录下搜索一个名字为“libNAME.so”的文件;

   2. 如果当前工作目录下不存在这样一个文件,则make程序会继续搜索使用“VPATH”或者“vpath”指定的搜索目录。

  3. 还是不存在,make程序将搜索系统默认目录,顺序是:“/lib”、“/usr/lib”和“PREFIX/lib”(在Linux系统中为“/usr/local/lib”,其他的系统可能不同)

  4.如果“libNAME.so”通过以上的途径最后还是没有找到的话,那么make程序将会按照以上的搜索顺序查找名字为“libNAME.a”的文件

   当然你可以在命令行中指定编译或者连接选项来指定动态连接还是静态连接。参数-static就是使用静态库。

   注意:如果依赖是库,make并不会自动去创建库

      例如:

foo : foo.c -lcurses
    cc $^ -o $@

   make不会创建libcurses.so。如果libcurses.so不存在会报错。




在Windows下安装GNU Make并使用Makefile文件 首先,你需要从GNU Make的官方网站(https://www.gnu.org/software/make/)下载适用于Windows的GNU Make二进制文件。下载完成后,将二进制文件保存到一个你喜欢的位置,比如。通过按照上述步骤,在Windows下安装GNU Make并使用Makefile文件,你可以轻松自动化编译和构建任务,提高开发效率并确保代码的一致性和可重复性。在本文中,我将向你介绍如何在Windows操作系统下安装GNU Make,并使用Makefile文件来执行一些基本的构建任务。 阅读详情

相关推荐

GNU Make中文手册:自动化构建的精粹

GNU Make 是一个用于自动编译和构建程序的工具,广泛应用于软件开发领域。Make 通过读取名为 Makefile 的文件来执行编译任务,Makefile 中定义了一系列的规则,这些规则指导 make 如何根据文件的时间戳来构建目标文件,从而只重新编译更新过的文件,这对于提高开发效率和自动化构建流程至关重要。

weixin_34456923的博客 1184

makefile管理编译工程 自动生成.h头文件依赖

makefile管理编译工程 工程目录结构 每一个功能模块建立一个文件夹,然后该文件夹下建立include,lib,src文件夹。include存放对外接口,lib存放编译好的静态库,src存放源码.c和.h文件。 每个功能模块有单独的makefile进行编译管理。 顶层路径下建立一个管理所有功能模块的makefile。这个makefile负责主函数的编译链接工作。 (关于.h文件更新,则重新编译包含了该头文件的所有的文件,这条规则还没实现) Makfile实现 cJSON build = ../buil

duapple的博客 5364

智能循迹小车之PID控制算法

从光电传感器获取信号确认小车和黑线的偏离角度,通过PID算法算出左右车轮速度,控制小车前进或者后退。

yzj199921的博客 4640

makefile增量编译(生成依赖关系)

1Makefile基本用法 1.1常用符号 1.1.1编译器 CC // C语言编译器,默认值为gcc默认的变量,无需用户自定义,也可以改变其值 CXX // C++语言编译器,默认值为g++默认的变量,无需用户自定义,也可以改变其值 CFLAGS // C语言编译器的编译选项 LDFLAGS // C语言编译器的链接选项 CX...

yantao_wang的博客 6600

Linux DRM驱动实战:手把手教你用drmModeSetCrtc显示纯色画面(附完整代码)

本文提供了一份完整的Linux DRM驱动实战指南,手把手教你使用drmModeSetCrtc在屏幕上显示纯色画面。文章详细解析了从打开设备、获取资源、创建帧缓冲区到最终提交画面的完整调用流程,并附带了可直接编译运行的完整代码示例,帮助开发者快速上手Linux图形底层开发。

weixin_29216353的博客 512

树莓派4B+红外传感器:手把手教你DIY一个能走黑线的智能小车(Python代码全解析)

本文详细介绍了如何使用树莓派4B和红外传感器DIY一个智能循迹小车,包括硬件配置、GPIO连接、Python代码实现及优化算法。通过动态PWM调速、状态机设计和赛道记忆算法,提升小车的循迹性能和稳定性。适合初学者和电子爱好者动手实践。

weixin_29188043的博客 269

Makefile中的$$

1 $$的用处 在uboot/kernel的顶层Makefile中我们可以看到,当执行make时同时传入多个目标是这样处理的: __build_one_by_one: $(Q)set -e; \ for i in $(MAKECMDGOALS); do \ $(MAKE) -f $(srctree)/Makefile $$i; \ done 其中的$$i比较奇怪,Makefile引用变量只需要一个$符号就够了,为什么这里要两个呢?因为变量i是在shell的for循环中定义的,是属于shell中的

gzxb1995的博客 8160

从Oracle迁移数据到Hadoop

目标:把Oracle 下的数据文件迁移到 Hadoop , 数据表都是上亿条,每个数据表的空间都超过100G。 关键是建立数据文件是UTF8格式,这样数据中的汉字在Hadoop 里显示才正常。 平台:CentOS 6.10 工具:Python 2.7 cx_Oracle 库 Oracle10.2.0.4.0 Hadoop 2.7.2-transwarp-5.2.1 1. 查看表...

预则立 4234

makefile学习总结-----搜索目录

在一个较大的工程中,一般会将源代码和二进制文件(.o文件和可执行文件)安排在不同的目录来进行区分管理。这种情况下,我们需要使用make提供的目录自动搜索依赖文件功能(在指定的若干个目录下搜索依赖文件)。书写makefile时,指定依赖文件的搜索目录。当工程的目录结构发生变化时,我们就可以不更改Makefile的规则,而只更改依赖文件的搜索目录。 本节我们将详细讨论在书写Makefile时如何使用

Hokeo的专栏 3530

转录组分析中的Fastp和FastQC:如何快速检测数据质量并优化流程

本文深入探讨了转录组分析中数据质量控制的核心流程,重点介绍了Fastp和FastQC两款工具的组合应用。FastQC负责对原始测序数据进行全面质量评估,生成可视化报告;Fastp则能一站式完成接头切除、低质量序列过滤、长度筛选等关键质控步骤。文章提供了详细的参数解读、实战脚本和自动化流程构建指南,帮助研究人员快速检测数据质量并优化预处理流程,为下游的差异表达等分析奠定可靠基础。

weixin_28452161的博客 181

基于STM32设计的指纹考勤机_348

随着信息化管理需求的日益增长,传统的人工考勤方式已难以满足现代社会对高效、精准和安全的考勤管理要求。为解决这一问题,本项目设计并实现了一款基于STM32的指纹考勤机系统。该系统采用AS608指纹识别模块进行人员身份识别,ESP8266无线模块实现与上位机APP的通信,支持人员信息录入、考勤时间段设置、考勤记录保存与查询等功能。系统通过SQLite数据库存储考勤数据,并提供导出EXCEL表格功能,方便数据管理与统计分析。该系统具有高效的考勤管理能力和良好的用户交互体验,能够广泛应用于企业、学校等机构的考勤管理

525

GNU make 总结 (五)

一、使用make更新静态库 静态库文件是一些.o文件的集合,在Linux中使用ar工具对它进行维护管理。一个静态库通常由多个.o文件组成,这些.o文件可独立的被作为一个规则的目标,库成员作为目标时需要按照如下格式来书写: ARCHIVE(MEMBER) 注:这种格式只能出现在规则的目标和依赖中,不能出现在命令行中。含有这种表达式的规则的命令行只能是ar命令或者其它可以对库成员进行操作的命令。...

weixin_34383618的博客 200

GameFramework框架详解之 Network网络框架

NetworkManager只负责维护NetworkChannel,实际的有种我们简历网络连接的也是NetworkChannel作为一个网路频道,这样管理起来比较方便,比如:一个游戏可能有多个网络连接,那么我们建立多个网络频道即可,或者当我们一个网络频道断线后,我们可以直接再新建一个,防止数据混乱。/// /// 网络管理器。/// /// 网络频道。/// 用户自定义网络错误事件。/// 检查是否存在网络频道。/// 获取网络频道。/// 获取所有网络频道。

TxNet 3366

GNU make 和 makefile

GNU make 和 makefile GNU make makefile 基本结构 makefile 变量 GNU make 的主要预定义变量 隐含规则 makefile 范例 运行 make 1.9.1 GNU make 在大型的开发项目中,通常有几十到上百个的源文件,如果每次均手工键入 gcc 命令进行编译的话,则会非常不方便。因此,人们通常利用 make 工具来自动完成编译工作

Blog.AspDotNet.CN::rAgeCheung的专栏 1094

(五)深入理解Bluez协议栈之“GATT Server Profile”

上一篇介绍Bluez协议栈的了GAP Profile的实现,本章节我们继续介绍GATT Profile的实现,参考的程序是Peripheral。通过阅读它的实现代码可以发现,它广播部分是通过mgmt来实现的,然后在初始化完成之后,创建了一个L2CAP类型的socket,来负责实现GATT Server的逻辑。

1142

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Make与Makefile概述

**Make**是一个自动化构建工具,它通过读取名为**Makefile**的配置文件,确定项目中文件之间的依赖关系,并基于这些关系决定哪些部分需要重新构建,以及以何种顺序构建。

ScilogyHunter的博客 1930

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

GNU Make 使用手册(中译版)

GNU Make 使用手册(中译版)

m0_49236123的博客 1668

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

我所认识的GNU make(5) -- make是如何处理Makefile的

通常情况下Makefile的内容就是告诉make如何去编译和链接生成一个程序。并且默认情况下,make会以在Makefile中寻找到的目标作为这次执行make程序的最终目标,所以和最终目标不相干的规则make将忽略掉,不会去执行。或者你也可以在输入make命令的时候指明具体的目标。 你可以通过使用inclide指令将其他的makefile包含进来,如果你在include其他的makefile的时

Hydrazine的专栏 1334

GNU Makefile

从工作就接触 make,但还从未仔细仔细看过官方的文档描述和说明,有些小遗憾,现在补充补充; GNU 的 make Manual:Top (GNU make)Top (GNU make)https://www.gnu.org/software/make/manual/html_node/index.html 最好最好还是读一读,虽然常用到,但是,总有一些很小的细节需要注意,稍不注意就可能遗漏; Makefile 用于描述代码的编译、链接、生成最终目标文件的过程和相互依赖;当你写好一个 Makefile

StephenZhou 4148

【Linux学习笔记⑤】——GNU C语言开发环境【GNU make、静态库】

关键词:GNU C、Linux、项目管理工具——GNU make、静态库、共享库

Wang_Dou_Dou_的博客 2817

【亲测免费】 深入探索GNU Make:《GNU-Makefile中文手册-Ver3.8》推荐

深入探索GNU Make:《GNU-Makefile中文手册-Ver3.8》推荐 【下载地址】GNU-Makefile中文手册-Ver3.8 本资源文件为《GNU-Makefile中文手册-Ver3.8.pdf》,是对“info make”的翻译整理。本书不是一个纯粹的语言翻译版本,其中对GNU make的一些语法和用法...

gitblog_06618的博客 1061

Makefile隐式规则揭秘:GNU Make的魔法功能

想要让C/C++项目编译变得更简单吗?GNU Make的隐式规则就是你的秘密武器!这个强大的功能能够自动识别文件类型并执行相应的编译命令,让你的Makefile编写工作事半功倍。本文将带你深入了解Makefile隐式规则的运作机制、实际应用场景以及如何充分利用这一魔法功能来优化你的开发流程。 ## 什么是Makefile隐式规则? 隐式规则是GNU Make提供的一种智能机制,它能够根据文件扩

gitblog_00452的博客 484

《GNU make项目管理》笔记--简单的makefile

make定义了一种语言,可用来描述源文件、中间文件以及可执行文件之间的关系。它还提供了一些功能,可用来管理各种 候选配置、实现可重用程序库的细节以及让用户自定义宏将过程参数化。简言之,make常被视为开发过程的核心,因为它 为应用程序的组件以及这些组件的搭配方式提供了一个可依循的准则。 make的主要价值在于它由能力完成编译应用程序时所需要的一系列复杂步骤,以及当有可能缩短“编辑-编译-调试

TODD911的专栏 3514

GNU make翻注

该make实用程序会自动确定大型程序的哪些部分需要重新编译,并发出命令对其进行重新编译. 本手册介绍了由Richard Stallman和Roland McGrath实现的GNU make。处理了自3.76版以来的开发。GNU make符合IEEE标准1003.2-1992(POSIX.2)的6.2节。我们的示例显示了C程序,因为它们是最常见的,但是您可以将make用于任何可以使用shell命令运行编译器的编程语言。实际上,make并不局限于程序。

qq_41720266的博客 1023

make工具和Makefile的使用

一、make工具和Makefile文件的引入 &emsp 当源码问价比较多的时候就不适合通过直接输入gcc命令来编译,这时候就需要一个自动化的编译

FRS2023的博客 6877

【Makefile】 - GNU make 总述

上一篇我们说明了为什么需要 make,以及 make 是怎么解决程序构建痛点的。 【Makefile】 - GNU make序&缘起 该篇仍然会进一步介绍 Makefile,希望通过这两篇能让你对 make、Makefile 有一个感性的认识。 文章目录Makefile内容Makefile文件名包含其他Makefile变量MAKEFILESMAKEFILE_LIST其他特色变量make工作方式(如何解析Makefile)参考鸣谢 Makefile内容 Makefile 中主要包含以下内容: .

Hsy的博客 520
上一篇: 《GNU make》学习笔记(二)---Makefile概述
下一篇: UART的break信号
Colorful_lights
博客等级 码龄10年 27粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值