#include依存関係を追跡するツール[終了]


175

何か良い提案はありますか?入力はヘッダーファイルの名前で、出力はそれを直接または間接的に含むすべてのファイルのリスト(できればツリー)である必要があります。


4
これは「お気に入り」のインクルードについてではなく、gccでうまく表示されますが、msvsではそうではありません。したがって、私(I)はあらゆるツールを探しています。
架空の話

70
「オフトピック」の質問がこんなに役立つのはなぜですか。
jfritz42

5
@ jfritz42:これは「今年のコメント」賞を授与されるべきです!非常に多くのトピックと非常に多くのユーザーがいる場合、1人のモデレーターが質問に「オフトピック」のラベルを付けるにはどうすればよいですか?
トトロ

2
cpp-dependenciesiwyu、およびPythonで書かれた非常に素朴なツールであるdep-matrixなどの依存#include関係を処理するためのツールが他にもたくさんあることに注意したいと思います。
nonsensickle

3
@ jfritz42数は明らかです:123票と62のお気に入り。多くの人がこのように見ています。奇妙なSO標準。また、そのような質問がSuperUserで同じ優れた回答になることも疑っています。
アンドレアス

回答:


148

GCC / G ++にアクセスできる場合、-Mオプションは依存関係リストを出力します。他のツールが行うような追加のことは何もしませんが、コンパイラからのものであるため、「間違った」場所からファイルを取得する可能性はありません。


60
-H木さえも与える!
SamB、2011年

28
-MMシステムヘッダーをスキップする
TheJosh

3
また、-oオプションを指定すると、コンパイラは出力をstdoutではなくfileに書き込みます。
Hi-Angel

2
@SamBこれはエラーがない場合にのみ機能し、のstderr代わりに出力されますstdout。それ以外の場合、このオプションはより一般的です。
user877329 2016年

92

KeithBに感謝します。cl.exe(VS2008)のドキュメントを調べて、/ showIncludesフラグを見つけました。IDEから、これは任意のCPPファイルのプロパティページから設定できます。

スクリーンショット


1
これは、いくつかの非常に難しいコンパイルエラー/警告を解決するのに非常役立ちます。どうもありがとう!
アシュウィンナンジャッパ

これは、プリコンパイル済みヘッダーを最適化するときにも非常に便利です。
fmuecke

VSで作業するとき、これが私の問題を解決する最も速い解決策だと思います〜:-)
yaobin '22

一部のヘッダーにstd cヘッダーが含まれている場合、これは機能しないようです。例:math.h
abergmeier

29

重量のあるソリューションの場合は、doxygenを確認しください。それはあなたのコードベースをスキャンして、あなたのコードを文書化するウェブサイトを効果的に作り出します。それが示す多くの事柄の1つは、木を含むことです。

このツールの出力を他のプロセスにプラグインできるようにしたい場合、これは機能しない可能性があります(doxygenは他の形式に出力しますが、私はその機能に精通していません)。ただし、依存関係に注目したいだけなら、うまく機能するはずです。


20

私はcinclude2dotと呼ばれるツールをいじってみました。私がここで働くようになったとき、それはかなり大きなコードベースでハンドルを取得するのにかなり役に立ちました。最終的には、それを毎日のビルドに統合することを実際に考えました。


2
このツールは非常によく機能します。g ++の-Mとdoxygenで問題が発生しました。
sleeparrow 2016

私は、Pythonスクリプトを記述して、cinclude2dotの出力を読み取り、マップ内のすべての依存関係を取得してから、深さ優先トラバーサルを実行して、最終的にソースのフォレストを出力しました。その中に.cc/.c/.cxxファイルがないフォレスト(その中の.hファイルのみ)は冗長である可能性があります。
shuva 2018

12

まず、cinclude2dot.plはC / C ++コードを分析し、graphvizへの入力用のドットファイルとして#include依存関係グラフを生成するPerlスクリプトです。

http://www.flourish.org/cinclude2dot/

この種の手動ツールを使いたくない場合、私の意見では、はるかに勝者はProFactorの "IncludeManager"と呼ばれるツールです。

http://www.profactor.co.uk/includemanager.php

無料トライアルがあり、それは素晴らしいです。これは完全に統合されたVisual Studioのプラグインなので、ここで何かをダブルクリックすると、そこに含まれている場所に移動します。

ツールチップのマウスオーバーにより、必要なすべての情報が得られます。ドリルダウン/アップ、不要なサブツリー全体の削除、グラフ以外の表現の表示、これに一致するもののリストの循環、それは素晴らしいことです。

迅速に対応できる場合は、試用期間が終了する前に、大規模プロジェクトの#include構造をリファクタリングできます。それでも、1ライセンスあたり約$ 35ほどの費用はかかりません。

それが何をするために、それはちょうどほぼ完璧です。#includeグラフだけでなく、共有ファイルのプロジェクト間の依存関係、ビルド時間への影響、グリッドの詳細なプロパティ、完璧。


CプロジェクトでIncludeManagerを正常に使用しました。私は、Visual Studio 2013を使用しています
smwikipedia

ちょっと怪しい。
2018年

12

朗報:Redhat Source-Navigator(Windowsでも動作します)。もちろん、コンパイラスイッチ(前述)には優れた解析機能があり、これがMFC、Qt、およびそれらの魔法のキーワードをどのように処理するかはわかりません。

redhatソースナビゲーター


5

KeithBの答え基づいて、ここに自動的に1)依存関係ファイルを生成し、2)それらを最新に保ち、3)makefileで使用するGNUmake構文を示します。

.dep:
    mkdir $@
.dep/%.dep: %.c .dep
    (echo $@ \\; $(CC) $(IFLAGS) -MM $<) > $@ || (rm $@; false)
.dep/%.dep: %.cpp .dep
    (echo $@ \\; $(CXX) $(IFLAGS) -MM $<) > $@ || (rm $@; false)
DEPEND := $(patsubst %.dep,.dep/%.dep,$(OBJ:.o=.dep))
-include $(DEPEND)

(これらのインデントをハードタブに変更してください。)



3

理解するC ++はあなたを助けることができるはずです:それはあなたがPerlからアクセスできるデータベースを構築します。


理解は商用ですが、信じられないほどのIMOです。無料でお試しいただけます。
skelliam 2018

1

cscope(http://cscope.sourceforge.net/)は、スタンドアロンのxtermでこれを実行し、お気に入りのエディター内でも使用できます。優れたemacsとvi / vimをサポートしています。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.