首页 > 其他分享 >17_makefile基本语法(上)

17_makefile基本语法(上)

时间:2024-03-31 22:13:13浏览次数:11  
标签:变量 17 make makefile 语法 使用 所示 hello 赋值

makefile基本语法(上)

一.设置vim 首行缩进

vi /etc/vim/vimrc (rc 结尾的一般为配置文件)
输入set tabstop=4,保存后退出即可。便发现vim 打开后的缩进变成4 个空格了

image-20240310153706473

二.Makefile 基本语法

语法格式:
目标:依赖
(tab)命令
举例:

image-20240310153712475

目标:all
依赖:空
命令: gcc hello.c -o hello
上面的例子也可以写成:

image-20240310153730255

目标:all 和hello.o
依赖:hello.o 和hello.c
命令: gcc hello.c -o hello 和gcc -c hello.c
因为all 依赖hello.o 文件,所以要先执行gcc -c hello.c 得到hello.o 文件,然后才可以执行gcc hello.c -o hello。所以输入make 命令后执行顺序如下。

image-20240310153755102

在编译的时候,我们可以使用make 目标来编译,如果我们不指定目标的话,默认执行的是第一个目标所对应的规则。也就是说make 和make all 是一样的。如上面的例子。
接下来,我们使用make 目标的方法来编译。我们修改makefile 代码如下:

image-20240310153818253

然后我们输入命令make clean 就可以直接执行rm -rf *.o hello 命令。如下图所示:

image-20240310153828296

但是,我们在当前目录下不能有和makfile 目标名一样的文件。比如我在当前目录下创建一个名为clean 的文件,然后在执行make clean 命令就会报错。如下图所示:

image-20240310153835064

为了解决这个问题,makfile 引入了一个新的概念,叫做伪目标,我们使用伪目标来声明clean 就可以避免与当前目录下的同名文件发生冲突。
伪目标格式:
.PHONY:目标
所以,我们可以把上面的代码修改成如下图所示:

image-20240310153851801

然后我们在执行make clean 命令。尽管当前目录下有clean 同名文件,make clean 命令也可以执行成功。如下图所示:

image-20240310153910591

三.Makefile 变量和变量赋值

变量可以许多地方使用,比如目标,依赖,或者命令。
变量的赋值可以使用:= ?= := +=
变量的使用:通过$()来完成变量的引用。
示例1:
使用:=来赋值

image-20240310153917390

使用:=来给变量赋值,是立刻赋值,在执行var:=aaa 的同时变量值已经被确定了,所以最后打印为aaabbb,而不是cccbbb

image-20240310153924355

示例2:
使用=来赋值

image-20240310153936148

使用=来赋值,是延迟赋值,使用他来赋值是makfile 里面最后被指定的值。因为我们最后给变量var1赋值为ccc,所以最后打印为cccbbb,而不是aaabbb,如下图所示:

image-20240310153947685

示例3:
使用?=来赋值

image-20240310153954249

使用?=来赋值的意思为,如果var1 变量前面没有被赋值,那么就给他赋值为ccc,如果前面已经赋值了,就使用前面的值,所以,打印为aaabbb,而不是cccbbb,如下图所示。

image-20240310154004824

然后我们注释掉第一行代码,makefile 种的注释为#

image-20240310154015644

在运行就会打印cccbbb,因为前面没有给var1 变量赋值。如下图所示

image-20240310154027798

示例4:使用+=来赋值
使用+=来赋值是追加赋值,是在我们前面定义的好的字符串里面在添加进去新的字符串,所以运行会打印aaa bbbccc。不过中间会有空格,如下图所示;

image-20240310154039716

使用+=也类似与我们这样赋值,如下图所示:

image-20240310154045901

如果赋值很长,我们也可以使用换行符\,如下图所示

image-20240310154051059

四.自动化变量

这里介绍三个最常用的自动化变量:
$@:表示所有目标
$<:表示第一个依赖文件,如果依赖模式是%,那么它就表示一系列文件。
(%为通配符,类似linux 上的*)
$^:表示所有依赖。
在了解这个三个自动化变量之前,我们先来写一个程序:
main.c

image-20240310154109249

hello.c

image-20240310154115174

hello.h

image-20240310154119427

Makefile

image-20240310154124007

