题
我有一个具有声明的C程序的制作费
CC?=gcc
将其更改为
CC?=g++
不会使其与G ++编译。将其更改为
CC=g++
确实使它使用G ++。
所以我想知道?=操作员做什么?我的猜测是,它查看一个环境变量以决定要使用哪个编译器,如果未设置的编译器,请使用GCC?有人可以清除这个吗?
解决方案
从 http://www.gnu.org/software/make/manual/make.html:
变量还有另一个分配运算符,“?='。这称为条件变量分配运算符,因为它仅在尚未定义变量的情况下具有效果。这个说法:
FOO ?= bar
完全等同于此(请参阅原始函数):
ifeq ($(origin FOO), undefined) FOO = bar endif
大概 CC
已经定义为 gcc
, , 所以 CC ?= g++
不会覆盖现有的 gcc
.
其他提示
这 ?=
仅当变量尚未设置时,操作员才设置该变量: info make
→ * Using Variables
→ * Setting
.
这 ”?”操作员意味着设置(如果尚未设置)。
因此,如果CC已经为空白CC?=将设置它。如果CC已经包含某些内容,则不会。
资源: http://unix.derkeiler.com/mailing-lists/freebsd/questions/2007-03/msg02057.html
正如其他人提到的那样,它可能已经预定义。
在GNU上,您可以看到定义的内容 make -p
来自不包含一个目录 Makefile
.
这是在以下记录的 https://www.gnu.org/software/make/manual/html_node/implitic-variables.html
通常, CC=cc
默认。然后在Ubuntu 14.04上使用,例如 cc
通常是一个符号链接 gcc
.
要立即禁用所有变量,请参阅: 禁用从“制造文件”内部的内置规则和变量 目前似乎不可能。