makefile中的makefile变量与shell变量的区别

在linux的Makefile中,经常会见到$var和$$var的形式。下面就这两种表示方法的区别进行简单的概述。
在Makefile中的规则命令行中:
$var:将Makefile中的变量var的值,传给shell命令。
$$var:访问shell命令中定义的变量var。
经典示例代码如下所示:
var=3                       # a
target:
       echo $(var)          # b
       var=4                # c
       echo $(var)          # d
       echo $$var           # e
a:定义Makefile中的变量var,值为3
b:打印Makefile中的变量,值为3
c:定义shell命令中的变量var,值为4,Makefile的变量var不受影响
d:打印Makefile中的变量,值为3
e:打印shell命令中的变量。此时var为未定义的变量。

读者可能会奇怪,shell命令中的var明明已经定义了,为什么是未定义呢?
原因:在Makefile的规则命令,如果相互之间没有使用';\'连接起来的话,相互之间是不能共享变量的。
修改示例代码,使用';\'连接shell规则命令行。
var=3                         # a
target:
       echo $(var);\          # b
       var=4;\                # c
       echo $(var);\          # d makefile先要进行扩展,扩展的结果就是echo 3
       echo $$var             # e  makefile将$$VAR先执行一次扩展得到echo $var然后交给shell去解释执行
此时,b、d、e行的输出结果分别为3、3、4,符合用户的预期。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
什么是makefile?或许很多Windows的程序员都不知道这个东西,因为那些Windows 的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员, makefile还是要懂。这就好像现在有这么多的HTML的编辑器,但如果你想成为一个专业 人士,你还是要了解HTML的标识的含义。特别在Unix下的软件编译,你就不能不自己写 makefile了,会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能 力。 因为,makefile关系到了整个工程的编译规则。一个工程的源文件不计数,其按类型、 功能、模块分别放在若干个目录makefile定义了一系列的规则来指定,哪些文件需要 先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因 为makefile就像一个Shell脚本一样,其也可以执行操作系统的命令。 makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工 程完全自动编译,极大的提高了软件开发的效率。make是一个命令工具,是一个解释 makefile指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的 make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种 在工程方面的编译方法。 现在讲述如何写makefile的文章比较少,这是我想写这篇文章的原因。当然,不同产商的 make各不相同,也有不同的语法,但其本质都是在“文件依赖性”上做文章,这里,我仅 对GNU的make进行讲述,我的环境是RedHat Linux 8.0,make的版本是3.80。必竟, 这个make是应用最为广泛的,也是用得最多的。而且其还是最遵循于IEEE 1003.2-1992 标准的(POSIX.2)。 在这篇文档,将以C/C++的源码作为我们基础,所以必然涉及一些关于C/C++的编译的 知识,相关于这方面的内容,还请各位查看相关的编译器的文档。这里所默认的编译器是 UNIX下的GCC和CC。
回答: Makefileshell脚本在以下几个方面有所不同: 1. 变量引用方式不同: 在shell脚本,所有以$打头的变量引用后需要加上{},而在Makefile变量引用后需要加上()。例如,在Makefile定义变量PATH="/data/",则在使用时应该写成SUBPATH=$(PATH)。\[1\] 2. make命令和shell命令的本质不同: make命令本质上是一个shell命令,和ls、cd等命令没有太大区别,只是make命令会根据当前目录下的Makefile来进行工作。可以通过which make命令查看make命令的路径,通过man 1 make命令查看make命令的用法。\[2\] 3. 区分Makefile变量shell变量: 如果在Makefile定义了一个变量,而Makefile所调用的shell命令也定义了一个同名的变量,为了区分它们,Makefile规定,在引用shell变量时,需要在变量前添加两个美元符号($$)。例如,在Makefile使用shell变量subdir时,应该写成$$subdir。\[3\] 总结起来,Makefileshell脚本在变量引用方式、命令本质和变量区分等方面存在差异。 #### 引用[.reference_title] - *1* [Makefileshell脚本的区别](https://blog.csdn.net/daizhichaoaa/article/details/130792825)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [MakefileShell 脚本的区别与联系](https://blog.csdn.net/oqqHuTu12345678/article/details/129295301)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值