ヘッダーファイルがどこからインクルードされているかを見分ける方法は?


97

g ++がインクルードファイルを見つけた場所を確認するにはどうすればよいですか?基本的に私が

#include <foo.h>

g ++は、パスを追加または変更するインクルードオプションを使用して、検索パスをスキャンします。しかし、今日の終わりに、g ++がコンパイルすることを選択したfoo.hの絶対パスを伝える方法はありますか?無数の検索パスにfoo.hが複数ある場合は特に関連があります。

それを達成する方法が不足しています...デフォルトとすべてのインクルードオプションを含めた後、g ++に最終的な検索パスを教えてもらう方法はありますか?


1
関連:子インクルードファイルがどの親インクルードファイルからインクルードされたかを知る方法はありますか?つまり、included-fromグラフを表示します(ヒント:gcc -Eがそこにない...処理される可能性があります。)
Krazy Glew

回答:


78

これにより、インクルードファイルの絶対パスをリストするmakeの依存関係が得られます。

gcc  -M showtime.c

システムに含めたくない場合(つまり#include <something.h>)、次を使用します。

gcc  -MM showtime.c

18
「-o myObj.o」と組み合わせて使用​​すると、コンパイルされたバイナリではなく、出力が「myObj.o」になります。-Mには暗黙の-Eがあるため、コンパイルは実行されません。代わりに-MDが非常に便利なオプションであることがわかりました。代わりにコンパイルが実行され、出力がmyObj.dに書き込まれます。* .oのような奇妙な影響なしにコンパイル行の先頭に追加するための適切なパラメーターを作成すると、バイナリの代わりに出力が含まれるようになりました。ご協力いただきありがとうございます。
harschware

ここでは、関連するすべてのgccオプションについて説明します
akhan

105
g++ -H ...

また、インクルードファイルの完全パスを、どのヘッダーにどのインクルードが含まれるかを示す形式で出力します。


7
私の経験では、これは-Mよりも役立つようです。何が何を含んでいるかの階層表示が好きです。
Brian Minton

良い、それはデバッグの目的に役立ちます。

1
これが最良の答えです。何も変更せずにビルドプロセスに追加できます。
Timmmm

4
これは実際に受け入れられた答えよりも質問に答えます。残念なことに、Clangがファイルを正常にコンパイルしようとするのを防ぐことができなかったため、結局使用しましたclang++ -MM -H(これは少し便利な組み合わせです)。
rookie1024

@ rookie1024 clang++ -H -fsyntax-only ...出力ファイルの生成を回避したい場合に使用します(機能しgccます)。
Lekensteyn

8

確かに使用

g++ -E -dI  ... (whatever the original command arguments were)

2
このソリューションにはいくつかの利点があります。1.単一のヘッダーファイルの複数のインクルードを検出できます(-Hおよび-Mは、インクルードされた各ファイルを一度だけ印刷します)2.インクルードされた場所を確認できます(元のファイルの名前と行番号)指示を含む)。3.これにより、あなたは確実にヘッダが直接的または間接的に含めるか、またはその両方(これは、クリーンアップのために重要である。)されているかどうかを区別することができます(!)
hagello

5

-MMまたは関連オプションのいずれか(-Mなど)を使用する場合、他のすべてのプリプロセッサ出力(提案されたg++ -E -dI解決策で得られるように見える)がなくても、含まれているヘッダーのリストのみが取得されます。


g++ -MM t.cc何も含まれていませんt.o: t.cc。他に何か必要ですか?
wallyk

3
ニース-完全を期すために、/showIncludesオプションを使用してMSVCと同様に取得できます。MSVCは、ヘッダーのネストを示すためにインデントします(-MGCCでは確認できません)。
マイケルバー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.