web-dev-qa-db-ja.com

MakefileのCC?=はどういう意味ですか?

宣言のあるCプログラムのMakefileがあります

CC?=gcc

に変更

CC?=g++

g ++でコンパイルしません。に変更

CC=g++

G ++を使用しますか。

では、?=演算子は何をしているのでしょうか?私の推測では、使用するコンパイラを決定するために環境変数を調べ、それが設定されていない場合はgccを使用しますか?これを片付けることができる人は誰ですか?

26
inquam

http://www.gnu.org/software/make/manual/make.html から:

変数には別の代入演算子 `?= 'があります。これは、変数がまだ定義されていない場合にのみ効果があるため、条件付き変数代入演算子と呼ばれます。この文:

 FOO ?= bar

これは、これとまったく同じです(Origin関数を参照)。

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

おそらくCCはすでにgccとして定義されているので、CC ?= g++は既存のgccを上書きしません。

33
kennytm

?=演算子は、まだ設定されていない場合にのみ変数を設定します:info make* Using Variables* Setting

5
Marcelo Cantos

「?」演算子は、まだ設定されていない場合は設定を意味します。

したがって、CCがすでに空白の場合、CC?=はそれを設定します。 CCにすでに何かが含まれている場合は含まれません。

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

2
Martin Eve

他の人が述べたように、それはおそらくすでに事前定義されています。

GNUでは、Makefileを含まないディレクトリから、make -pで何が定義されているかを確認できます。

これは次の場所に記載されています: https://www.gnu.org/software/make/manual/html_node/Implicit-Variables.html

通常、デフォルトではCC=ccです。次に、Ubuntu 14.04などでは、ccは通常gccへのシンボリックリンクです。

すべての変数を一度に無効にするには、次を参照してください: make組み込みルールと変数をmakeファイル内から無効にします 現在は不可能と思われます。