【问题标题】:'make' does not recompile when source file has been edited编辑源文件后,“make”不会重新编译
【发布时间】:2011-12-24 19:36:30
【问题描述】:

我正在用 C 语言编写康威生命游戏的小实现。源代码分为三个文件:main.cfunctions.c/functions.h,我将函数定义和声明放在其中。

现在,要创建一个单元格网格,我有一个这种类型的矩阵:

Cell grid[GRID_HEIGHT][GRID_WIDTH];

其中GRID_HEIGHTGRID_WIDTHfunctions.h 中定义的常量:

#define GRID_HEIGHT 10
#define GRID_WIDTH 10

程序运行良好,使用 make 和 Makefile 编译。但问题是:如果我尝试更改 GRID_HEIGHTGRID_WIDTH,当我再次运行我的 Makefile 时,它​​会说所有文件都是最新的! 我尝试使用良好的方式进行编译 gcc main.c etc. 并且它可以正常运行。那么,为什么make不重新编译源码呢?

这是我的 Makefile:

CC = gcc
OBJECTS = main.o functions.o

Game\ of\ Life : $(OBJECTS)
    $(CC) $(OBJECTS) -o Game\ of\ Life -lncurses

%.o : %.c
    $(CC) -c $< 

【问题讨论】:

  • 因为 main.o 依赖于 functions.h 但您没有在 makefile 中指出该依赖关系
  • 如果这一切看起来太复杂,我可能会推荐SCons - 你的完整构建文件将是单行Program("Game Of Life", ["main.c", "functions.c"], LIBS=["ncurses"]) SCons 会根据源本身自动确定头文件依赖关系,所以你不要'不必考虑。

标签: c makefile recompile


【解决方案1】:

因为你没有告诉它重新编译依赖于functions.h

尝试将其添加到您的 Makefile:

%.o : functions.h

或者,将现有规则修改为:

%.o : %.c functions.h
    $(CC) -c $< -o $@

【讨论】:

  • 谢谢。我正在使用 make 的第一步。
【解决方案2】:

您已经告诉 make .o 文件不依赖于 .h 文件,因此当标头更改时它不会重新编译任何内容。

让它正常工作很难(您需要为每个 .c 文件生成依赖项),但一种简单的方法是定义包含所有头文件的 HEADERS 并使每个 .o 文件依赖于所有头文件。

【讨论】:

    【解决方案3】:

    如果你使用的是 GCC(嗯,你是),那么它可以通过将 -MD option 传递给编译器来解决,GCC 将生成一个包含 Make dependencies on included headers 的文件:

    CC = gcc
    OBJECTS = main.o functions.o
    
    %.o : %.c
        $(CC) -MD -c $<
    
    -include $(OBJECTS:.o=.d)
    

    一些标头相关信息也可以在this问题中找到。

    【讨论】:

    • 请注意,这也取决于使用 GNU make -- 某些版本的 make 无法理解 include
    • 是的,我同意。还有一些实现(包括 GNU Make)识别sinclude
    猜你喜欢
    • 2017-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-08
    • 1970-01-01
    相关资源
    最近更新 更多