1. ホーム
  2. gcc

[解決済み] CFLAGS, CCFLAGS, CXXFLAGS - これらの変数はいったい何を制御しているのでしょうか?

2022-03-05 12:16:04

質問

GNU makeを使ってC++のコードをコンパイルしていますが、コンパイルをカスタマイズする方法を理解したいと思います。

いろいろなところで、次のようなことを読みました。 CFLAGS , CCFLAGSCXXFLAGS が使われています。では、どのように使えばいいのでしょうか?もし、コンパイラに追加のコマンドライン引数がある場合、それを CFLAGS それとも前置詞?共通する慣習はありますか?

なぜ3種類の変数があるのですか?Cコンパイラが取得すべきなのは CFLAGSCCFLAGS であるのに対し、C++コンパイラは CFLAGSCXXFLAGS - ということです。

人間がこれらの変数を設定することは全くないのでしょうか?自動化されたツール( automake , autoconf など)が設定されていますか?私が使用する予定のlinuxシステムでは、これらの変数が定義されていないのですが、これは典型的なことなのでしょうか?

現在、私のMakefileはこのような感じになっていますが、少し汚いと感じています。

ifdef code_coverage
    GCOV_FLAG := -fprofile-arcs -ftest-coverage
else
    GCOV_FLAG :=
endif

WFLAGS := -Wall

INC_FLAGS := -Istuff -Imore_stuff -Ietc

CCFLAGSINT := -O3 $(WFLAGS) $(INC_FLAGS) $(CCFLAGS)

... (somewhere in the makefile, the command-line for compilation looks like this)
    $(CC) $(CCFLAGSINT) -c $< -o $@

... (somewhere in the makefile, the command-line for linking looks like this)
    $(CC) $(GCOV_FLAG) $(CCFLAGSINT) $(OBJLIST) $(LDFLAGS) -o $@

このMakefileは非常にうまく動作しているので、バグがないことは確かです。しかし、慣習に反するようなことはないでしょうか? CCFLAGSINT - を上書きすればいいのでしょうか? CCFLAGS の代わりに?それとも CXXFLAGS ? FUD!)

たくさんの質問で申し訳ありません。もちろん、すべてにお答えすることはできませんが、回答がこれらの設定の背後にある一般的な考えを理解する助けになることを願っています。

解決方法は?

お気づきのように、これらは Makefile の {マクロまたは変数} であり、コンパイラのオプションではありません。これらは一連の規約を実装しています。(マクロは古い呼び名で、今でも使われている人がいます。GNU make doc では変数と呼ばれています)。

名前が問題になるのは、デフォルトのメイクルールだけです。 make -p があり、そのうちのいくつかを使用しています。

すべてのルールを自分で書けば、すべてのマクロ名を自分で選ぶことができます。

vanilla gnu makeでは、CCFLAGSというものはありません。あるのは CFLAGS , CPPFLAGS および CXXFLAGS . CFLAGS はCコンパイラー用です。 CXXFLAGS はC++用、そして CPPFLAGS の両方があります。

なぜ CPPFLAGS の両方にあるのでしょうか?従来はプリプロセッサ・フラグの本拠地( -D , -U ) があり、cもc++もそれを使っています。さて、前提として、誰もが が欲しい cとc++の定義環境が同じであることは、おそらく疑問ですが、伝統的なものです。


追伸:ご指摘の通り ジェームス・ムーア プロジェクトによっては、Cプリプロセッサへのフラグではなく、C++コンパイラへのフラグとしてCPPFLAGSを使用しています。例えば、Android NDKはその大きな一例です。