“制作”编辑源文件后不重新编译
我正在用 C 语言编写康威生命游戏的一个小实现。源代码分为三个文件: main.c
和 functions.c
/functions .h
,我在其中放置函数定义和声明。
现在,为了创建单元格网格,我有一个这种类型的矩阵:
Cell grid[GRID_HEIGHT][GRID_WIDTH];
其中 GRID_HEIGHT 和 GRID_WIDTH 是在functions.h 中定义的常量:
#define GRID_HEIGHT 10
#define GRID_WIDTH 10
程序运行良好,使用 make 和 Makefile 编译。但问题是:如果我尝试更改 GRID_HEIGHT
或 GRID_WIDTH
,当我再次运行我的 Makefile 时,它会说所有文件都是最新的!
我尝试使用良好的方式进行编译 gcc main.c 等
并且它按预期运行。那么,为什么 make 不重新编译源代码呢?
这是我的 Makefile:
CC = gcc
OBJECTS = main.o functions.o
Game\ of\ Life : $(OBJECTS)
$(CC) $(OBJECTS) -o Game\ of\ Life -lncurses
%.o : %.c
$(CC) -c $<
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
因为你没有告诉它重新编译取决于
functions.h
。尝试将其添加到您的 Makefile:
或者,将现有规则修改为:
Because you haven't told it that recompilation depends on
functions.h
.Try adding this to your Makefile:
Alternatively, modify your existing rule to be:
您已经告诉 make .o 文件不依赖于 .h 文件,因此当标头更改时它不会重新编译任何内容。
让它正常工作是很困难的(您需要为每个 .c 文件生成依赖项),但一个简单的方法就是定义包含所有头文件的 HEADERS 并使每个 .o 文件依赖于您的所有头文件。
You've told make that .o files don't depend on .h files, so it doesn't recompile anything when a header changes.
Getting it to work right is hard (you need to generate dependencies for each .c file), but an easy way is just to define HEADERS which contains all your header files and make each .o file depend on all your headers.
如果您使用的是 GCC(嗯,确实如此),那么通常可以通过传递
-MD
选项给编译器,GCC会生成一个包含Make依赖于包含头文件的文件:一些头文件相关的信息也可以在这个问题。
If you're using GCC (well, you are), then it can be solved generically by passing
-MD
option to the compiler, GCC will generate a file containing Make dependencies on included headers:Some headers-related information can also be found in this question.