自动发现C依赖项

时间:2008-10-15 14:04:55

标签: c include dependencies

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

这是一个大项目,虽然我们有理论上有这些信息的Makefile,但那些Makefile有时是不正确的(我们从另一家公司继承了这个项目)。我们经常不得不做make clean ; make我们的更改实际上反映在重新编译中,所以我不想依赖这些Makefile。

那么是否有一个工具可以让我们给它一个.c文件的名称和一个包含路径,让它告诉我们.c文件直接或间接包含的所有.h文件?我们没有像

那样奇怪的东西
#define my_include "some_file.h"
#include my_include

因此该工具不需要完美。

。在常规包含的包含路径中搜索.c和.h文件的任何内容都是足够的。

5 个答案:

答案 0 :(得分:14)

我在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来不包含系统标头。

答案 1 :(得分:5)

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

答案 2 :(得分:4)

gcc -M的替代方案是fastdep。 Fastdep的作者报告fastdep比gcc的-M快十倍。如果项目需要一段时间来构建,fastdep可能值得一看。

答案 3 :(得分: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
  ...

答案 4 :(得分:1)

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

在项目设置中,转到C / C ++&gt;高级选项卡,然后切换“显示包含”,然后从头开始重建项目。