代码之家  ›  专栏  ›  技术社区  ›  Eli Courtwright

自动发现C依赖项

  •  11
  • Eli Courtwright  · 技术社区  · 16 年前

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

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

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

    #define my_include "some_file.h"
    #include my_include
    

    所以这个工具不需要完美。在include路径中搜索常规include的.c和.h文件就足够了。

    5 回复  |  直到 16 年前
        1
  •  14
  •   Mark Baker    16 年前

    我在makefile中所做的是

    SRCS=$(wildcard *.c)
    
    depend: $(SRCS)
        gcc -M $(CFLAGS) $(SRCS) >depend
    
    include depend
    

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

    make将在包含文件之前检查该文件是否是最新的,因此,如果需要,无论何时运行make,都将运行此dependy规则,而不需要执行“make dependy”。

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

    SRCS=$(wildcard *.c)
    DEPS=$(SRCS:.c=.dep)
    
    %.dep : %.c
        gcc -M $(CFLAGS) $< >$@
    
    include $(DEPS)
    

    请注意,可以使用-m m而不是-m来不包括系统头。

        2
  •  5
  •   Mike F    16 年前

    “gcc-m file.c”可以满足您的需要。

        3
  •  4
  •   Jonathan Wright    16 年前

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

        4
  •  2
  •   humble_guru    16 年前

    使用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
      ...
    
        5
  •  1
  •   John Dibling    16 年前

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

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