借助实例轻松掌握 Makefile -- 萌芽破土



萌芽破土篇

在这里插入图片描述

实例1:hello world


编辑 Makefile

all:echo "hello world"


编译执行

$ make
$ make all 


结果输出

在这里插入图片描述


语法说明

  • echo 前面必须只有 TAB(即你键盘上的 TAB键),且至少有一个 TAB,不能用空格代替。


实例2:Makefile定义多个目标


编辑 Makefile

all:echo "hello world"test:echo "hello test"


编译执行

$ make 
$ make all
$ make test 


结果输出

在这里插入图片描述


语法说明

  • Makefile 中包含多个目标时,直接使用 make 编译省略模式下,默认编译第一个目标。


实例3:Makefile注释


编辑 Makefile

all:@echo "hello world"test:@echo "hello test"


编译执行

$ make 
$ make all
$ make test 


结果输出

在这里插入图片描述

语法说明

  • 使用 @ 符号,告诉make在运行时不要将这一行命令显示出来。


实例4:简单的依赖


编辑 Makefile

all:test@echo "hello world"test:@echo "hello test"


编译执行

$ make 
$ make test 


结果输出

在这里插入图片描述


语法说明

  • all:test 告诉 make,all 目标依赖 test 目标,这一依目标在Makefile中又被称为先决条件。出现这种目标依赖关系时,make工具会按照从左到右的先后顺序先构建规则中的每一个目标。比如这里,如果要构建 all ,那么 make 会在构建它之前先构建 test 目标。


实例5:simple程序编译

foo.c 源码

#include <stdio.h>
void foo()
{printf("This is foo()!\n");
}


main.c 源码

extern void foo();int main()
{foo();return 0;
}


编辑 Makefile

all: main.o foo.ogcc -o simple main.o foo.o
main.o: main.cgcc -o main.o -c main.c
foo.o: foo.cgcc -o foo.o -c foo.c
clean:rm simple main.o foo.o


编译执行

$ make 


结果输出

在这里插入图片描述


语法说明

  • 写 Makefile 文件的关键是理清文件之间的依赖关系。


实例6:假目标

实例 5 的 Makefile 中有一个clean文件,我们希望能够通过 clean 命令,清理历史文件。不过,在执行 clean 指令时候发现,没法对文件进行删除。这是因为 make 将 clean 当作条件,且在当前目录找到了这个文件,加上 clean 目标没有任何先决条件,所以,当我们要求 make 为我们构建 clean 目标时,它就会认为 clean 是最新的。

在这里插入图片描述

对于这种情况,可以通过 Makefile 中的假目标来解决,假目标可以通过关键字 .PHONY 定义。


编辑 Makefile

.PHONY:clean
all: main.o foo.ogcc -o simple main.o foo.o
maiin.o: main.cgcc -o main.o -c main.c
foo.o: foo.cgcc -o foo.o -c foo.c
clean:rm simple main.o foo.o


编译执行

$ make 
$ ./simple
$ make clean


结果输出

在这里插入图片描述


语法说明

  • Makefile 假目标关键字 .PHONY


实例7:Makefile变量


编辑 Makefile

.PHONY:clean
CC = gcc
RM = rm
EXE = simple
OBJS = main.o foo.o$(EXE):$(OBJS)$(CC) -o $(EXE) $(OBJS)
main.o:main.c$(CC) -o main.o -c main.c
foo.o:foo.c$(CC) -o foo.o -c foo.c
clean:$(RM) $(EXE) $(OBJS)


编译执行

$ make 
$ ./simple
$ make clean


结果输出

在这里插入图片描述

语法说明

  • 变量定义:变量名=变量值;
  • 变量引用:$(变量名) 或 ${变量名}


实例8:Makefile自动变量


编辑 Makefile

.PHONY:clean
CC = gcc
RM = rm
EXE = simple
OBJS = main.o foo.o$(EXE):$(OBJS)$(CC) -o $@ $^
main.o:main.c$(CC) -o $@ -c $^
foo.o:foo.c$(CC) -o $@ -c $^
clean:$(RM) $(EXE) $(OBJS)


编译执行

$ make 
$ ./simple
$ make clean


结果输出

在这里插入图片描述


语法说明

  • $ @ 用于表示一个规则中的目标;当一个规则中目标有多个时,$ @指的是其中任何造成命令被运行的目标;
  • $ ^ 用于表示规则中的所有先决条件;
  • $ < 用于表示规则中的第一个先决条件。
  • 在Makefile中 ’ $ ’ 具有特殊的含义,因此如果需要采用 echo 输出 ’ $ ’ ,则需要用两个连着的 ‘ $ ’;同时 ‘$ @’ 对 Shell 也有特殊的意思,因此需要在 ‘$$@’ 前面增加一个脱字节 ‘ \ ’.


