Makefile语法

一、Makefile规则格式

Makefile 里面是由一系列的规则组成的,这些规则格式如下:

目标…... : 依赖文件集合……
命令 1
命令 2
……

参考上一节gcc编译器与Makefile入门参考这条规则

  1 main: main.o input.o calcu.o
  2     gcc -o main main.o input.o calcu.o
  3 main.o: main.c
  4     gcc -c main.c
  5 input.o: input.c
  6     gcc -c input.c
  7 calcu.o: calcu.c
  8     gcc -c calcu.c
  9     
 10 clean:
 11     rm *.o
 12     rm main

可以看出这条规则的目标是main,依赖文件是main.o input.o calcu.o,如果要更新目标 main,就必须先更新它的所有依赖文件main.o input.o calcu.o,如果依赖文件中的任何一个如calcu.o有更新,那么目标main也必须更新,“更新”就是执行一遍规则中的命令列表。
命令列表中的每条命令必须以 TAB 键开始,不能使用空格!
make 命令会为 Makefile 中的每个以 TAB 开始的命令创建一个 Shell 进程去执行。
上述代码执行步骤如下:更新第一条规则main,发现依赖的三个.o文件还不存在,便去执行后面的三条规则先生成对应的.o文件,再生成main。最后clean没有依赖文件,因此会默认为依赖文件都是最新的,所以其对应的命令不会执行,当我们想要执行 clean 的话可以直接使用命令“make clean”,执行以后就会删除当前目录下所有的.o 文件以及 main,因此 clean 的功能就是完成工程的清理,如图
在这里插入图片描述
总结一下 Make 的执行过程:
1、make 命令会在当前目录下查找以 Makefile(makefile 其实也可以)命名的文件。
2、当找到 Makefile 文件以后就会按照 Makefile 中定义的规则去编译生成最终的目标文件。
3、当发现目标文件不存在,或者目标所依赖的文件比目标文件新(也就是最后修改时间比目标文件晚)的话就会执行后面的命令来更新目标。

二、Makefile变量

看下面的例子

 main: main.o input.o calcu.o
	 gcc -o main main.o input.o calcu.o

Makefile 加入了变量支持,不像 C 语言中的变量有 int、char等各种类型,Makefile 中的变量都是字符串!类似 C 语言中的宏。使用变量将上面的代码修改

1 #Makefile 变量的使用
2 objects = main.o input.o calcu.o
3 main: $(objects)
4 	gcc -o main $(objects)

Makefile 中变量的引用方法是“$ (变量名)”,比如本例中的“$(objects)”就是使用变量 objects。

三、Makefile模式规则

将下面的工程改为模式规则

1 main: main.o input.o calcu.o
2	 gcc -o main main.o input.o calcu.o
3 main.o: main.c
4	 gcc -c main.c
5 input.o: input.c
6	 gcc -c input.c
7 calcu.o: calcu.c
8	 gcc -c calcu.c
9 
10 clean:
11	 rm *.o
12	 rm main

上述 Makefile 中第 3~8 行是将对应的.c 源文件编译为.o 文件,每一个 C 文件都要写一个对
应的规则,如果工程中 C 文件很多的话显然不能这么做。为此,我们可以使用 Makefile 中的模
式规则,通过模式规则我们就可以使用一条规则来将所有的.c 文件编译为对应的.o 文件。修改如下:

1 objects = main.o input.o calcu.o
2 main: $(objects)
3	 gcc -o main $(objects)
4 
5 %.o : %.c
6	 #命令
7 
8 clean:
9	 rm *.o
10	 rm main

模式规则中,至少在规则的目标定定义中要包涵“%”,否则就是一般规则,目标中的“%”
表示对文件名的匹配,“%”表示长度任意的非空字符串,比如“%.c”就是所有的以.c 结尾的
文件,类似与通配符,a.%.c 就表示以 a.开头,以.c 结束的所有文件。
当“%”出现在目标中的时候,目标中“%”所代表的值决定了依赖中的“%”值。

