Makefile中的$(1)是什么

文章探讨了在Linux环境中,Makefile在编译过程中的关键作用,尤其是当涉及复杂项目如ffmpeg时。文中提到,虽然有cmake等现代编译工具,但掌握Makefile的编写仍然重要。作者在研究ffmpeg的Makefile时遇到$(1)变量,发现它类似于shell脚本中的参数传递,但实际上Makefile中是通过函数调用来传递。通过分析ffmpeg/fftools/Makefile的片段,解释了$(1)作为函数参数的用法,并提供了一个简单的Makefile示例来帮助读者更好地理解这一概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Linux工程的编译要用到make工具,平台不一样,只是工具链不同,但Makefile是编译系统的关键所在,因此掌握Makefile的编写规则是非常重要的。尽管有了cmake这样更容易使用的编译工具,但这并不意味着就不需要学习Makefile了。

最近本人在研究ffmpeg的编译系统Makefile时,看到里面有一个$(1)的变量,一时没明白是什么,总觉得有点似曾相识,这和shell脚本中的$0、$1、$2很像,是传递的参数?但Makefile调用的时候不能传递参数,因为会被当成make的目标。经过一番琢磨,终于明白这是Makefile中定义的函数的参数传递形式。

这是ffmpeg/fftools/Makefile中的截取片段:

define DOFFTOOL
OBJS-$(1) += fftools/cmdutils.o fftools/opt_common.o fftools/$(1).o $(OBJS-$(1)-yes)
ifdef HAVE_GNU_WINDRES
OBJS-$(1) += fftools/fftoolsres.o
endif
$(1)$(PROGSSUF)_g$(EXESUF): $$(OBJS-$(1))
$$(OBJS-$(1)): | fftools
$$(OBJS-$(1)): CFLAGS  += $(CFLAGS-$(1))
$(1)$(PROGSSUF)_g$(EXESUF): LDFLAGS += $(LDFLAGS-$(1))
$(1)$(PROGSSUF)_g$(EXESUF): FF_EXTRALIBS += $(EXTRALIBS-$(1))
-include $$(OBJS-$(1):.o=.d)
endef

$(foreach P,$(AVPROGS-yes),$(eval $(call DOFFTOOL,$(P))))

这里面调用了定义的DOFFTOOL函数,$(1)是函数的第一个参数,$(2)是其第二个参数,依此类推,

而$(0)是函数本身。

如果还看不明白,就自己写一个Makefile试试吧,下面是一个Makefile的例子:

define DOFFTOOL
@echo $(0)
@echo $(1)
@echo $(2)
endef

all:
    $(call DOFFTOOL,ffmpeg,ffplay)

把它保存为Makefile文件,执行make,看看打印出来什么,就明白了这是怎么一回事了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值