我需要为当前项目编写文档,列出所有.c文件,每个文件都列出该文件直接或间接包含的每个.h文件。
这是一个大项目,虽然我们有理论上有这些信息的Makefile,但那些Makefile有时是不正确的(我们从另一家公司继承了这个项目)。我们经常不得不做make clean ; make
我们的更改实际上反映在重新编译中,所以我不想依赖这些Makefile。
那么是否有一个工具可以让我们给它一个.c文件的名称和一个包含路径,让它告诉我们.c文件直接或间接包含的所有.h文件?我们没有像
那样奇怪的东西#define my_include "some_file.h"
#include my_include
因此该工具不需要完美。
。在常规包含的包含路径中搜索.c和.h文件的任何内容都是足够的。答案 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;高级选项卡,然后切换“显示包含”,然后从头开始重建项目。