四、Makefile自动化变量

所谓自动化变量就是这种变量会把模式中所定义的一系列的文件自动的挨个取出,直至所有的符合模式的文件都取完,自动化变量只应该出现在规则的命令中。
用自动化变量显示最终的完整代码如下所示:

1 objects = main.o input.o calcu.o
2 main: $(objects)
3	 gcc -o main $(objects)
4 
5 %.o : %.c
6	 gcc -c $<
7
8 clean:
9	 rm *.o
10	 rm main

$ < :依赖文件集合中的第一个文件,如果依赖文件是以模式(即“%”)定义的,那么“$<”就是符合模式的一系列的文件集合。

五、Makefile伪目标

Makefile 有一种特殊的目标——伪目标,一般的目标名都是要生成的文件,而伪目标不代表真正的目标名,在执行 make 命令的时候通过指定这个伪目标来执行其所在规则的定义的命令。
使用伪目标主要是为了避免 Makefile 中定义的执行命令的目标和工作目录下的实际文件出现名字冲突,有时候我们需要编写一个规则用来执行一些命令,但是这个规则不是用来创建文件的,比如下面代码用来完成清理工程的功能:

clean:
	rm *.o
	rm main

上述规则中并没有创建文件 clean 的命令,因此工作目录下永远都不会存在文件 clean,当我们输入“make clean”以后,后面的“rm *.o”和“rm main”总是会执行。可是如果我们在工作目录下创建一个名为“clean”的文件,那就不一样了,当执行“make clean”的时候,规则因为没有依赖文件,所以目标被认为是最新的,因此后面的 rm 命令也就不会执行,我们预先设想的清理工程的功能也就无法完成。为了避免这个问题,我们可以将 clean 声明为伪目标,声明方式如下:

.PHONY : clean

我们使用伪目标来更改上面示例代码,修改完成以后如下:

1 objects = main.o input.o calcu.o
2 main: $(objects)
3	 gcc -o main $(objects)
4 
5 .PHONY : clean
6 
7 %.o : %.c
8	 gcc -c $<
9 
10 clean:
11	 rm *.o
12	 rm main

上述代码第 5 行声明 clean 为伪目标,声明 clean 为伪目标以后不管当前目录下是否存在名为“clean”的文件,输入“make clean”的话规则后面的 rm 命令都会执行。

五、Makefile条件判断

条件关键字有 4 个:ifeq、ifneq、ifdef 和 ifndef
ifeq 用法如下:

ifeq (<参数 1>, <参数 2>)
ifeq ‘<参数 1 >,<参数 2>’
ifeq “<参数 1>,<参数 2>”
ifeq “<参数 1>,<参数 2>’
ifeq ‘<参数 1>,<参数 2>

上述用法中都是用来比较“参数 1”和“参数 2”是否相同,如果相同则为真;ifneq 是用来了比较“参数 1”和“参数 2”是否不相等,如果不相等的话就为真。
ifdef 和 ifndef 的用法如下:

ifdef <变量名>

如果“变量名”的值非空,那么表示表达式为真,否则表达式为假。

六、Makefile函数使用

Makefile 支持函数,类似 C 语言一样,Makefile 中的函数是已经定义好的,我们直接使用,不支持我们自定义函数。函数的用法如下:

$(函数名 参数集合)

或者

${函数名 参数集合}

调用函数和调用普通变量一样,使用符号 $ 来标识。参数集合是函数的多个参数,参数之间以逗号“,”隔开,函数名和参数之间以“空格”分隔开,函数的调用以“$”开头。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/226887.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

采样率越高噪声越大?

ADC采样率指的是模拟到数字转换器&#xff08;ADC&#xff09;对模拟信号进行采样的速率。在数字信号处理系统中&#xff0c;模拟信号首先通过ADC转换为数字形式&#xff0c;以便计算机或其他数字设备能够处理它们。 ADC采样率通常以每秒采样的次数来表示&#xff0c;单位为赫…

