28

我有一个具有声明的 C 程序的 Makefile

CC?=gcc

将其更改为

CC?=g++

不会让它用 g++ 编译。将其更改为

CC=g++

确实使它使用g ++。

所以我想知道 ?= 运算符是做什么的?我的猜测是它会查看一个环境变量来决定使用哪个编译器,如果没有设置,那么使用 gcc?任何人都可以清除这个?

4

4 回答 4

37

来自http://www.gnu.org/software/make/manual/make.html

变量还有另一个赋值运算符,`?='。这称为条件变量赋值运算符,因为它仅在变量尚未定义时才有效。这个说法:

 FOO ?= bar

完全等价于这个(参见原点函数):

 ifeq ($(origin FOO), undefined)
   FOO = bar
 endif

可能CC已经定义为gcc,所以CC ?= g++不会覆盖现有的 gcc.

于 2010-06-03T12:26:16.420 回答
5

运算符仅在?=尚未设置变量时设置变量:info make* Using Variables* Setting

于 2010-06-03T12:25:37.047 回答
3

正如其他人提到的,它可能已经预定义。

在 GNU 上,您可以make -p从不包含Makefile.

这记录在:https ://www.gnu.org/software/make/manual/html_node/Implicit-Variables.html

通常,CC=cc默认情况下。然后在 Ubuntu 14.04 上,例如,cc通常是指向gcc.

要一次禁用所有变量,请参阅:从 make 文件中禁用 make builtin 规则和变量似乎目前是不可能的。

于 2015-05-09T19:20:22.177 回答
2

这 ”?” 运算符表示已设置(如果尚未设置)。

所以,如果 CC 已经是空白 CC?= 将设置它。如果 CC 已经包含某些内容,则不会。

来源:http ://unix.derkeiler.com/Mailing-Lists/FreeBSD/questions/2007-03/msg02057.html

于 2010-06-03T12:27:19.367 回答