[解決済み] CFLAGS, CCFLAGS, CXXFLAGS - これらの変数はいったい何を制御しているのでしょうか?
質問
GNU makeを使ってC++のコードをコンパイルしていますが、コンパイルをカスタマイズする方法を理解したいと思います。
いろいろなところで、次のようなことを読みました。
CFLAGS
,
CCFLAGS
と
CXXFLAGS
が使われています。では、どのように使えばいいのでしょうか?もし、コンパイラに追加のコマンドライン引数がある場合、それを
CFLAGS
それとも前置詞?共通する慣習はありますか?
なぜ3種類の変数があるのですか?Cコンパイラが取得すべきなのは
CFLAGS
と
CCFLAGS
であるのに対し、C++コンパイラは
CFLAGS
と
CXXFLAGS
- ということです。
人間がこれらの変数を設定することは全くないのでしょうか?自動化されたツール(
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はその大きな一例です。
関連
-
[解決済み】警告:イニシャライザーの周りに中括弧がないことを修復する方法?
-
[解決済み】gcc makefileのエラー。"No rule to make target ..." (ターゲットを作るルールがない)
-
[解決済み】g++ output: file not recognized: ファイル形式が認識されない
-
[解決済み] g++ 出力: ファイルが認識されません。ファイル形式が認識されない
-
[解決済み] プリプロセッサー出力
-
[解決済み] 静的にリンクされたライブラリでGCCのリンク時最適化を使用する
-
[解決済み] コンパイル時に127のエラーが発生する。
-
[解決済み] LLVMとは何ですか?
-
[解決済み】gcc makefileのエラー。"No rule to make target ..." (ターゲットにするルールがありません)
-
[解決済み] ライブラリヘッダからのGCC警告を抑制する方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】gcc makefileのエラー。"No rule to make target ..." (ターゲットを作るルールがない)
-
[解決済み】g++ output: file not recognized: ファイル形式が認識されない
-
[解決済み] プリプロセッサー出力
-
[解決済み] 警告: 異なるサイズの整数への/からのポインタへのキャスト
-
[解決済み] 静的にリンクされたライブラリでGCCのリンク時最適化を使用する
-
configure: エラー: $PATH に受け入れ可能な C コンパイラがありません。
-
gccコンパイルオプション -fpermissive
-
[解決済み] OSX 10.9にXcodeをインストール - clang: エラー: 入力ファイルがありません。
-
[解決済み] なぜGCCはa*a*a*a*aを(a*a*a)*(a*a*a)に最適化しないのでしょうか?
-
[解決済み] brew install gccは時間がかかりすぎる