详解http请求头,响应头以及在实际开发中

HTTP (Hypertext Transfer Protocol) 协议是一种用于传输超文本的标准协议&#xff0c;它是 Web 通信的基础。HTTP 协议是无状态的&#xff0c;即每次请求是相互独立的&#xff0c;服务器不会记住上一次请求的信息。HTTP 协议采用客户端-服务器模式&#xff0c;客户端发起请求&…

添加新公司代码的配置步骤-Part2

原文地址&#xff1a;配置公司代码 概述 在第一部分中&#xff0c;我讨论并列出了在 SAP 中构建新公司代码时企业结构部分所需的任务。在这篇博客中&#xff0c;我将列出并讨论 FI 模块中需要配置的内容。您还记得本主题涵盖六个部分。 企业结构 - 第 1 部分 FI 配置– 第 2…

2023新优化应用:RIME-CNN-LSTM-Attention超前24步多变量回归预测算法

程序平台&#xff1a;适用于MATLAB 2023版及以上版本。 霜冰优化算法是2023年发表于SCI、中科院二区Top期刊《Neurocomputing》上的新优化算法&#xff0c;现如今还未有RIME优化算法应用文献哦。RIME主要对霜冰的形成过程进行模拟&#xff0c;将其巧妙地应用于算法搜索领域。 …

Android String.xml 设置加粗字体/修改字体颜色/动态设置修改文案

之前经常使用Spannable 这次主要在String.xml使用&#xff1a;<![CDATA[和]]> 效果&#xff1a; <resources><string name"str_bianse"><![CDATA[变色 <font color"#ff0000">曲项向天歌</font> 白毛浮绿水]]></st…

[BJDCTF2020]EzPHP 许多的特性

