http://blog.csdn.net/darennet/article/details/8185881
 
Makefile中使用$$的使用
    在makefile中,会经常使用shell命令,也经常见到$var 和

var的情况,有什么区别呢,区别大了。不要认为在makefile的规则的命令行中使用$var就是将makefile的变量和shell共享了,这里仅仅是读取makefile的变量然后扩展开,将其值作为参数传给了一个shell命令。而

var是在访问一个shell命令内定义的变量,而非makefile的变量。此外,如果某规则有n个shell命令行构成,而相互之间没有用';'和'\'连接起来的话,就是相互之间没有关联的shell命令,相互之间也不能变量共享。看如下例子:

makefile代码段1:
VAR=3   
target: prerequsite1 prerequsite2
    echo $VAR      (1)
    VAR=4           (2)
    echo $VAR         (3)
    echo $$VAR         (4)

在代码段1中,(1)的结果是3,显然makefile利用自己的变量将$VAR扩展成3之后传递给这个echo这个shell命令。
    (2)中,是一个独立的shell命令自己第一了一个shell变量,名字也叫VAR,且其值为4,不会影响到makefile中的VAR。
    (3)中,同(1),makefile中的变量VAR的值依然是3
    (4)makefile将$$VAR先执行一次扩展得到如下shell命令:
    echo $VAR然后交给shell去解释执行,可是对于这个shell命令来说VAR是一个为定义的变量,因此输出的结果就是个空行。

makefile代码段2:
VAR=3   
target: prerequsite1 prerequsite2
    echo $VAR;\      (1')
    VAR=4;\           (2')
    echo $VAR;\         (3')
    echo $$VAR         (4')
    
    在代码段2中,所有的shell命令都被连接起来了,那么执行的结果就有变化了:
    (1')结果同(1),$VAR被替换成了3
    (2')结果同(2)
    (3')输出3,因为虽然shell中有VAR变量,可是makefile先要进行扩展,扩展的结果就是echo 3。
    (4')输出4,因为makefile扩展结果为echo $VAR,而shell中已经有了变量VAR,且其值为4.

类似的例子还有如下:
    makefile代码片断3:
    SUBDIRS=tools examples src
    target: prerequsite1 prerequsite2
       for dir in $SUBDIRS; do $(MAKE) -C $$dir;done
    
    make首先将这个命令扩展成:
    for dir in tools examples src; do make -C $dir; done
  然后交给shell解释执行,可见dir就是一个shell中的变量。

总之,在makefile的shell命令中,党要引用shell变量的时候,要使用$$VAR格式。

此外注意一点,在makefile中,$$还被用来做SECONDEXPANSION,即二次扩展,一般是作为prerequsites.
    如:
    .SECONDEXPANSION (要使用这个feature就的加上这一行)
    main_objs := main.o try.o test.o
    lib_objs := lib.o api.o
    main lib:

(

@_objs)

(

@_objs)
第一阶段的扩展结果为$($@_objs),第2阶段的扩展结果为:$@被替换为main lib,与_objs连接成main_objs
lib_objs。加上外面$的扩展,就是$main_objs $lib_objs,最终结果为main.o try.o test.o lib.o
api.o

随机推荐

  1. C#两个时间的时间差的方法

    今天遇到一问题,计算两个时间的时间差,看网上的写法较为复杂,找到个简单点的,记录下作为自己的总结. 关键函数: DateTime.Subtract 函数解释: 从此实例中减去指定的日期和时间,返回一个 ...

  2. 诺基亚HERE地图

    1.基本图层 2.3D图层 3.卫星图层 4.地形图层 5.在线帮助

  3. UESTC_秋实大哥の恋爱物语 2015 UESTC Training for Search Algorithm & String<Problem K>

    K - 秋实大哥の恋爱物语 Time Limit: 5000/2000MS (Java/Others)     Memory Limit: 32000/32000KB (Java/Others) Su ...

  4. UESTC_贪吃蛇 CDOJ 709

    相信大家都玩过贪吃蛇游戏吧. 在n×m的迷宫中,有着一条长度不超过9的贪吃蛇,它已经将所有的食物吃光了,现在的目标是移动到出口. 它走的时候不能碰到自己的身体,也不能碰到墙壁.(如果贪吃蛇的长度> ...

  5. POJ22230 Watchcow (欧拉回路)

    Watchcow Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 6477   Accepted: 2823   Specia ...

  6. 【转】Linux查看CPU和内存使用情况

    =====================================top============================================== 在系统维护的过程中,随时可 ...

  7. VS2010+ICE3.5运行官方demo报错----std::bad_alloc

    纠结了一晚上,在release版本下运行没问题,一到debug就报错,卡在 Ice::ObjectAdapterPtr adapter = ic->createObjectAdapterWith ...

  8. Android设置背景

    一.设置图片背景 首先你先将一个的背景图片存入工程中res/drawble(当然drawble-hdpi.drawble-mdpi.drawble-ldpi中一个或者几个文件夹都可)文件夹中.假如我存 ...

  9. C# 多线程的坑 之 代码变序

    英文好的,可跳过,直接打开底部的“参考“链接. 代码变序--reordering of memory operations 大概4年前,阅读了这篇文章后http://www.albahari.com/ ...

  10. Android应用自动更新功能的实现!!!

    自动更新功能的实现原理,就是我们事先和后台协商好一个接口,我们在应用的主Activity里,去访问这个接口,如果需要更新,后台会返回一些数据(比如,提示语:最新版本的url等).然后我们给出提示框,用 ...