首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

GNU Make:为什么调用函数不能用于简单的扩展变量?$1不是扩展的

GNU Make是一个构建自动化工具,用于管理和构建软件项目。它使用Makefile文件来定义构建规则和依赖关系。

在GNU Make中,可以使用函数来处理变量和执行一些操作。函数可以接受参数,并返回结果。然而,对于简单的扩展变量,不能直接在函数中使用$1来引用参数。

这是因为在GNU Make中,$1等符号是用于引用Makefile规则中的参数,而不是函数参数。在Makefile规则中,$1表示第一个参数,$2表示第二个参数,以此类推。因此,在函数中使用$1将被解释为Makefile规则中的参数,而不是函数参数。

如果想在函数中使用参数,可以通过将参数传递给函数,并在函数内部使用$(1)来引用参数。这样可以避免与Makefile规则中的参数混淆。

以下是一个示例,说明如何在GNU Make中使用函数处理变量:

代码语言:txt
复制
# 定义一个函数,将参数转换为大写
define to_upper
$(shell echo $(1) | tr '[:lower:]' '[:upper:]')
endef

# 定义一个变量
name := john

# 使用函数处理变量
upper_name := $(call to_upper,$(name))

# 打印结果
all:
    @echo $(upper_name)  # 输出 "JOHN"

在上面的示例中,我们定义了一个名为to_upper的函数,它将参数转换为大写。然后,我们定义了一个名为name的变量,并使用函数to_upper将其转换为大写,并将结果存储在upper_name变量中。最后,我们在Makefile规则中打印出upper_name的值。

需要注意的是,GNU Make中的函数和变量处理是在解析Makefile时进行的,而不是在运行时。因此,函数的参数和结果都是在解析Makefile时确定的。

关于GNU Make的更多信息和函数列表,可以参考腾讯云的GNU Make产品文档:GNU Make产品文档

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【手记】走近科学之为什么明明实现了IEnumerable的类型却不能调用LINQ扩展方法

比如Json.NET的JObject明明实现了IEnumerable,具体来说是IEnumerable>,按说JObject类型的对象是可以直接调用...Select、Where等linq扩展方法的,但偏偏就是不行,代码如下: using System.Linq; ... var jobj = new JObject(); var xxx = jobj.Select...(x=>x); //报错:JObject未包含Select定义,也不存在第1个参数为JObject的Select扩展方法... foreach(var x in jobj) { } //可以 var xxx...= ((IEnumerable>)jobj).Select(x=>x); //也可以 究竟是人性的扭曲还是道德的沦丧?...,等于JObject直接和间接实现了两个不同的IEnumerable,当.Select的时候编译器不能确定调用哪个类型的Select,所以就这样了。

80410

Makefile 的使用

D 在前面是立即变量,那么现在它还是立即变量 在 GNU make 中对变量的赋值有两种方式:延时变量、立即变量。...make 首先调用命令处理依赖,进而才能创建或更新目标。 当然,一个规则也可以是用于解释怎样和何时执行一个动作,即打印提示信息。...3.4.3 其他函数 (1)$(foreach var,list,text) 前两个参数,var和list将首先扩展,注意最后一个参数text此时不扩展;接着,list 扩展所得的每个字,都赋给var...注意:仅能计算‘then-part’和‘else-part’二者之一,不能同时计算。这样有可能产生副作用(例如函数 shell 的调用)。...所以,不能采用‘ (originvariable)变量‘variable’是一个查询变量的名称,不是对该变量的引用。

