メモの日々


2017年11月21日(火) [長年日記]

[c][c++][dev] GCCの依存関係ファイル出力用のオプション

GCCには生成するオブジェクトファイルが依存しているファイル(ソースファイルとそこからincludeしているファイル)の情報をMakefileの形式で出力する機能があって、以前も少しメモしている。GCC 7.2のマニュアルだと

に説明がある。このオプションは覚えにくいので、自分が使うものだけ改めてメモしておく。

-MMD

-MMDオプションを指定すると、コンパイル時に依存関係を .d ファイルに出力してくれる。

このオプションを使った場合、.d ファイルに「システムヘッダファイル」は出力されない。システムヘッダファイルとは標準ライブラリのヘッダファイルなどだけれど、ヘッダファイルの探索ディレクトリ指定に -I の代わりに -isystem を使うとそのディレクトリ配下のヘッダファイルもシステムヘッダファイルとして扱われる。この仕組みを使えばBoostのような巨大なヘッダファイル群を .d ファイルに出力しないようにできる。

$ g++ src/main.cpp -o build/main.o -MMD && cat build/main.d
build/main.o: src/main.cpp src/a.h

-MP

-MPオプションを指定すると、.d ファイルにヘッダファイル用のターゲットも出力される。こうすると、ヘッダファイルを削除したときにコンパイルエラーになるのを防ぐことができる。

$ g++ src/main.cpp -o build/main.o -MMD -MP && cat build/main.d
build/main.o: src/main.cpp src/a.h

src/a.h:

-MF file

-MFオプションを指定すると、依存関係ファイルのファイル名を指定することができる。

$ g++ src/main.cpp -o build/main.o -MMD -MP -MF hello && cat hello
build/main.o: src/main.cpp src/a.h

src/a.h:

-MT target

-MTオプションを指定すると、.d ファイルに出力するターゲットファイル名を指定することができる。

$ g++ src/main.cpp -o build/main.o -MMD -MP -MT world && cat build/main.d
world: src/main.cpp src/a.h

src/a.h: