CXXFLAGSとCPPFLAGSの違い
MakefileのCXXFLAGSとCPPFLAGSの違いについて。
名前が似ているだけあって混同してしまっていることがあるので念の為に書いとく。
実は2つの変数の違いは公式ドキュメントを見ると一瞬で分かるので読む。
CXXFLAGS
Extra flags to give to the C++ compiler.
CPPFLAGS
Extra flags to give to the C preprocessor and programs that use it (the C and Fortran compilers).
CXXFLAGSはC++コンパイラ(CXX)のオプション、CPPFLAGSはCプリプロセッサのオプションを意味している。
MakefileにCPPFLAGS = -std=c++11
tと書くのは誤りで、CXXFLAGSを使わなければいけない。
試しにCXXFLAGSとCPPFLAGSで挙動が異なるMakefileを書いてみる。
実際に以下のコマンドでmakeする。
1 2 |
make -f Makefile.CXXFLAGS make -f Makefile.CPPFLAGS |
それぞれ実行した時の出力を見るとCXXFLAGSとCPPFLAGSの違いが出てくる。
1 2 3 4 |
gcc -std=c99 -c -o hello-c.o hello-c.c g++ -std=c++11 -c -o hello-cplusplus.o hello-cplusplus.cpp g++ -std=c++11 -c -o main.o main.cpp g++ hello-c.o hello-cplusplus.o main.o -o example |
1 2 3 4 5 |
gcc -std=c99 -std=c++11 -c -o hello-c.o hello-c.c cc1: warning: command line option ‘-std=c++11’ is valid for C++/ObjC++ but not for C g++ -std=c++11 -c -o hello-cplusplus.o hello-cplusplus.cpp g++ -std=c++11 -c -o main.o main.cpp g++ hello-c.o hello-cplusplus.o main.o -o example |
CプリプロセッサはCとC++の両方で使われるため、CPPFLAGSはどちらのソースコードをコンパイルする時でも使われる。
CPPFLAGSをC++コンパイラのオプションと勘違いしてMakefileを書くと、CコンパイラにもC++コンパイラのオプションまで渡されてしまう。
ではCPPFLAGSの正しい使い方はと言うとインクルードパスを指定するのに使うそうだ。
1 |
CPPFLAGS = -Iexample/include |