117

CPPFLAGS はプリプロセッサによって使用されるのに対し、CFLAGS (または C++ の場合は CXXFLAGS) はコンパイラ用であることを理解しています。

しかし、私はまだ違いを理解していません。

#include でインクルードされるヘッダー ファイルのインクルード パスを指定する必要があります。

どのような状況でコンパイラに追加のインクルード パスを与える必要がありますか?

一般に、プリプロセッサが必要なヘッダー ファイルを見つけてインクルードする場合、追加のインクルード ディレクトリについて通知する必要があるのはなぜですか? CFLAGS はどのような用途に使用されますか?

(私の場合、実際には、これらの両方でプログラムをコンパイルできることがわかりましたこれにより、混乱が増します... CFLAGSまたはCPPFLAGS を使用して目標を達成できます (少なくとも autoconf コンテキストで)。何が得られますか?)

4

6 に答える 6

164

C プログラムをコンパイルするための暗黙的な make 規則は次のとおりです。

%.o:%.c
    $(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $<

ここで、$()構文は変数を展開します。CPPFLAGSとの両方CFLAGSがコンパイラ呼び出しで使用されるため、インクルード パスを定義するためにどちらを使用するかは、個人的な好みの問題です。たとえばfoo.c、現在のディレクトリにあるファイルの場合

make foo.o CPPFLAGS="-I/usr/include"
make foo.o CFLAGS="-I/usr/include"

どちらもまったく同じ方法でコンパイラを呼び出します。つまり、

gcc -I/usr/include -c -o foo.o foo.c

2 つの違いは、同じインクルード パスを必要とする複数の言語がある場合に現れますbar.cpp

make bar.o CPPFLAGS="-I/usr/include"
make bar.o CFLAGS="-I/usr/include"

その後、コンパイルは

g++ -I/usr/include -c -o bar.o bar.cpp
g++ -c -o bar.o bar.cpp

C++ の暗黙の規則もCPPFLAGS変数を使用するためです。

この違いにより、どの言語を使用するかについての良いガイドが得られます。フラグをすべての言語に使用するCPPFLAGS場合は、 に入れ、特定の言語に使用する場合は に入れます。後者のタイプCFLAGSCXXFLAGS例には、標準準拠または警告フラグが含まれます。 - -std=c99C++ コンパイラに渡したくありません!

その後、メイクファイルで次のような結果になる可能性があります

CPPFLAGS=-I/usr/include
CFLAGS=-std=c99
CXXFLAGS=-Weffc++
于 2010-05-03T07:29:16.323 に答える
11

CPPFLAGSマクロは、ディレクトリを指定するために使用するものです#include

(1)ルールは前処理とコンパイルの両方を1つのコマンドに組み合わせているため、両方とも機能しますCPPFLAGS(コマンドで両方のマクロが使用されます)。CFLAGSmake

.形式を使用する場合は、include-directory として指定する必要はありません#include "..."。また、標準のコンパイラ インクルード ディレクトリを指定する必要もありません。他のすべてのインクルード ディレクトリを指定する必要があります。

于 2010-05-02T21:45:29.763 に答える
4

あなたは暗黙の make rules の後にいます。

于 2010-05-02T21:07:52.850 に答える