12

すべての .c ファイルを一覧表示し、そのファイルに直接または間接的に含まれるすべての .h ファイルを一覧表示する現在のプロジェクトのドキュメントを作成する必要があります。

これは大規模なプロジェクトであり、理論的にはこの情報を含む Makefile がありますが、それらの Makefile が正しくない場合があります (このプロジェクトは別の会社から継承しました)。変更を実際に再コンパイルに反映させるために、頻繁に を実行する必要があったmake clean ; makeため、これらの Makefile に依存したくありません。

では、.c ファイルの名前とインクルード パスを指定して、.c ファイルに直接的または間接的に含まれるすべての .h ファイルを教えてくれるツールはありますか? みたいな変なものはありません

#define my_include "some_file.h"
#include my_include

そのため、ツールは完璧である必要はありません。通常のインクルードのインクルード パスで .c および .h ファイルを検索するものは何でも十分です。

4

5 に答える 5

15

Makefileで私がしていることは

SRCS=$(wildcard *.c)

depend: $(SRCS)
    gcc -M $(CFLAGS) $(SRCS) >depend

include depend

これは、ソース ファイルのいずれかが更新された場合、依存ルールが実行され、gcc -M を使用して依存というファイルを更新することを意味します。これは、すべてのソース ファイルの依存関係規則を提供するために、makefile に含まれます。

Make はファイルをインクルードする前にファイルが最新であることを確認するため、make を実行するたびに必要に応じてこの依存ルールが実行されます。

これは、ファイルが変更されたときにいつでも実行されます。私はこれが問題だと思ったことはありませんが、ディレクトリに膨大な数のファイルがあると時間がかかりすぎることに気付くかもしれません。

SRCS=$(wildcard *.c)
DEPS=$(SRCS:.c=.dep)

%.dep : %.c
    gcc -M $(CFLAGS) $< >$@

include $(DEPS)

-M の代わりに -MM を使用して、システム ヘッダーを含めないようにできることに注意してください。

于 2008-10-15T14:28:21.753 に答える
5

「gcc -M file.c」は必要なことを行います。

于 2008-10-15T14:20:15.657 に答える
4

gcc -M の代替はfastdepです。Fastdep の作成者は、fastdep が gcc の -M よりも 10 倍高速であると報告しています。プロジェクトのビルドに時間がかかる場合は、fastdep を検討する価値があります。

于 2008-10-17T11:08:52.997 に答える
2

SCon を使用する

$ 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
  ...
于 2008-10-28T18:35:31.413 に答える
1

MSVC (少なくとも 2005 と 2008、おそらく他のバージョンも同様ですが、VC6 ではありません) では、コンパイル中に含まれていたすべてのファイルをコンパイラに通知させることができます。出力は非常に冗長ですが、完全であり、人間の目で解析するのはかなり簡単です。

[プロジェクト設定] で、[C/C++] > [詳細設定] タブに移動し、[インクルードを表示] を切り替えてから、プロジェクトをゼロから再構築します。

于 2008-10-15T14:33:26.563 に答える