使用这个makefile 虽然也可以成功编译,但是,一旦编译的文件多了,如果我们还这样来编写makfile 就会变得非常的复杂。所以,自动化变量就排上用场啦。
接下来我们一步一步的来简化我这个makefile。
简化一:用变量表示依赖文件

image-20240310154139442

后面如果我们在增加依赖文件的话,我们直接在变量var 后面增加就可以了。
简化二:
使用通配符%,和自动化变量$@ $<替代依赖和目标,简化完如下图所示:

image-20240310154151438

简化三:使用自动化变量$^表示所有依赖,简化完如下图所示:

image-20240310194144079

标签:变量,17,make,makefile,语法,使用,所示,hello,赋值
From: https://www.cnblogs.com/mzx233/p/18107356

相关文章

  • Python基础语法(四)
    目录一.while循环的基础语句二.while循环案例三.while循环的嵌套四.while循环嵌套的案例一.while循环的基础语句1.while的条件需得到布尔类型,True表示继续循环,False表示结束循环。2.需要设置循环终止的条件,如i+=1配合i<100,就能确保100次后停止,否则将无限循环。3......
  • markdown语法规则
    Markdown语法1标题#一级标题##二级标题###三级标题####四级标题#####五级标题######六级标题注意:#与后面的文字需要空格备注:注释的语法为>文字(>与文字之间需要有空格)2代码代码块:​```c#include<stdio.h>intmain(){return0;}​```行......
  • The 2023 ICPC Asia Jinan Regional Contest (The 2nd Universal Cup. Stage 17: Jina
    The2023ICPCAsiaJinanRegionalContest(The2ndUniversalCup.Stage17:Jinan)D.LargestDigit题意:给定两个范围la,ra,lb,rb,求在两个范围内选任意两个数相加,求最大的数位思路:暴力枚举即可,遇到9跳出循环voidsolve(){llla,ra,lb,rb;cin>>la>>r......
  • 题解:AT_arc175_b [ARC175B] Parenthesis Arrangemen
    前言警示后人:字符串最大长度为\(65535\),会\(RE\)!!!\(10^7\)会爆栈!!!题意给出一个括号序列\(s\),有两种操作方式,交换两个字符需要花费\(A\),直接修改一个字符需要花费\(B\),求使这个序列合法需要的最小花费。分析我们可以先将\(s\)中能匹配的括号序列消除掉(即括号匹配......
  • 软件工程日报017
     第17天第二天第三天第四天第五天所花时间(包括上课) 7h    代码量(行) 1500    博客园(篇) 1    所学知识 Kotlin高阶语法    ......
  • 二、Java语法基础
    1、Java语言的关键字、标识符及命名规范1)java关键字2)标识符3)JAVA中的命名规范 包名的命名规范:域名.公司名称.项目名称.模块名称 类的命名规范:首字母大写,第二个单词的首字母大写,以此类推。2、进制间的转换(二进制、十进制)1)十进制->二进制 采用除2取余算法,一直除......
  • Hive-技术补充-ANTLR的真实语法世界
    一、上下文上一篇博客<Hive-技术补充-ANTLR语法编写>,我们了解了如何使用ANTLR语法来表达词法结构和语法结构,下面我们循循渐进的处理身边用过的一些文件或语言:CSV、JSON、DOT、Cymbol、R 二、解析CSV文件有这样一份csv文件vidata.csvDetails,Month,AmountMidBonus,Ju......
  • YTU 1712 排列的字典序问题
    题目描述n个元素{1,2,……,n}有n!个不同的排列。将这n!个排列按字典序排列,并编号为0,1,…,n!-1。每个排列的编号为其字典序值。例如,当n=3时,6个不同排列的字典序值如下: 给定n以及n个元素{1,2,……,n}的一个排列,计算出这个排列的字典序值,以及按字典序排列的下一个排列。......
  • 缺失的第一个正数 - LeetCode 热题 17
    大家好!我是曾续缘......
  • neo4j使用详解(六、cypher常用函数语法——最全参考)
    Neo4j系列导航:neo4j及简单实践cypher语法基础cypher插入语法cypher插入语法cypher查询语法cypher通用语法cypher函数语法4.常用函数主要包括谓词函数(断言函数)、标量函数、聚合函数、字符串函数以及集合函数4.1.谓词函数(断言函数)谓词函数返回true或者false,主要......