4.3K42
  • Makefile 的使用(在 Linux 中使用 make 命令来编译程序)

    要想完整地了解 Makefile 的规则,请参考《GNU Make 使用手册》,以下仅粗略介绍。...D 在前面是立即变量,那么现在它还是立即变量 在 GNU make 中对变量的赋值有两种方式:延时变量、立即变量。...通常,如果一个依赖发生了变化,就需要规则调用命令以更新或创建目标。但是并非所有的目标都有依赖,例如,目标“clean”的作用是清除文件,它没有依赖。 规则一般是用于解释怎样和何时重建目标。...make 首先调用命令处理依赖,进而才能创建或更新目标。 当然,一个规则也可以是用于解释怎样和何时执行一个动作,即打印提示信息。...注意:仅能计算‘then-part’和‘else-part’二者之一,不能同时计算。这样有可能产生副作用(例如函数 shell 的调用)。

    9.1K10

    【makefile】

    下面对makefile的相关问题进行简单介绍: 1、Makefile的基本结构 Makefile的一般结构: target……:dependency…… command…… 结构中各部分的含义: (1...(2)变量定义:在Makefile中可以定义一系列的变量,变量一般都是字符串,当Makefile被执行时,变量的值会被扩展到相应的引用位置上。...如果目标不是函数库文件(Unix下是[.a],Windows下是[.lib]),那么,其值为空。 $的第一个目标名字。...2.4 Makefile中的函数 在Makefile中可以使用函数来处理变量,从而让命令或规则更为的灵活和具有智能,函数调用,很像变量的使用,也是以“$”来标识的,函数调用后,函数的返回值可以当做变量来使用...语法如下: #用'wildcard' 函数找出当前目录中所有的".c"文件 SOURCES=$(wildcard *.c) 3、运行 make 3.1 Make的执行 一般来说,最简单的就是直接在命令行下输入

    2K00

    windows10搭建nas详细(docker搭建开发环境)

    Code: 轻量级但功能强大的源代码编辑器 Tup: 用于调用编译命令的构建系统 ARM GNU Compiler: 用于交叉编译代码 OpenOCD: 用与使用STLink/v2编程器对ODrive...进行烧录 GNU MCU Eclipse’s Windows Build Tools: 用于工程构建 工具打包下载: 链接 https://pan.baidu.com/s/1BphTCa4OrzmEFmStDXAbHg...5.2 安装 Visual Studio Code 扩展插件 所需扩展插件: C/C++ Cortex-Debug 推荐安装的扩展插件: Include Autocomplete Path Autocomplete...依次点击菜单中的 Terminal -> Run Build Task… 等待构建、编译完成 虽然编译完成了,但是上边的构建过程存在一些问题,这是由于我们使用的源码包而不是通过 git clone...VSCode配置会在此终端中运行命令make flash,来烧录固件。 11.3 调试 Cortex-Debug 扩展插件,专门用于调试ARM Cortex项目。

    7.2K30

    成为Oceanbase贡献者(2):源码解读build.sh debug --make 的执行过程

    参数解析阶段 获取命令参数 保持到全局变量中# parse_args函数处理参数BUILD_ARGS=(debug) # 编译类型 debugMAKE_ARGS=(-j $CPU_CORES) #.../build_mac.sh debug --make TYPE=$1; shift // TYPE: debug 第一个参数 # 调用 prepare_build_dir 函数准备构建目录...以下是这两个选项的详细解释:-std=c++11纯 C++ 标准:这个选项严格遵循 C++11 标准。不包含 GNU 扩展:编译器不会启用任何 GNU 特定的扩展。...-std=gnu++11C++ 标准 + GNU 扩展:这个选项不仅遵循 C++11 标准,还启用了 GNU 编译器的一系列扩展。...包含 GNU 扩展:编译器会启用一些非标准的功能和特性,这些功能可能在其他编译器上不可用。

    4700

    【Linux内核设计思想】二、内核编译及内核开发的特点

    内核提供了很多工具来简化内核配置过程,最简单最耗时的是命令行工具,该工具会遍历所有选项并让你选择配置选项 yes/no/module make config 还有其他更方便的图形工具可供使用 make...内核开发的特点 内核编程时不能访问C库,即没有 libc 库。 在用户空间编程时,我们可以调用C库函数,但是在内核编程时,内核无法链接标准C函数库,实际上其他一些库也无法使用。...gcc 是多种 GNU 编译器的集合,它包含的C编译器既可以编译内核,也可以编译 Linux 系统上的其它C源代码。总之,内核开发者使用的C语言包含 ISO C99 标准以及 GNU C 扩展特性。...下面列举内核源码中使用到的一些C语言扩展: ① 内联函数(inline) 内联函数顾名思义,就是“在字里行间展开”的意思,内联函数会在它被调用的位置展开,这样做消除了函数调用和返回所带来的开销,比如寄存器的存储和恢复等...在内核编程时,考虑到类型安全因素,应优先使用内联函数而不是宏。

    17510

    Makefile教程

    此处不依赖与任何项,使用方法是显示调用make clean,用于执行rm操作。...6.多源文件目录的简单模板 通过上面简单示例可以大致了解Makefile的基本编写方法与内容,实际上,Makefile可以通过make自动推导特性、内置变量、自动化变量和函数等编写地更加简洁优雅,并且可以模板化...对于一般多字符变量的引用必须使用括号,否则make将把变量名的首字母作为作为变量而不是整个字符串($PATH在Makefile中实际上是$(P)ATH)。...此两者均为通配符,但更准确的讲,%为Makefile规则通配符,用于规则描述,*为扩展通配符,用于扩展。...尤其是在Makefile中,当变量定义或者函数调用时,通配符%的展开功能就失效了。此时需要借助wildcard函数。通配符*常用于wildcard函数中,二者应用范围不同。

    4.1K53

    手把手教你编写一个简单的PHP模块形态的后门

    本文就简单介下如何一步步编写一个简单的php 动态扩展后门。 0x01. php 扩后门的简单设计 出于教学目的,这个动态扩展后门的功能设计比较简单: 1)....,则执行pass参数的值中的php代码 本文用最快的(不是最标准的,标准的扩展一般还会单独写.h的头文件)的方式来建立一个简单的php扩展,共计两个文件,一个是编译配置文件config.m4, 一个是后门扩展源码...hacker.c 关于config.m4 config.m4文件用于指定正在开发的扩展在类unix系统下构建时支持的选项,指定此扩展需要哪些库以及哪些源文件;使用 GNU autoconf (http:...参数用来声明这个扩展不是一个静态模块,而是在php运行时动态加载的。...因此对php函数的hook,设置php环境变量,对user input的过滤,都可以根据需要在这两个函数中进行.本文扩展后门就是在RuntimeInit时候对变量进行hook。

    1.8K50

    使用ext_skel和phpize构建php5扩展

    首先声明:我们要构建的是扩展或者模块名为hello_module.该模块提供一个方法:hello_word. 1、php环境的搭建 我们一般使用源码包编译安装,而不是binary包安装。...完整的语法参考可参见位于http://www.gnu.org/software/autoconf/manual/ 安装autoconf 宏最简单的方法:apt-get install autoconf...按惯例, PHP_ARG_WITH() 用于取得参数的选项,例如扩展所需库或程序的位置;而 PHP_ARG_ENABLE() 用于代表简单标志的选项。...也调用 AC_DEFINE() 来指示所请求的额外功能代码是可用的,设置变量来告诉以后的代码,有额外的源代码要构建。如果检测失败,则调用所熟悉的 AC_MSG_ERROR()。...模块通常都包含以下几个部分: · 包含头文件(引入所需要的宏、API定义等); · 声明导出函数(用于Zend函数块的声明); · 声明Zend函数块;

    48720

    Make 命令教程

    但是实际上 ,任何只要某个文件有变化,就要重新构建的项目,都可以用Make构建。 本文介绍Make命令的用法,从简单的讲起,不需要任何基础,只要会使用命令行,就能看懂。...我的参考资料主要是Isaac Schlueter的《Makefile文件教程》和《GNU Make手册》。 ?...调用Shell变量,需要在美元符号前,再加一个美元符号,这是因为Make命令会对美元符号转义。 test: @echo $$HOME 有时,变量的值可能指向另一个变量。...v1 = $(v2) 上面代码中,变量 v1 的值是另一个变量 v2。这时会产生一个问题,v1 的值到底在定义时扩展(静态扩展),还是在运行时扩展(动态扩展)?...space),$(comma),$(foo)) # bar is now `a,b,c'. (4)patsubst函数 patsubst 函数用于模式匹配的替换,格式如下。

    2K40

    浅谈 Make 命令

    但是实际上 ,任何只要某个文件有变化,就要重新构建的项目,都可以用Make构建。 本文介绍Make命令的用法,从简单的讲起,不需要任何基础,只要会使用命令行,就能看懂。...我的参考资料主要是Isaac Schlueter的《Makefile文件教程》和《GNU Make手册》。...调用Shell变量,需要在美元符号前,再加一个美元符号,这是因为Make命令会对美元符号转义。 test: @echo $$HOME 有时,变量的值可能指向另一个变量。...v1 = $(v2) 上面代码中,变量 v1 的值是另一个变量 v2。这时会产生一个问题,v1 的值到底在定义时扩展(静态扩展),还是在运行时扩展(动态扩展)?...(4)patsubst函数 patsubst 函数用于模式匹配的替换,格式如下。

    1.3K10

    C语言进阶小技巧,弱符号和弱引用

    第一时间看干货文章 1 __attribute__ 是一个编译器指令,其实是 GNU C 的一种机制,本质是一个编译器的指令,在声明的时候可以提供一些属性,在编译阶段起作用,来做多样化的错误检查和高级优化...用于在 C,C++,Objective-C 中修饰变量、函数、参数、方法、类等。 合理使用 __attribute__ 有什么好处?...强符号和弱符号 在同一作用域下不能定义同一个变量或函数,很多C语言学习者都理所当然地这么认为。...这个其实是是有所偏颇的,GNU C对标准C语言进行了扩展,在GCC中,对于符号(在编译时,变量和函数都被抽象成符号)而言,存在着强符号和弱符号之分。...注意这里是声明而不是定义,既然是引用,那么就是使用其他模块中定义的实体,对于函数而言,我们可以使用这样的写法: __attribute__((weakref)) void func(void); 然后在函数中调用

    94620

    main函数真的是C程序的开始吗?

    我们在学习和编写C程序时,都是从main函数开始,main函数作为入口函数已经深深地印在我们的脑海中,那么main函数真的是C程序的入口函数吗?带着这个问题我们先来看下面一段代码。 1....\n"); return 0; } 输出结果 为什么最开始执行的不是main函数?怎么和我们刚开始学习C程序时说的不一样呢?...我们的例子中beforeMain函数使用的gcc扩展属性__attribute__((constructor))就是将函数对应的指令归属于.ctors section部分。...构造函数属性使函数在执行进入main()之前自动被调用 GNU C的一大特色就是__attribute__机制。...同理, destructor让系统在main()函数退出或者调用了exit()之后,调用我们的函数。

    53610

    Ubuntu 系统配置 VS Code C++ 开发环境

    编辑器集合、GNU 调试器、其他编译软件所必需的开发库和工具,简单来说,安装了 build-essential 就相当于安装了 gcc、g++、make 等工具。...查看 make 版本: # make --version GNU Make 4.2.1 Built for x86_64-pc-linux-gnu Copyright (C) 1988-2016 Free...Runner, C/C++ Compile Run 扩展 环境配置 VS Code 与 Visual Studio或其他的大型IDE的工作机制类似,一般都是每个project有一个单独的工作空间(也就是目录...,tasks.json是为整个目录配置环境,不需要修改诸如 “${fileDirname}” 这样的变量,“type”可以改成“shell”,不能任意; “label”是task的名称,可以随意,但要与...launch.json文件中的变量“preLaunchTask”设置一致; “command” 来指定编译器名,可以不带绝对路径。

    1.2K10

    Makefile经典教程(掌握这些足够)

    因为你不会知道这两个函数会被调用多少次。 为了避免上面的这种方法,我们可以使用make中的另一种用变量来定义变量的方法。...函数调用后,函数的返回值可以当做变量来使用。...是函数的参数,参数间以逗号“,”分隔,而函数名和参数之间以“空格”分隔。函数调用以“$”开头,以圆括号或花括号把函数名和参数括起。感觉很像一个变量,是不是?...“-R” “--no-builtin-variabes” 禁止make使用任何作用于变量上的隐含规则。...这篇文档中80%的技术细节都适用于任何的make,我猜测"函数"那一章的内容可能不是其它make所支持的,而隐含规则方面,我想不同的make会有不同的实现,我没有精力来查看GNU的make和VC的nmake

    2.8K20

    命令帮助类基础命令

    env | ENVironment | 用于显示系统中已存在的环境变量,以及在定义的环境中执行指令。 exec | EXECute | 用于调用并执行指令的命令。...mkdir | MaKe DIRectory | 创建目录 mkfs | MaKe FileSystem | 用于在设备上(通常为硬盘)创建Linux文件系统。...命令 -k : 查看所有包含关键字的命令 命令等于apropos 关键字 #内容级别 1.查看命令的帮助 2.查看可被内核调用的函数的帮助 3.查看函数和函数库(`大部分为C的函数库`)的帮助 4....自带的找不到,whereis和which能找到的都是后来安装的命令; which [-a] 命令名 # 参数 -a : 将所有由PATH目录中可以找到的命令均列出而不是第一个被找到的命令名称; 简单实例.../file1 echo $a WeiyiGeek.shell调用有权限 WeiyiGeek.shell调用无权限 为什么在shell脚本里面用export设置环境变量之后,当shell执行完了,用set

    55520

    扫码

    添加站长 进交流群

    领取专属 10元无门槛券

    手把手带您无忧上云

    扫码加入开发者社群

    相关资讯

    热门标签

    活动推荐

      运营活动

      活动名称
      广告关闭
      领券