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でテスト済み。