Gcc

CFLAGS、CCFLAGS、CXXFLAGS-これらの変数は正確に何を制御しますか?



Cflags Ccflags Cxxflags What Exactly Do These Variables Control



解決:

お気づきのとおり、これらはMakefile {マクロまたは変数}であり、コンパイラオプションではありません。それらは一連の規則を実装します。 (マクロはそれらの古い名前であり、まだ一部で使用されています。GNUmakedocはそれらを変数と呼びます。)

名前が重要である唯一の理由は、デフォルトのmakeルールです。それらのいくつかを使用するmake-p。



独自のルールをすべて作成すると、独自のマクロ名をすべて選択できるようになります。

バニラのgnumakeには、CCFLAGSのようなものはありません。があるCFLAGS、CPPFLAGS、およびCXXFLAGS。Cコンパイラ用のCFLAGS、C ++用のCXXFLAGS、および両方のCPPFLAGS。



なぜですか両方のCPPFLAGS?従来、これはプリプロセッサフ​​ラグのホームです(-NS、-U)そしてcとc ++の両方がそれらを使用します。さて、誰もが 望む cとc ++の同じ定義環境はおそらく疑わしいですが、伝統的です。


追伸James Mooreが指摘したように、一部のプロジェクトでは、Cプリプロセッサへのフラグではなく、C ++コンパイラへのフラグにCPPFLAGSを使用しています。 Android NDK、1つの大きな例。


によるGNU makeマニュアル:



CFLAGS:Cコンパイラに与える追加のフラグ。
CXXFLAGS:C ++コンパイラに与える追加のフラグ。
CPPFLAGS:Cプリプロセッサとそれを使用するプログラム(CおよびFortranコンパイラ)に与える追加のフラグ。

src:https://www.gnu.org/software/make/manual/make.html#index-CFLAGS
注:PPはPreProcessor(Plus Plusではない)の略です。

CPP:Cプリプロセッサを実行するためのプログラム。結果は標準出力になります。デフォルトの「$(CC)-E」。

これらの変数は、の暗黙のルールによって使用されます作る

Cプログラムのコンパイル
n.oは、フォームのレシピを使用してn.cから自動的に作成されます
‘$(CC)$(CPPFLAGS)$(CFLAGS)-c’。

C ++プログラムのコンパイル
n.oは、n.cc、n.cpp、またはn.Cから、次の形式のレシピを使用して自動的に作成されます。
‘$(CXX)$(CPPFLAGS)$(CXXFLAGS)-c’。
C ++ソースファイルには、「。C」の代わりに「.cc」という接尾辞を使用することをお勧めします。

src:https://www.gnu.org/software/make/manual/make.html#Catalogue-of-Rules


最小限の例

そして、Mizuxが最小限の例として言ったことを作るためだけに:

main_c.c

#include int main(void){puts( 'hello'); }

main_cpp.cpp

#include int main(void){std :: cout<< 'hello' << std::endl; }  

その後、何もなしでMakefile:

make CFLAGS = '-g -O3'  CXXFLAGS = '-ggdb3 -O0'  CPPFLAGS = '-DX = 1 -DY = 2'  CCFLAGS = '-asdf'  main_c  main_cpp

実行:

cc -g -O3 -DX = 1 -DY = 2 main_c.c -o main_c g ++ -ggdb3 -O0 -DX = 1 -DY = 2 main_cpp.cpp -o main_cpp

したがって、私たちはそれを理解しています:

  • makeには暗黙のルールがありましたmain_cおよびmain_cppからmain_c.cおよびmain_cpp.cpp
  • CFLAGSとCPPFLAGSは、次の暗黙のルールの一部として使用されました。.cコンパイル
  • CXXFLAGSとCPPFLAGSは、次の暗黙のルールの一部として使用されました。.cppコンパイル
  • CCFLAGSは使用されません

これらの変数は、makeの暗黙的なルールでのみ自動的に使用されます。コンパイルで独自の明示的なルールが使用されていた場合、次のようにこれらの変数を明示的に使用する必要があります。

main_c:main_c.c $(CC)$(CFLAGS)$(CPPFLAGS)-o [メール保護] $暗黙のルールと同様の効果を実現します。

これらの変数に任意の名前を付けることもできます。ただし、Makeはすでに暗黙のルールでそれらを魔法のように扱っているため、適切な名前を選択できます。

Ubuntu 16.04、GNU Make4.1でテスト済み。