附加实例

//Makefile
.PHONY: all
all: first second third@echo "\$$@ = $@"@echo "$$^ = $^"@echo "$$< = $<"
first second third://输出
$make
$@ = all
$^ = first second third
$< = first


实例9:Makefile特殊变量


1. MAKE

编辑 Makefile

.PHONY: all
all: @echo "MAKE = $(MAKE)"


编译执行

$ make 


结果输出
在这里插入图片描述


语法说明

  • MAKE 变量表示make命令名是什么;
  • 使用场景:当我们需要在Makefile中调用另外一个Makefile时需要用到它,采用这种方式有利于写一个容易移植的Makefile。



2. MAKECMDGOALS

编辑 Makefile

.PHONY: all clean
all clean: @echo "\$$@ = $@"@echo "MAKECMDGOALS = $(MAKECMDGOALS)"


编译执行

$ make 
$ make all
$ make clean
$ make all clean


结果输出
在这里插入图片描述


语法说明

  • MAKECMDGOALS 表示是当前用户输入的 make 目标是什么。


实例10:Makefile变量的类别


1. 递归扩展变量

编辑 Makefile

.PHONY: all
foo=$(var1)
var1=-$(var2)
var2=100all: @echo $(foo)


编译执行

$ make 


结果输出在这里插入图片描述


语法说明

  • = 符号定义的变量称之为递归扩展变量。



2. 简单扩展变量

编辑 Makefile

.PHONY: all clean
x = foo
y = $(x) b
x = later
xx := foo
yy := $(xx) b
xx := laterall:@echo "x = $(y), xx = $(yy)"


编译执行

$ make 


结果输出
在这里插入图片描述


语法说明

  • := 符号定义的变量称之为简单扩展变量。



3. 条件赋值变量

编辑 Makefile

.PHONY: all clean
foo = x
foo ?= y
bar ?= yall:@echo "foo = $(foo), bar = $(bar)"


编译执行

$ make 


结果输出
在这里插入图片描述


语法说明

  • ?= 符号定义的变量称之为条件赋值变量;
  • 含义:当变量以前没有定义,就定义它并将左边的值赋给它;如果先前已经定义过了,就不会改变它原来的值。


实例11:Makefile高级变量引用功能

编辑 Makefile

.PHONY: all
foo=a.o b.o c.o
bar := $(foo:.o=.c)all: @echo "bar = $(bar)"


编译执行

$ make 


结果输出在这里插入图片描述


语法说明

  • 上面实例中变量引用的一种高级功能,在赋值的同时完成后缀替换。


实例12:override指令

编辑 Makefile

.PHONY: all
override foo=100all: @echo "foo = $(foo)"


编译执行

$ make 
$ make foo=0


结果输出

在这里插入图片描述


语法说明

  • override 可以使得定义变量的值不被覆盖。如上面:make foo=0 输出的值依然为100。


实例13:Makefile模式

编辑 Makefile

.PHONY:clean
CC = gcc
RM = rm
EXE = simple
OBJS = main.o foo.o$(EXE):$(OBJS)$(CC) -o $@ $^
%.o:%.c$(CC) -o $@ -c $^clean:$(RM) $(EXE) $(OBJS)


编译执行

$ make 
$ ./simple


结果输出

在这里插入图片描述


语法说明

  • % 字符模式类似Windows操作系统中的通配符。


实例14:addprefix函数

编辑 Makefile

.PHONY: all
without_dir = foo.c bar.c main.o
with_dir := $( addprefix objs/, $(without_dir))all:@echo $(with_dir)


编译执行

$ make 


结果输出

在这里插入图片描述


语法说明

  • addprefix 用于给字符串中每个子串前都加上一个前缀,形式:$(addprefix prefix, names…)


实例15:filter 函数

编辑 Makefile

.PHONY: all
text = a.c b.c c.s d.h
text := $(filter %.c %.s, $(text))
all:@echo $(text)


编译执行

$ make 


结果输出
在这里插入图片描述


语法说明

  • filter 用于从一个字符串中,根据模式得到满足模式的字符串,形式:$(filter pattern…, text)


实例16:filter-out 函数

编辑 Makefile

.PHONY: all
text = a.c b.c c.s d.h
text := $(filter-out %.c %.s, $(text))
all:@echo $(text)


编译执行

$ make 


结果输出

在这里插入图片描述


语法说明

  • filter-out 用于从一个字符串中,根据模式滤除一部分字符串,形式:$(filter-out pattern…, text)


实例17:patsubst 函数

编辑 Makefile

.PHONY: all
text = a.c b.c c.c
text := $(patsubst %.c %.h, $(text))
all:@echo $(text)


编译执行

$ make 


结果输出

在这里插入图片描述


