《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文件) 阅读详情

 2.1 Makefile的内容

  在一个完整的Makefile中,包含了5个东西:显式规则、隐含规则、变量的定义、指示符和注释。

  关于“规则”、“变量”和“Makefile指示符”将在后续的章节进行详细的讨论。 

  Makefile指示符:指示符指明在make程序读取makefile文件过程中所要执行的一个动作。

  注释:Makefile中“#”字符后的内容被作为是注释内容(和shell脚本一样)处理。

           如果此行的第一个非空字符为“#”,那么此行为注释行。注释行的结尾如果存在反斜线(\),那么下一行也被作为注释行。

           一般在书写Makefile时推荐将注释作为一个独立的行,而不要和Makefile的有效行放在一行中书写。

          当在Makefile中需要使用字符“#”时,可以使用反斜线加“#”(\#)来实现,其表示将“#”作为一字符而不是注释的开始标志。


注意:

        Makefile中第一个规则之后的所有以[Tab]字符开始的的行,make程序都会将其给系统的shell程序去解释执行。


2.2 Makefile的命名

  1.默认的情况下,make会在工作目录(执行make的目录)下按照文件名顺序寻找makefile文件读取并执行,查找的文件名顺序为:“GNUmakefile”、“makefile”、“Makefile”。

  2.推荐使用“Makefile”,而“GNUmakefile”是我们不推荐使用的文件名,因为以此命名的文件只有“GNU make”才可以识别,而其他版本的make程序只会在工作目录下查找“makefile”和“Makefile”这两个文件。

  3.如果make程序在工作目录下无法找到以上三个文件中的任何一个,它将不读取任何其他文件作为解析对象。但是根据make隐含规则的特性,我们可以通过命令行指定一个目标,如果当前目录下存在符合此目标的依赖文件,那么这个命令行所指定的目标将会被创建或者更新。

eg:

   当前目录下不存在以“GNUmakefile”、“makefile”、“Makefile”命名的任何文件,

  (1). 当前目录下存在一个源文件foo.c的,我们可以使用“make foo.o”来使用make的隐含规则自动生成foo.o。当执行“make foo.o”时。我们可以看到其执行的命令为:
cc –c –o foo.o foo.c
之后,foo.o将会被创建或者更新。
  (2). 如果当前目录下没有foo.c文件时,就是make对.o文件目标的隐含规则中依赖文件不存在。如果使用命令“make foo.o”时,将回到到如下提示:
make: *** No rule to make target ‘foo.o’. Stop.
   (3). 如果直接使用命令“make”时,得到的提示信息如下:
make: *** No targets specified and no makefile found. Stop.

 4.当makefile文件的命名不是这三个任何一个时,需要通过make的“-f”或者“--file”选项来指定make读取的makefile文件。给make指定makefile文件的格式为:“-f NAME”或者“--file=NAME”,它指定文件“NAME”作为执行make时读取的makefile文件。也可以通过多个“-f”或者“--file”选项来指定多个需要读取的makefile文件,多个makefile文件将会被按照指定的顺序进行连接并被make解析执行。当通过“-f”或者“--file”指定make读取makefile的文件时,make就不再自动查找这三个标准命名的makefile文件。


2.3 包含其它makefile文件

  1.Makefile中包含其它文件的关键字是“include”。“include”指示符告诉make暂停读取当前的Makefile,而转去读取“include”指定的一个或者多个文件,完成以后再继续当前Makefile的读取。

  2.include使用格式

    include FILENAMES...

      (1).指示符“include”所在的行可以一个或者多个空格(make程序在处理时将忽略这些空格)开始,切忌不能以[Tab]字符开始(如果一行以[Tab]字符开始make程序将此行作为一个命令行来处理)。

      (2).来看一个例子,存在三个.mk文件,“$(bar)”被扩展为“bish bash”。则
                 include foo *.mk $(bar)
                 等价于

                 include foo a.mk b.mk c.mk bish bash

      (3).make程序在处理指示符include时,将暂停对当前使用指示符“include”的makefile文件的读取,而转去依此读取由“include”指示符指定的文件列表。直到完成所有这些文件以后再回过头继续读取指示符“include”所在的makefile文件。

  3.当在这些目录下都没有找到“include”指定的文件时,make将会提示一个包含文件未找到的告警提示,但是不会立刻退出。而是继续处理Makefile的内容。当完成读取所有的makefile文件后,make将试图使用规则来创建通过指示符“include”指定的但未找到的文件(参考2.7 makefile文件的重建一节),当不能创建它时(没有创建这个文件的规则),make将提示致命错误并退出。会输出类似如下错误提示:
