5

私は多くのチュートリアルを読みCFLAGS、公式ドキュメントも調べました。彼らが言うところはどこでもCFLAGS暗黙的ですが、例のmakefileで明示的にコンパイラに渡します。

CFLAGS=-O2
gcc $(CFLAGS) -c foo.c -o foo.o

では、この文脈で「暗黙的」という用語は何を意味するのでしょうか? メイクファイルで宣言CFLAGS=-O2し、後で単に , と言うとgcc -c foo.c -o foo.o-O2アクティブになるかどうか (つまり、本当に暗黙的ですか)? もしそうなら、なぜすべてのチュートリアル (公式ドキュメントを含む) が例でそれを明示的に渡しているのですか?

4

4 に答える 4

9

CFLAGS は暗黙的であると言われていますが、例の makefile で明示的にコンパイラに渡しています。

CFLAGSgcc は環境変数を使用しません。GCC に影響する環境変数を参照してください。

CFLAGSは、C コンパイラ フラグを持つ Makefile 変数の従来の名前であり、暗黙的な make 規則によって使用されます。詳細については、暗黙のルールで使用される変数を参照してください。

組み込みの make ルールの代わりに独自の make ルールを使用する場合は、まったく使用する必要はありませんCFLAGS。人々は従来の make 変数名に慣れているので、そうするのは便利な規則ですが。

于 2015-04-27T15:26:34.827 に答える
1

CFLAGS は、デフォルトのコンパイル ルールを介して makefile によってコンパイラ コマンド ラインに暗黙的に渡されると思いますが、CFLAGS はカスタム フラグでオーバーライドできるため、各コンパイル コマンドはそれを取得して使用できます。

于 2015-04-27T15:28:57.460 に答える
1

簡単にテストできます:

$ cat cflags.mak 
CFLAGS = -wrong

foo.o: foo.c

$ make -f cflags.mak 
cc -wrong   -c -o foo.o foo.c
cc: unrecognized option '-wrong'

したがって、ルールで明示的に指定されていなくても、CFLAGS の値が使用されていることがわかります。したがって、それは暗黙的です。

ただし、.c ファイルをコンパイルするための独自のルールを指定する場合は、それを使用する場合はそれを含める必要があります。

$ cat cflags.mak 
CFLAGS = -wrong

foo.o: foo.c
    gcc -c $<
$ make -f cflags.mak 
gcc -c foo.c

ここでは、CFLAGS を含まない .c ファイルに独自のルールを提供したため、CFLAGS は使用されませんでした。

つまり、.c ファイルをコンパイルするために組み込みの make 規則に依存している場合、CFLAGS が暗黙的に含まれます。ただし、そのルールをオーバーライドして引き続き使用する場合は、明示的に含める必要があります。

于 2015-04-27T15:32:37.550 に答える
1

これは、CFLAGS を使用する暗黙の make 規則があることを意味します。したがって、次のように 1 行の makefile を記述できます。

CFLAGS=-O2

後で行う場合:

make filename

(拡張子を省略) CFLAGS を参照する暗黙のルールを使用してソース ファイル .c を実行可能ファイルに変換するため、単純なビルドの明示的なビルド ステートメントを記述する必要はありません。

たとえば、ソース名 file.c を準備した場合、次のような暗黙のルールでビルドされます。

$GCC $CFLAGS file.c -o file $LDFLAGS

参照: GNU make のドキュメント

于 2015-04-27T15:32:37.627 に答える