質問
すべての.cファイルをリストする現在のプロジェクトのドキュメントを作成する必要があり、各ファイルには、そのファイルによって直接または間接的に含まれるすべての.hファイルがリストされます。
これは大規模なプロジェクトであり、理論的にはこの情報を持つMakefileがありますが、それらのMakefileは間違っている場合があります(このプロジェクトを別の会社から継承しました)。変更が実際に再コンパイルに反映されるためには、多くの場合make clean ; make
を実行する必要があったため、これらのMakefileに依存したくありません。
では、.cファイルの名前とインクルードパスを指定し、.cファイルに直接または間接的に含まれるすべての.hファイルを教えてくれるツールがありますか?変なものはありません
#define my_include "some_file.h"
#include my_include
したがって、ツールは完璧である必要はありません。通常のインクルードのインクルードパスで.cファイルと.hファイルを検索したものであれば何でも十分です。
解決
Makefileで行うことは
SRCS=$(wildcard *.c)
depend: $(SRCS)
gcc -M $(CFLAGS) $(SRCS) >depend
include depend
これは、ソースファイルのいずれかが更新された場合、dependルールが実行され、gcc -Mを使用してdependと呼ばれるファイルを更新することを意味します。これは、すべてのソースファイルの依存関係ルールを提供するために、メイクファイルに含まれます。
Makeはファイルを含める前にファイルが最新であることを確認するため、必要に応じて<!> quot; make depend <!> quot;を実行せずにmakeを実行すると、この依存ルールが実行されます。
これは、ファイルが変更されるたびに実行されます。これは問題だとは思いませんでしたが、ディレクトリに膨大な数のファイルがある場合、時間がかかりすぎることがあります。この場合、ソースファイルごとに1つの依存関係ファイルを次のように試すことができます。
SRCS=$(wildcard *.c)
DEPS=$(SRCS:.c=.dep)
%.dep : %.c
gcc -M $(CFLAGS) $< >$@
include $(DEPS)
-Mの代わりに-MMを使用して、システムヘッダーを含めないことに注意してください。
他のヒント
<!> quot; gcc -M file.c <!> quot;必要なことを行います。
gcc -Mの代わりに fastdep があります。 Fastdepの作者は、fastdepがgccの-Mより10倍速いと報告しています。プロジェクトのビルドに時間がかかる場合、fastdepは一見の価値があります。
SConsを使用
$ scons --tree=all
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
scons: `.' is up to date.
+-.
+-SConstruct
+-app
| +-test.o
| | +-test.c
| | +-/include/PCI_1149_1.h
| | +-/include/Pci.h
| | +-/usr/bin/gcc
| +-/usr/bin/gcc
| +-/lib/libpci1149_64.a
...
MSVC(少なくとも2005および2008、VC6ではなく他のバージョンも可能)では、コンパイル中に含まれていたすべてのファイルをコンパイラーに通知させることができます。出力は非常に詳細ですが、完全であり、人間の目で解析するのはかなり簡単です。
プロジェクト設定で、C / C ++ <!> gt;詳細タブに移動し、<!> quot; Show Includes、<!> quot;を切り替えます。その後、プロジェクトをゼロから再構築します。