以下のステートメントの動作上の違いは何ですか?
LDDIRS := -L$(ORACLE_LIB)
LDDIRS += -L$(ORACLE_LIB)
:= (単純に展開された変数) variable が定義されている場合、値は一度だけスキャンされ、他の変数や関数への参照がすべて展開されます。たとえば
x:=foo
y:=$(x) bar
x:=later
、上記は次と同等です
y:=foo bar
x:=later
+= は、変数にさらにテキストを追加するために使用されます。たとえば
objects=main.o foo.o bar.o
objects+=new.o
、オブジェクトを 'main.o foo.o bar.o new.o' に設定します。
= は再帰的に展開された変数用です。値は逐語的にインストールされます。他の変数への参照が含まれている場合、これらの変数は、この変数が置換されるたびに展開されます。これは、再帰的展開として知られています。
「=」は再帰的に展開された変数を定義するためのものです。次のmakeファイルは、「y is later bar」を出力します
x = foo
y = $(x) bar
x = later
all:;echo "y is" $(y)
":=" は、一度だけ展開される単純に展開された変数を定義するためのものです。次のmakeファイルは、「y is foo bar」を出力します
x := foo
y := $(x) bar
x := later
all:;echo "y is" $(y)
また、他の人が先に指摘したように、GNU make マニュアルのUsing Variablesセクションで詳細を確認できます。
お役に立てれば :-)
:=
ここで変数を左側として定義し、変数+=
の既存の値に右側を追加します。(この特定の行ではなく) 使用場所で右辺を評価する which と比較:=
します。=
ここでマニュアルを見ることができます(GNU makeを使用していると仮定します)
このウェブサイトから
ページに配置する構文の:=
リンク
単純に展開された変数は、':=' を使用して行で定義されます (変数の設定を参照)。変数が定義されると、単純に展開された変数の値が一度だけスキャンされ、他の変数や関数への参照が展開されます。単純に展開された変数の実際の値は、記述したテキストを展開した結果です。他の変数への参照は含まれていません。この変数が定義された時点での値が含まれています。
ページに配置する構文の+=
リンク
問題の変数が以前に定義されていない場合、'+=' は通常の '=' と同じように機能します: 再帰的に展開された変数を定義します。ただし、以前の定義がある場合、「+=」が正確に何をするかは、最初に定義した変数の種類によって異なります。変数の 2 つのフレーバーの説明については、変数の 2 つのフレーバーを参照してください。
つまり、:=
その変数に遭遇するたびに再評価されることはありません。コードをコンパイルするときに、パフォーマンスに大きな違いをもたらす可能性があります。
+=
変数に値を追加するだけです。
は:=
と同じように代入用=
です。
+=
変数に新しい値を追加します。