【问题标题】:How to manage C header file dependencies?如何管理 C 头文件依赖关系?
【发布时间】:2012-03-07 09:15:03
【问题描述】:

我有很多 C 文件,有些有头文件 (.h),有些文件没有。

这是我的生成文件:

.SUFFIXES: 

SRC := $(wildard ./src/*.c)
OBJ := $(SRC:%.c=%.o)

all: $(OBJ)

%.o: %.c
    $(MyNotGCCCompiler) "@../$(*F).cmd"

它工作正常,除了如果我更改头文件,目标不会重新编译,因为不包含在依赖项中。

我该如何处理这个案例?

谢谢

【问题讨论】:

    标签: makefile gnu-make


    【解决方案1】:

    标准方法是在编译时自动生成头文件依赖项。

    第一次编译不需要依赖,因为必须编译每个源文件。后续重新编译会加载上一次编译生成的依赖项,以确定需要重新编译的内容。

    您的$(MyNotGCCCompiler) 可能有一个命令行选项来生成依赖文件。

    当使用gcc 时,它的工作方式如下:

    .SUFFIXES: 
    
    SRC := $(wildard ./src/*.c)
    OBJ := $(SRC:%.c=%.o)
    DEP := $(OBJ:%.o=%.d)
    
    all: $(OBJ)
    
    # when compiling produce a .d file as well 
    %.o: %.c
        gcc -c -o $@ $(CPPFLAGS) $(CFLAGS) -MD -MP -MF ${@:.o=.d} $<
    
    # don't fail on missing .d files
    # there won't be any on the first run
    -include $(DEP) 
    

    【讨论】:

      【解决方案2】:

      (我不确定这不是在说明显而易见的事情,但无论如何:)

      添加规则以逐个文件显式列出这些依赖项。 最好在一个单独的 makefile 中包含在主文件中。

      存在可以为您生成它们的工具(例如gcc);如果您无法使用或构建此类工具,则需要自己维护这些规则。

      【讨论】:

      • Makefile 是通用的,并在多个项目中使用。有太多文件需要手动维护。
      • 这就是为什么您必须生成此文件并将其包含在通用 Makefile 中的原因。这是 GNU 自动工具和 CMake 等工具存在的原因之一。
      • @reinierpost:这些工具的存在更多是出于可移植性的原因,而不是生成依赖项。
      • @Maxim Yegorushkin:当然。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-12
      • 2011-11-11
      • 1970-01-01
      • 2013-09-12
      • 1970-01-01
      • 2015-06-06
      相关资源
      最近更新 更多