4

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

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

Cell grid[GRID_HEIGHT][GRID_WIDTH];

其中GRID_HEIGHTGRID_WIDTH是在 中定义的常量functions.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 $< 
4

3 回答 3

7

因为您还没有告诉它重新编译取决于functions.h.

尝试将此添加到您的 Makefile:

%.o : functions.h

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

%.o : %.c functions.h
    $(CC) -c $< -o $@
于 2011-12-24T19:39:46.320 回答
3

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

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

于 2011-12-24T19:39:56.640 回答
3

如果你使用的是 GCC(好吧,你是),那么它可以通过将-MD选项传递给编译器来解决,GCC 将生成一个包含 Make 对包含的头文件的依赖项的文件:

CC = gcc
OBJECTS = main.o functions.o

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

-include $(OBJECTS:.o=.d)

在这个问题中也可以找到一些与标题相关的信息。

于 2011-12-24T20:01:29.023 回答