自动发现C依赖项

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

这是一个大项目,虽然我们有理论上有这些信息的Makefile,但那些Makefile有时是不正确的(我们从另一家公司inheritance了这个项目)。 我们经常不得不做一个make clean ; make 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来不包含系统标头。

“gcc -M file.c”可以满足您的需求。

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 ++”>“高级”选项卡,然后切换“显示包含”,然后从头开始重建项目。