Makefile:错误的行数:未找到文件名:提示信息(No such file or directory)

Make: *** No rule to make target ‘<filename>’. Stop


2.4 环境变量MAKEFILES

   linux中有个环境变量MAKEFILES。可以用echo $MAKEFILES查看变量的值。

   1.如果当前环境定义了一个“MAKEFILES”的环境变量,make执行时首先将此变量的值作为需要读入的Makefile文件,多个文件之间使用空格分开。类似使用指示符“include”包含其它Makefile文件一样,如果文件名非绝对路径而且当前目录也不存在此文件,make会在一些默认的目录去寻找。

   2.MAKEFILE环境变量和include的区别。

      (1).环境变量指定的makefile文件中的“目标”不会被作为make执行的“终极目标”

      (2).环境变量所定义的文件列表,在执行make时,如果不能找到其中某一个文件(不存在或者无法创建)。make不会提示错误,也不退出。就是说环境变量“MAKEFILES”定义的包含文件是否存在不会导致make错误(这是比较隐蔽的地方)。

   3.变量“MAKEFILES”主要用在“make”的递归调用过程中的的通信(参考4.6make的 递归执行一节)。实际应用中很少设置此变量.因为一旦设置了此变量,在多层make调用时;由于每一级make都会读取“MAKEFILES”变量所指定的文件,这样可能导致执行的混乱(可能不是你想看到的执行结果),而且可移植性会变差。推荐的做法实:在需要包含其它makefile文件时使用指示符“include”来实现。


2.9 make如何解析makefile文件

   GUN make的执行过程分为两个阶段。
   第一阶段:读取所有的makefile文件(包括“MAKIFILES”变量指定的、指示符“include”指定的、以及命令行选项“-f(--file)”指定的makefile文件),内建所有的变量、明确规则和隐含规则,并建立所有目标和依赖之间的依赖关系结构链表。

   在第二阶段:根据第一阶段已经建立的依赖关系结构链表决定哪些目标需要更新,并使用对应的规则来重建这些目标。

2.9.1 变量和函数的展开问题

   在make执行的第一阶段中如果变量和函数被展开,那么称此展开是“立即”的,此时所有的变量和函数被展开在需要构建的结构链表的对应规则中(此规则在建立链表是需要使用)。其他的展开称之为“延后”的。
   变量取值的展开:当变量使用追加符(+=)时,如果此前这个变量是一个简单变量(使用 :=定义的)则认为它是立即展开的,其它情况时都被认为是“延后”展开的变量。
   条件语句:所有使用到条件语句在产生分支的地方,make程序会根据预设条件将正确地分支展开。
   规则的定义:规则中目标和依赖如果引用其他的变量,则被立即展开。而规则的命令行中的变量引用会被延后展开。

GNU make和automake 生成makefile 实例 摘要:首先makefile自动化编译文件有两种方法,一种是自己动手写makefile,一种是用automake自动生成工具来生成makefile.        大型项目,工程建议使用automake工具.       小型项目,工程直接自己动手写就行.      了解详细automake移步:automake自动生成makefile流程一 ,  手动创建makefile1.测试helloworl... 阅读详情

相关推荐

在Windows下安装GNU Make并使用Makefile文件

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

FcUnity的博客 4056

GNU make 中文手册 第三章:Makefile 总述

