Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C ';制作';编辑源文件后不重新编译_C_Makefile_Recompile - Fatal编程技术网

C ';制作';编辑源文件后不重新编译

C ';制作';编辑源文件后不重新编译,c,makefile,recompile,C,Makefile,Recompile,我正在用C编写Conway的生活游戏的一个小实现。源代码分为三个文件:main.C和functions.C/functions.h,我将函数定义和声明放在其中 现在,要创建单元格网格,我有一个这种类型的矩阵: Cell grid[GRID_HEIGHT][GRID_WIDTH]; 其中网格高度和网格宽度是函数中定义的常量。h: #define GRID_HEIGHT 10 #define GRID_WIDTH 10 程序运行良好,使用make和Makefile编译。但问题是:如果我试图更改网

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

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

Cell grid[GRID_HEIGHT][GRID_WIDTH];
其中
网格高度
网格宽度
函数中定义的常量。h

#define GRID_HEIGHT 10
#define GRID_WIDTH 10
程序运行良好,使用make和Makefile编译。但问题是:如果我试图更改
网格高度
网格宽度
,当我再次运行Makefile时,它会显示所有文件都是最新的! 我曾尝试使用良好的ol'way
gcc main.c等进行编译
,它运行正常。那么,为什么make不重新编译源代码呢

这是我的生成文件:

CC = gcc
OBJECTS = main.o functions.o

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

%.o : %.c
    $(CC) -c $< 
%.o : functions.h
CC=gcc
OBJECTS=main.o functions.o
生活的游戏:$(对象)
$(CC)$(对象)-o游戏\生活\诅咒
%.o:%.c
$(CC)-c$<

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

尝试将其添加到生成文件:

CC = gcc
OBJECTS = main.o functions.o

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

%.o : %.c
    $(CC) -c $< 
%.o : functions.h
或者,将现有规则修改为:

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

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

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

如果您使用的是GCC(当然,您是),则可以通过传递给编译器来解决它,GCC将生成一个文件,其中包含对包含标题的Make依赖项:

CC = gcc
OBJECTS = main.o functions.o

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

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

一些标题相关信息也有疑问。

因为
main.o
依赖于
functions.h
,但您没有在Makefile中指出依赖性如果这一切看起来太复杂,我可能会建议您-您完整的构建文件将是单行
程序(“生命游戏”[“main.c”、“functions.c”)],LIBS=[“ncurses”])
SCons会根据源文件本身自动确定头文件依赖关系,因此您无需考虑。谢谢。我正在使用make的第一步。请注意,这也取决于使用GNU make——make的一些版本不理解
包括
是的,我同意。还有一些实现(包括GNU Make)可以识别
sinclude