Makefile基础教程(函数的使用)

news2024/10/7 14:34:27

文章目录

  • 前言
  • 一、自定义函数
    • 1.使用示例
    • 2.注意事项
  • 二、预定义函数
    • 1.call函数
    • 2.abspath函数
  • 总结


前言

在Makefile中也是存在函数的,在 Makefile 中,可以使用函数调用来处理变量、字符串和路径等操作。那么下面就来看看是如何在makefile中使用函数的吧。

一、自定义函数

1.使用示例

在 Makefile 中,可以使用自定义函数来完成一些特定的操作。自定义函数一般使用 define 和 endef 命令来实现,在 define 和 endef 之间是函数体。自定义函数在使用 call 函数进行调用,在调用时传递参数。自定义函数可以使用 Makefile 内置的命令和变量,也可以使用自定义变量和命令。

下面是一个自定义函数的例子:

define myfunc
	$(if $(filter $(1), yes), \
		@echo "My function param is Yes", \
		@echo "My function param is Not Yes" \
	)
endef

test:
	$(call myfunc,yes)         # 调用 myfunc 函数,输出 "My function param is Yes"
	$(call myfunc,no)          # 调用 myfunc 函数,输出 "My function param is Not Yes"

在这个例子中,使用 define 定义了一个名为 myfunc 的自定义函数,该函数接收一个参数。函数体使用了 if 和 filter 命令,判断传入的参数是否为 “yes”。调用 myfunc 函数时,使用 call 函数进行调用,并传递一个参数。

执行结果:
在这里插入图片描述

2.注意事项

1.自定义函数是一个多行变量,无法直接调用,需要使用call函数调用。

2.自定义函数用于定义命令集合,并应用于规则中。

二、预定义函数

1.call函数

在 Makefile 中,call 函数用于调用一个自定义函数,并返回其结果。其语法为:

$(call function-name,param1,param2,...)

其中,function-name 为自定义函数的名称,param1、param2等为传递给函数的参数值,多个参数用逗号分隔。

call 函数的返回值为自定义函数的输出结果,可以使用变量来接收它。例如:

define my-func
    # some operations
    @echo "hello world"
endef

result := $(call my-func)

在上述例子中,我们定义了一个名为 my-func 的自定义函数,其中输出了一行 “hello world”。然后,使用 call 函数来调用这个函数,并将结果赋值给 result 变量。

需要注意的是,在自定义函数中使用 $(result) 就可以使函数的结果返回给调用者。而在调用 call 函数时,需要将其结果存储到一个变量中以便之后的使用。

2.abspath函数

abspath 函数用于将路径转换为绝对路径。其语法为:

$(abspath names...)

其中,names 可以是一个或多个路径名,路径名之间用空格分隔。

abspath 函数将路径名解释为相对于当前工作目录的相对路径,并将其转换为绝对路径。如果路径名已经是绝对路径,那么 abspath 函数将原样返回该路径名。使用 abspath 函数可以避免在 Makefile 中出现因相对路径引发的错误。

代码例子:

define func1
	@echo "I am $(0)"	
endef

var := $(call func1)
var1 := $(func1)
var2 := $(abspath ./)
var3 := $(abspath test.cpp)

test:
	$(call func1)
	@echo "var = $(var)"
	@echo "var1 = $(var1)"
	@echo "var2 = $(var2)"
	@echo "var3 = $(var3)"

运行结果:
在这里插入图片描述

总结

这里有一些需要注意的地方我给大家例举出来:

自定义函数的名称需与定义时一致。

在自定义函数中返回值需要使用 $(var) 形式进行返回,例如:$(call my-func)。

自定义函数传递参数时并不需要显式声明参数类型,如何使用这些参数完全由函数实现者定义。

因此,在使用自定义函数时需要先进行定义,随后才能调用。而预定义函数则可以直接调用。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机网络基础(四)—— 什么是TCP/IP协议?是两种网络协议?

文章目录 01 | 🍓 概念 \color{red}{概念} 概念🍓02 | 🍊 T C P / I P 分层模型 \color{orange}{TCP/IP分层模型} TCP/IP分层模型🍊03 | 🍋 数据链路层协议 \color{yellow}{数据链路层协议} 数据链路层协议&#x1f34…

景区剧本杀小程序

景区剧本杀具有以下几个方面的前景: 景区旅游升级:随着人们对于景区旅游体验的多样化需求增加,景区剧本杀作为一种互动性强、参与感强的旅游体验项目,将会得到越来越多游客的喜爱和关注。 移动互联网应用:景区…

C++ 有元 内部类 匿名对象

有元 使用有元就可以突破封装,可以直接对类当中 私有的 成员 成员函数等等进行访问,在某一次上提供了遍历,但是这增大的 耦合性,破坏了封装,所以建议有元不要多用。 所谓耦合性就是 ,某两个 东西的 关系&a…

程序员开发Linux常用命令

本文对程序开发过程中常用的Linux命令进行总结,随时进行补充,属于科普篇,希望对大家有所帮助 file命令 该命令用于查看文件的基本信息,比如编码格式,文件类型等信息,对于可执行程序或者动态链接库文件&am…