一、Makefile 总述 3.1 Makefile 的内容 在一个完整的 Makefile 中,包含了 5 个东西:显式规则、隐含规则、变量定义、指示符和注释。关于“规则”、“变量” 和 “Makefile 指示符” 将在后续的章节进行详细的讨论。本章讨论的是一些基本概念。 显式规则:它描述了在何种情况下,如何更新一个或者多个被称为目标的文件(Makefile 的目标文件)。书写 Makefile 时,需要明确地给出目标文件、目标的依赖文件列表以及更新目标文件所需要的命令(有些规则没有命令,这样的规则

weixin_42109053的博客 2928

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

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

weixin_34456923的博客 1184

linux中无make命令,make: *** 没有指明目标并且找不到 makefile,make命令安装方法

注意!!! 这种情况其实可以在安装虚拟机过程中进行避免得,下次测试装虚拟机的时候直接选择开发工具就可以了 好啦言归正传,这次是帮助大家解决问题得,首先输入make会有下图的显示 这种情况下如果是有网环境直接输入yum -y install make 就可以解决,若是无网环境则需要上网上下载源码包进行上传 yum -y install make 无网环境下在下面这个网址进行下载,在通过xftp上传到linux系统中 http://ftp.gnu.org/gnu/make/make-4.2.tar

C________1的博客 4万+

centos-stream-9上安装nvidia驱动和cuda-toolkit

centos-stream-9上安装nvidia驱动和cuda-toolkit

qq_19072921的博客 3020

用OpenIPC复活你的旧摄像头:手把手教你给君正T31芯片设备刷开源固件

本文详细介绍了如何使用OpenIPC项目为君正T31芯片的旧摄像头刷入开源固件,解锁更多功能并延长设备寿命。从硬件识别、风险控制到详细刷机步骤和后期配置,手把手教你将闲置摄像头改造为智能监控设备,实现隐私可控、功能扩展等优势。

weixin_30790841的博客 766

GNUmakefile: /common.make: no such file or directory

注意该错误是因为文件定位错误, 我们的main.m 和 GNUmakefile 文件所放的home 文件夹 应该是msys->1.0->home 文件夹, 不是在GNUstep目录下的home文件夹, 在出现类似的错误,大家找找错误在哪 转载于:https://www.cnblogs.com/timmy3/archive/2012/06/26/2563757...

weixin_30246221的博客 872

TMC2209串口配置实战:从寄存器解析到电机精准控制

本文详细解析TMC2209步进电机驱动芯片的串口配置方法,从硬件连接到UART通信协议,再到核心寄存器功能详解。通过实战案例展示电流控制、微步细分和速度调节等关键配置,帮助工程师实现电机精准控制,并提供了常见故障诊断和优化技巧。

f6g7h8i9j的博客 1173

Make与Makefile概述

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

ScilogyHunter的博客 1930

基于Android13的系统启动流程分析(三)之FirstStageMain阶段

init进程是Android系统中用户空间的第一个进程,作为第一个进程,它被赋予了很多极其重要的工作职责,比如创建zygote(孵化器)和属性服务等。init进程是由多个源文件共同组成的,这些文件位于源码目录system/core/init1. Bootloader 引导当按下设备电源键时,最先运行的就是 bootloader(固化在ROM的程序),bootloader 的主要作用就是硬件设备(如 CPU、flash、内存)的初始化并加载到RAM,通过建立内存空间映射,为装载 Linux 内核做好准备,。

q1210249579的博客 5496

网络安全系列-四十三:使用Suricata分析恶意流量pcap文件

本文基于[网络安全系列-三十六:使用Suricata IDS分析pcap文件]和 [网络安全系列-四十二: Suricata之rulesets的激活、更新及动态加载]的基础上,使用suricata针对包含恶意流量的pcap文件进行分析,触发事件告警,并对suricata输出的日志进行逐个分析,让你掌握针对恶意流量的分析步骤,及怎么查看suricata输出的日志。

penriver的博客 2883

GNU Make 使用手册(中译版)

GNU Make 使用手册(中译版)

m0_49236123的博客 1668

信贷模型域——清收阶段模型(贷后模型)

本文深入探讨了信贷模型域中的清收阶段模型(贷后模型),涵盖早期催收模型(C卡)、晚期催收模型、Best Time to Contact模型和回收模型。这些模型通过多维度数据输入,运用分类、回归和生存分析等建模方法,输出关键指标如还款概率、回收率等,广泛应用于银行、资产管理公司和催收外包公司,助力提升回款率、优化资源分配、降低催收成本,并融入贷后风控体系。

庄小焱 652

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

基于STM32姿态解算-正点原子ATK-IMU901模块标准库开发——正点原子串口角度传感器模块十轴IMU加速度气压计陀螺仪_资料编号29

购买了正点原子的ATK-IMU901模块后,发现例程给的是HAL库的,本项目将HAL库例程转换为库函数版本(基于STM32)。实战开发,亲测无误。

嵌入式阿齐Archie 3863

Windows密码忘了怎么办?一分钟看懂Windows密码底层机制:无需重装系统也能无痕找回登录密码

忘记Windows开机密码,不一定非得重装系统!本文手把手教你通过提取NTLM Hash值实现“无痕找回密码”,无需PE、无需清除密码,对系统零修改 🛡️ 搭配mimikatz与在线解密平台,小白也能快速上手,了解Windows密码底层机制 🔐

XiaoqiangClub的博客 121

make和makefile

make和makefile; 进度条实现

m0_69323023的博客 1035

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

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

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

Wang_Dou_Dou_的博客 2817

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

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 4147

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

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

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

Hydrazine的专栏 1334

【亲测免费】 深入探索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

《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

GNU make和makefile非常简介

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

周公不做梦 1040
上一篇: secureCRT设置vim关闭后代码不显示在屏幕上
下一篇: 《GNU make》学习笔记(三)---Makefile的规则
Colorful_lights
博客等级 码龄10年 27粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值