编辑源文件时,'make'不会重新编译

时间:2011-12-24 19:36:31

标签: c makefile recompile

我正在用C语言编写Conway的生命游戏的一些实现。源代码分为三个文件: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 $< 

3 个答案:

答案 0 :(得分:5)

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

尝试将此添加到您的Makefile:

%.o : functions.h

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

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

答案 1 :(得分:3)

你已经告诉make .o文件不依赖于.h文件,所以当标题改变时它不会重新编译。

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

答案 2 :(得分:3)

如果你正在使用GCC(嗯,你是),那么可以通过将-MD option传递给编译器来一般地解决它,GCC将生成一个包含对包含的头部的依赖性的文件:

CC = gcc
OBJECTS = main.o functions.o

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

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

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