【Python入门知识】类和对象,要想学的好基础得打好

前言 嗨喽~大家好呀,这里是魔王呐 ❤ ~! Python 类/对象 Python 是一种面向对象的编程语言。 Python 中的几乎所有东西都是对象,拥有属性和方法。 类(Class)类似对象构造函数,或者是用于创建对象的“蓝图”。 创建…

Java 判空的常见方法

一、 对象判空 if (obj ! null) {// 进行对象非空判断 }Object obj null; // 或者 obj new Object(); if (obj null) {// 对象为空 }另外,Guava 库还提供了一个更方便的方法,使用方式如下: import com.google.common.base.Objects;if (O…

SOLIDWORKS 30个实用小技巧

很多人在学习SolidWorks时,会有很多疑问,都不知道如何解答,所以走了很多弯路。今天,我们就来讲讲在学习SolidWorks中的那些小技巧吧! 1、SOLIDWORKS技巧之按“空格键:”弹出快捷菜单双击某一视图&#xff0…

webSocket介绍及项目实战【在线聊天系统】

文章目录 一:消息推送常用方式介绍1.1 轮询:浏览器以指定的时间间隔向服务器发出HTTP请求,服务器实时返回数据给浏览器1.2 长轮询:浏览器发出ajax请求,服务器端接收到请求后,会阻塞请求直到有数据或者超时才…

学习之-Spring Cache缓存框架应用本地缓存

此文章用于个人学习记录,原文地址:https://zhuanlan.zhihu.com/p/452315531 如果想了解springCache与redis的交互请看其他文章 缓存是web项目不可或缺的一部分,通过缓存能够降低服务器数据库压力,提高服务器的稳定性及响应速度。…

Rust + 嵌入式:强力开发组合

Rust 的由来 Rust 编程语言的灵感诞生于一次意外。2006年,当 Graydon Hoare 回到位于温哥华的公寓时,发现电梯又因为软件崩溃出了故障。住在 21 楼的他无奈爬楼时,不禁心想,“我们搞计算机的,怎么连个能正常运行的电梯…

接口测试要会什么技能?测试老鸟总结,从接口到接口自动化全面盲扫...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 Python自动化测试&…

YOLOv5改进:引入DenseNet思想打造密集连接模块,彻底提升目标检测性能

目录 一、密集连接模块的介绍1、密集连接的概念2、密集连接与残差连接的对比3、DenseNet的结构 二、 YOLOv5中引入密集连接模块的原因1、密集连接模块对于目标检测的优势2、密集连接模块对目标检测性能的影响 三、 YOLOv5中密集连接模块的具体实现1、使用DenseNet的基本单元Den…

怎样才能尽快从开发岗转到产品经理岗位?

越来越多的开发同学随着工作年限的增长都会产生类似的想法。 当然,背后的原因也是多种多样,像薪资上的限制、行业前景的担忧等等,很多同学则踌躇在原地不敢转产品岗位,而有的同学则是通过各种不同方式顺利转岗到产品经理岗位&…

树莓派从源码构建安装Git最新版

1、查看Git版本 首先我们通过SSH客户端连接树莓派,在树莓派中通过查看 Git 版本信息,我们只能看到最高版本显示为 2.30.2,并且通过apt安装也无法将Git更新到最新版。 git --version sudo apt upgrade git那么我们只能通过从源代码来构建安装Git了&…

单片机复习题第二章

1.在AT89S52单片机中,如果采用6MHz晶振,一个机器周期为2us。 时钟周期的振荡频率为fosc,则时钟周期T1/fosc。 一个机器周期包括12个时钟周期。 2.内部RAM中,位地址为40H,88H的位,该位所在字节的字节地址分别…

scrollIntoView 的使用

描述 将调用此方法的元素滚动到浏览器窗口的可见区域。 scrollIntoView 官方文档 用法 element.scrollIntoView() 用法同 element.scrollIntoView(true) element.scrollIntoView(alignToTop) true 表示 element 元素顶部与可见区域的顶部对齐,默认值false 表示 el…

基于html+css的图展示56

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

Packet Tracer - 第 2 层 VLAN 安全

Packet Tracer - 第 2 层 VLAN 安全 目标 在 SW-1 和 SW-2 之间连接新的冗余链路。 启用中继,并在 SW-1 和 SW-2 之间的新中继链路上 配置安全。 创建新的管理 VLAN (VLAN 20) 并将管理 PC 连接到 该 VLAN。 实施 ACL 以阻…

Java学习-GUI编程-JFrame窗口

Java学习-GUI编程-JFrame窗口 public class TestJFrame {public void init(){JFrame jf new JFrame("这是一个JFream窗口");jf.setVisible(true);jf.setBounds(100,100,400,400);JLabel label new JLabel("这是一个label");label.setHorizontalAlignmen…

Linux之shell函数和正则表达式(八)

1、函数 1、函数概述 shell 中允许将一组命令集合成语句形成一段可用代码,这些代码块称为 shell 函数,给这段代码起个名字称为函数名,后续可以直接调用该段代码的功能 2、定义函数 函数名() {函数体(一堆命令的集合&#xff0…