12

我需要为我当前的项目编写文档,其中列出了所有 .c 文件,并且每个文件都列出了该文件直接或间接包含的每个 .h 文件。

这是一个大项目,虽然我们有 Makefiles 理论上有这些信息,但这些 Makefiles 有时是不正确的(我们从另一家公司继承了这个项目)。我们经常不得不做一些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

这意味着如果任何源文件被更新,depend 规则将运行,并使用 gcc -M 来更新名为depend 的文件。然后将其包含在生成文件中,以提供所有源文件的依赖规则。

Make 将在包含文件之前检查文件是否是最新的,因此只要您运行 make 而无需执行“make depend”,此依赖规则就会在必要时运行。

这将在任何文件发生更改时运行。我从来没有发现这是一个问题,但是如果您在目录中有大量文件,您可能会发现花费的时间太长,在这种情况下,您可以尝试为每个源文件设置一个依赖文件,如下所示:

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

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

include $(DEPS)

请注意,您可以使用 -MM 而不是 -M 来不包含系统标头。

于 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 快十倍。如果项目需要一段时间来构建,fastdep 可能值得一看。

于 2008-10-17T11:08:52.997 回答
2

使用 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
  ...
于 2008-10-28T18:35:31.413 回答
1

在 MSVC(至少 2005 和 2008,可能还有其他版本,但不是 VC6)中,您可以让编译器告诉您编译期间包含的所有文件。输出非常冗长,但完整且相当容易用人眼解析。

在 Project Settings 中,转到 C/C++>Advanced 选项卡,然后切换“Show Includes”,然后从头开始重建您的项目。

于 2008-10-15T14:33:26.563 回答