语法说明

  • patsubst 用于字符串替换;同时patsubst函数可以使用模式,所以也可以用于替换前缀等;形式:$(patsubst pattern,replacement,text)


实例18:strip 函数

编辑 Makefile

.PHONY: all
src = a.c  b.c  c.c
dst := $(strip $(src))
all:@echo "src = $(src)"@echo "dst = $(dst)"


编译执行

$ make 


结果输出

在这里插入图片描述


语法说明

  • patsubst 用于去除变量中多余的空格;形式:$(strip string)


实例19:wildcard 函数

编辑 Makefile

//显示当前Makefile目录下所有 .c 文件
.PHONY: all
src = $(wildcard *.c)
all:@echo $(src)


编译执行

$ make 


结果输出(默认Makefile所在目录中包含了foo.c main.c bar.c等文件)

在这里插入图片描述


语法说明

  • wildcard 通配符函数,类似于 Windows 或 linux 命令行中的 " * ";形式:$(wildcard pattern)

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算是2022年上半年中国企业服务产业的一个阶段性总结吧

这篇文章是应一个朋友的问答访谈而遗留整理的 &#xff08;1&#xff09;IaaS&#xff1a;云 中国的云计算这个市场&#xff0c;咱们从四个方面来说&#xff1a;技术、资本、竞合、生态。 一、技术 1、私有云、公有专属云、公有云&#xff0c;百花齐放。尤其现在还有行业云&…

介绍中国传统节日的网页html,介绍中国传统节日的作文4篇

介绍中国传统节日的作文如何写&#xff1f;中国传统节日丰富多彩&#xff0c;让我们的传统节日永远继承下去&#xff0c;让我们的传统文化光辉灿烂。本文是小编为大家整理的介绍中国传统节日的作文4篇_中华传统节日作文大全&#xff0c;欢迎阅读。 更多关于中国传统节日作文内容…

通用人工智能综述 从背景介绍到API调用

通用人工智能综述 通用人工智能综述背景介绍模型演进之前的模型的问题学习三阶段数据组织和效果评估 注册API调用官方提供的模型官方功能汇总Notion元语AI指令汇总 通用人工智能综述 背景介绍 ChatGPT是一个通用功能型助手。2022年12月5日&#xff0c;OpenAl首席执行言Sam Al…

聚观早报 | 腾势D9用户一半来自原BBA车主;Windows7将彻底退出

今日要闻&#xff1a;App Store创下超3200亿美元营收&#xff1b;腾势D9用户一半来自原BBA车主&#xff1b;微软洽谈100亿美元增持 OpenAI&#xff1b;Windows 7将彻底退出历史舞台&#xff1b;马斯克财富缩水破吉尼斯世界纪录 App Store创下超3200亿美元营收 1月11日消息&am…

Razorpay 印度第三方支付机构 Razorpay 支付,放款,还款实际操作

Razorpay 作为印度本土的一家支付公司&#xff0c;类似中国的支付宝 微信&#xff0c;本篇记录一下对接印度第三方支付公司进行放款&#xff0c;收款操作 先看下支付&#xff0c;上面的截图是整个付款流程 第一步就不说了&#xff0c;这个公司会开好&#xff0c;然后会拿到一个…

海外新兴热点 : Social Token 及该类代币汇总

创新项目分成两种&#xff0c;一种为既定命题提供解决方案&#xff0c;比如 L2&#xff0c;或者各种 AMM&#xff0c;依靠技术的发展轨迹就能对这类项目进行价值判断。另一种是为了提出命题的&#xff0c;比如比特币提出了我们是否需要去中心化货币&#xff0c;这类项目在早期还…

全球银行业巨头汇丰银行在印度推出基于代币化的应收账款系统

点击上方 “蓝色字” 可关注我们&#xff01; 暴走时评&#xff1a; 根据6月18日的公告&#xff0c;全球主要银行集团汇丰银行已在印度企业客户的应收账款基础设施中落实了数字应收账款工具&#xff08;HSBC DART&#xff09;&#xff0c;该工具基于澳大利亚的区块链金融科技公…

【如何通过外汇牌价了解外汇市场?​】

从中国人民银行的外汇价格来看&#xff0c;外汇市场的外汇价格是指外汇交易的中间价格&#xff0c;是外汇市场交易的计算基准。对于投资、金融管理或进出口贸易&#xff0c;必须实时了解外汇价格。在中国&#xff0c;汇率的中心价格每天由中国人民银行公布。 第一&#xff0c;外…

什么伦敦银交易软件支持多国语言

MT4在全世界都被广泛地使用&#xff0c;很多伦敦银投资者都对它十分熟悉&#xff0c;但并不是很多人知道MT4也支持众多的语言界面&#xff0c;不同地区的投资可以自行选择&#xff0c;如果大家下载MT4后发现默认的语言不是自己的使用习惯&#xff0c;可以按以下的方式进行切换&…

