Makefile $$的理解
来源:互联网 发布:文字变声音软件 编辑:程序博客网 时间:2024/05/07 18:35
在Makefile中我们可能遇到过$$,开始的时候不明白这是什么意思,在这里做一下笔记来记录一下。
例子:
define func#$(1) is foo$(1)_test = taget_val$($(1)_test) = taget_val2$$($(1)_test) = taget_val3endef$(info $(call func,foo))all: @echo end ...
执行一下Make看一结果和我们想象的是否一样 (info 函数用来打印call的执行结果)
hhp@Lenovo:~/mk$ make#foo is foofoo_test = taget_val = taget_val2$(foo_test) = taget_val3end ...
call 是一个展开和替换的过程,奇怪的是执行结果好像和想想的不太一样,来分析一下。
(1 )
#$(1) is foo
这句话我们想写成注释,但是call函数遇到$元字符就会被展开,所以也就变成了
#foo is foo
如果想展开成
#$(1) is foo
我们应该写成:
#$$(1) is foo
在$ 前面在加一个$,这就$就只表示不同字符$而不是元字符或关键字$了,那么call也就不会在进行展开了。
(2)
$(1)_test = taget_val
这句话同样$(1)被展开成foo了,展开结果如下
foo_test = taget_val
(3)
$($(1)_test) = taget_val2
这个很多人想不明包了,那我们来分析一下。
我们一步一步进行展开,
第一步:替换$(1),展开结果如下:
$(foo_test)=taget_val2
第二步:展开替换$(foo_test)结果如下
= taget_val2
有人说不对呀,应该是
taget_val=taget_val2
这样是错误的,因为call只是展开而不执行,$(1)_test = taget_val这句话只是展开而没有真正的执行,如果将展开执行,就是需要用到常用的eval函数了。。
所以$(foo_test)应该是空,而不是taget_val
(4)
$$($(1)_test) = taget_val3
第一步:替换$(1),结果如下:
$$(foo_test)=taget_val3
第二步比较关键,$(foo_test)并不会被展开,因为这里$已经不是元字符$,因为$前面还有一个$,也就是说在Makefile中想使用$为普通$字符,就需要写成$$所以真正的展开结果
应该是:
$(foo_test)=taget_val3
如果以上分析不对,请高手留言批评指正
- 对makefile的理解
- Makefile的简单理解
- makefile的粗浅理解
- Makefile $$的理解
- [收藏]对于makefile的理解
- 对makefile的一点理解
- 关于 makefile 的一些理解
- Makefile文件的简单理解
- Makefile文件的简单理解
- Makefile 理解
- Makefile 理解
- makefile理解
- 理解Makefile
- Makefile 理解
- 对于makefile的初步的理解
- 关于Makefile与Kconfig的理解
- 驱动模块中Makefile的自我理解
- 驱动模块中Makefile的自我理解
- request对象和response对象
- 如192.168.1.10/27 IP斜杠后面的27是什么意思?
- vim + YCM
- 002
- pythony第三章:列表、元组、字典和集合(1)
- Makefile $$的理解
- 对抗样本和对抗网络
- Android 使用View的旋转实现漂亮的动画效果
- 如何在官网下载 >>>>红帽企业版linux
- C#:IComparable和ICompare
- Codeigniter提示:Undefined property: XXXX::$db的解决方法
- POJ2135
- Linux使用动态ip(dhcp)切换成静态ip后无法联网的问题
- 34. Search for a Range