这道题可以学到很多东西 静下心来慢慢通过本地知道是干嘛用的就可以学会了 BJDctf2020 Ezphp_[bjdctf2020]ezphp-CSDN博客 这里开始 一部分一部分看 $_SERVER[QUERY_SRING]的漏洞 if($_SERVER) { if (preg_match(/shana|debu|aqua|cute|arg|code|flag|system|exec|passwd|…

C++新经典模板与泛型编程:用成员函数重载实现is_base_of

用成员函数重载实现is_base_of std::is_base_of是一个C 11标准中用于判断某个类是否是另一个类父类的类模板。 #include "killCmake.h"#include<string>using namespace std;class A { };class B : public A { public:B(int x): x_(x){} private:int x_; };/…

低代码——“平衡饮食”才是王道

文章目录 一、低代码的概念二、低代码的优点2.1. 高效率与快速开发2.2. 降低技术门槛2.3. 适用于快速迭代与原型开发 三、低代码的缺点3.1. 定制性不足3.2. 深度不足3.3. 可能导致技术债务 四、低代码开发的未来4.1. 深度定制化4.2. 智能化 五、低代码会替代传统编程吗&#xf…

力扣每日一题day30[226. 翻转二叉树]

给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1]示例 2&#xff1a; 输入&#xff1a;root [2,1,3] 输出&#xff1a;[2,3,1]示例 3&#…

Abaqus基础教程--胶合失效仿真

胶合是电子行业中常见的连接方式&#xff0c;abaqus中常用cohesive单元或者cohesive接触两种方法进行胶合失效仿真&#xff0c;这两种方式操作方法有所差别&#xff0c;但结果一般大同小异。 本例模型比较简单&#xff0c;建模过程从略&#xff0c;使用静态分析&#xff0c;使…

月薪6W!美团、网易等大厂急招HarmonyOS开发!

近期&#xff0c;多家互联网公司发布了多个和鸿蒙系统有关的岗位。 不仅如此&#xff0c;还与Windows等主流老牌操作系统并列&#xff0c;并且排在首位介绍。 此外&#xff0c;今日头条招聘Android开发工程师也提及岗位需要“负责今日头条 Android、鸿蒙系统等新技术方向调研…

代码随想录算法训练营第三十七天|1049. 最后一块石头的重量 II ,494. 目标和,474.一和零

1049. 最后一块石头的重量 II - 力扣&#xff08;LeetCode&#xff09; 有一堆石头&#xff0c;用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。 每一回合&#xff0c;从中选出任意两块石头&#xff0c;然后将它们一起粉碎。假设石头的重量分别为 x 和 y&am…

前端Flex布局的常用属性及其应用场景

目录 学习目标&#xff1a; 学习内容&#xff1a; 什么是flex布局&#xff1f; 如何使用flex布局&#xff1f; 容器属性 项目属性 flex布局有哪些主要的属性&#xff1f; flex布局的优缺点是什么&#xff1f; 学习时间&#xff1a; 最后总结&#xff1a; 学习目标&am…

医院信息系统源码,采用JAVA编程,支持跨平台部署应用,满足一级综合医院(专科二级及以下医院500床)的日常业务应用

医院HIS系统源码&#xff0c;HIS系统全套源码&#xff0c;支持电子病历4级&#xff0c;自主版权 his医院信息系统内设门诊/住院医生工作站、门诊/住院护士工作站。各工作站主要功能依据职能要求进行研发。如医生工作站主要功能为编辑电子病历、打印、处理医嘱&#xff1b;护士工…

虾皮关键词工具:优化您的Shopee商品曝光度和搜索排名

在Shopee平台上&#xff0c;关键词工具对于提高商品曝光度和搜索排名非常重要。本文将向您介绍一些值得推荐的关键词工具&#xff0c;这些工具可以帮助您找到合适的关键词以优化您的商品列表&#xff0c;并提高搜索排名和曝光度。 先给大家推荐一款shopee知虾数据运营工具知虾免…

读者和写者问题

它可以解决的问题&#xff1a; 可以支持多个读者访问&#xff0c;通过count计数 来实现多个读者访问的时候是互斥的&#xff0c;不会出现不符合进程同步的问题&#xff1a;设置mutex互斥锁&#xff0c;保证count或count--和if Pv(mutex)是一气呵成的 读写公平&#xff0c;通过…

软件工程之UML建模

从公众号转载&#xff0c;关注微信公众号掌握更多技术动态 --------------------------------------------------------------- 一、建模基础 1.建模的底层逻辑 用一个公式表达建模的底层逻辑&#xff1a;建模 图形 逻辑 现实的抽象&#xff0c;用一句概括即是用图形逻辑…

一张图理解接口测试框架

测试框架先向测试数据库中插入测试数据&#xff08;如&#xff1a;name”Tom“&#xff09; 调用被测系统提供的接口&#xff08;传参&#xff1a;name”Tom“&#xff09; 从测试数据库中查到符合参数的数据 将查询到的数据组成Json格式&#xff0c;并返回给测试框架 提供…

添加新公司代码的配置步骤-Part4

原文地址&#xff1a;配置公司代码 概述 这是一系列讨论和列出向系统添加新公司代码时必须完成的事务的四篇博客中的最​​后一篇。以下是这四个文档涵盖的主题列表&#xff1a; 企业结构 - 第 1 部分 FI 配置 – 第 2 部分 SD 配置 – 第 3 部分 物流 – 概述 – 第 3 部分…

SpringBoot集成系列--ElasticJob

文章目录 一、集成步骤1、添加 ElasticJob 的依赖2、配置 ElasticJob3、定义Job 二、ElasticJob-UI三、Elastic-Job分片理解四、原理 一、集成步骤 1、添加 ElasticJob 的依赖 引入相关依赖到pom.xml <!-- Elastic-Job --> <dependency><groupId>org.apac…