自动发现C依赖项

Eli*_*ght 11 c dependencies include

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

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

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

#define my_include "some_file.h"
#include my_include
Run Code Online (Sandbox Code Playgroud)

所以这个工具不需要是完美的.在常规包含的包含路径中搜索.c和.h文件的任何内容都足够好.

Mar*_*ker 14

我在Makefile中做的是

SRCS=$(wildcard *.c)

depend: $(SRCS)
    gcc -M $(CFLAGS) $(SRCS) >depend

include depend
Run Code Online (Sandbox Code Playgroud)

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

Make会在包含文件之前检查文件是否是最新的,因此只要你运行make就必须运行这个依赖规则而不需要"make depend".

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

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

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

include $(DEPS)
Run Code Online (Sandbox Code Playgroud)

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

  • 哦,并且对于性能请注意,如果任何文件更改,这将重新处理所有文件.因此,您可能希望拥有多个依赖文件(每个源文件甚至可能有一个).最后,请注意,您通常可以使用-MM来跳过对系统头的依赖,因为您不会更改它们. (2认同)

小智 5

"gcc -M file.c"可以满足您的需求.