我有一个带有声明
的C程序的MakefileCC?=gcc
将其更改为
CC?=g++
不会使用g ++进行编译。将其更改为
CC=g++
是否使用g ++。
所以我想知道?=运算符是做什么的?我的猜测是它查看环境变量来决定使用哪个编译器,如果没有设置则使用gcc?谁能清除这个?
答案 0 :(得分:33)
来自http://www.gnu.org/software/make/manual/make.html:
还有另一个赋值运算符 对于变量,`?='。这被称为a 条件变量赋值 运营商,因为它只有一个 如果变量尚未生效 定义。这句话:
FOO ?= bar
与此完全相同(参见The 起源函数):
ifeq ($(origin FOO), undefined) FOO = bar endif
可能CC
已定义为gcc
,因此CC ?= g++
不会覆盖现有的gcc
。
答案 1 :(得分:5)
?=
运算符仅在尚未设置变量时才设置变量:info make
→* Using Variables
→* Setting
。
答案 2 :(得分:2)
“?”运算符表示如果尚未设置则设置。
所以,如果CC已经空白CC?=将设置它。如果CC已包含某些内容,则不会。
来源:http://unix.derkeiler.com/Mailing-Lists/FreeBSD/questions/2007-03/msg02057.html
答案 3 :(得分:1)
正如其他人所提到的,它可能已经预定义了。
在GNU上,您可以从不包含make -p
的目录中查看使用Makefile
定义的内容。
记录于:https://www.gnu.org/software/make/manual/html_node/Implicit-Variables.html
通常默认为CC=cc
。然后在Ubuntu 14.04上,例如,cc
通常是gcc
的符号链接。
要立即禁用所有变量,请参阅:Disable make builtin rules and variables from inside the make file似乎目前无法使用。