我需要为当前项目编写文档,列出所有.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的文件。然后将其包含在makefile中,以提供所有源文件的依赖关系规则。

Make会在包含文件之前检查文件是否为最新版本,因此只要您运行make,此依赖规则就会运行,而不需要执行<!>“make depend <!>”。

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

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

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

include $(DEPS)

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

其他提示

<!> quot; gcc -M file.c <!> quot;做你需要的。

gcc -M的替代方案是 fastdep 。 Fastdep的作者报告fastdep比gcc的-M快十倍。如果项目需要一段时间来构建,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;高级选项卡,然后切换<!>“显示包含,<!>”;然后从头开始重建你的项目。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top