Nostro Account 本国银行在外国银行持有的外币账户

2019独角兽企业重金招聘Python工程师标准>>> DEFINITION OF NOSTRO ACCOUNT A bank account held in a foreign country by a domestic bank, denominated in the currency of that country. Nostro accounts are used to facilitate settlement of foreign exchang…

Coinbase将平台用户帐户链接到其钱包应用

点击上方 “蓝色字” 可关注我们&#xff01; 暴走时评&#xff1a; 根据3月12日的公告&#xff0c;Coinbase最近推出了一项服务&#xff0c;将其平台上的用户帐户与其钱包应用程序相关联。 据该公司称&#xff0c;Coinbase Wallet与其网站Coinbase.com应用程序略有不同。对于后…

MT4如何使用软件开展自动交易详细步骤

要在MT4上进行自动交易&#xff0c;您需要使用专门设计的交易机器人程序或EA(Expert Advisor)。以下是使用MT4软件下载&#xff08;www.cifco8.cn/mt4.html&#xff09;开展自动交易的一般步骤&#xff1a; 编写或购买一个EA程序&#xff0c;并将其导入到MT4。 在MT4图表上选择…

通过在 BlockBank APP V2 版本持有 USDCoin 来赚取收益

BlockBank 为用户提供能够赚取稳定币 USD Coin (USDC) 利息收益的服务,利率高达美国全国传统储蓄账户平均水平的 60 倍。 最重要的是,用户的 USDC 由 BlockBank 担保,确保用户赚取收益。随着今年第三季度,BlockBank APP V2版本更新,用户将能够查看自己的实时投资组合并接…

报告:使用加密货币进行跨境汇款的人数越来越多

点击上方 “蓝色字” 可关注我们&#xff01; 暴走时评&#xff1a; 区块链研究公司Clovr在其最新报告中表示&#xff0c;使用加密货币进行汇款的人数激增。大部分原因是因为使用Paypal等传统方法成本太高。世界银行数据显示&#xff0c;2017年有超过1480亿美元从美国汇往国外。…

MultiBank Group宣布在阿联酋和新加坡取得两项新牌照

全球首屈一指的金融衍生品机构MultiBank Group宣布&#xff0c;其子公司已获得阿联酋证券和商品管理局(“SCA”)和新加坡金融管理局(“MAS”)颁发的备受业界推崇的新牌照&#xff0c;巩固了该集团作为全球受监管最多经纪商的地位。 自成立以来&#xff0c;MultiBank Group一直…

中国四大银行正在大规模内测数字货币APP|可凭手机号完成转账

数字货币由央行牵头进行&#xff0c;各家银行此前数月正在就落地场景等进行测试。目前&#xff0c;部分大行内部员工已经开始使用&#xff0c;用于转账、缴费等场景。 “数字货币”在我国落地的脚步声越来越近。 数位国有大行人士表示&#xff0c;正在深圳等地大规模测试数字钱…

好汇阁外汇MT4-API多账户跟单交易管理系统介绍

1.软件简介 1.1 MT4 跨平台api多帐户云跟单管理系统 MT4 跨平台多帐户云跟单管理系统是国际先进的跨平台多账号本地跟单管理系统&#xff01;支持全球所有的 MT4 交易软件的经纪商。不需要经纪商开放任何权限&#xff0c;不需要 API 接口&#xff0c;不需要 EA 插件&#xff…

利用百度情感分析进行微博评论数据分析及可视化(万字长文)

总览&#xff1a; *输入&#xff1a;*关键词 *输出&#xff1a;*分日期情感均值折线图&#xff0c;主题词云&#xff0c;分省市情感均值折线图 一、微博数据爬取 1.爬取指定关键词相关的微博 2.根据爬取到的微博信息爬取到相关的评论数据 这里主要借鉴了 https://github.com/…

神网站PaperWithoutCode:举报无法复现的论文,让一作社死??

文 | 小戏 几乎是可以肉眼可见的看到机器学习领域的论文几何级的增长&#xff0c;在铺天盖地的论文雪花纸片般涌来时&#xff0c;灌水、可复现性、工作真实的意义这些概念也伴随着 Paper 的洪水进入了人们的视野。谈及科研&#xff0c;我们总是站在以往研究的基础上&#xff0c…

微博评论数据爬取以及分析

#不许你没看过の系列&#xff01;# 吹爆最近的国漫《哪吒之魔童降世》 从故事情节、角色设计到特效处理 都非常牛&#xff01;&#xff01;&#xff01; #连海报都好好看啊# 上映首周票房已经达到14.1亿&#xff01; 打破国漫票房记录&#xff01; 豆瓣评分达到8.6分&…