“制作”编辑源文件后不重新编译

发布于 2024-12-23 01:15:31 字数 761 浏览 2 评论 0 原文

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

I'm writing a little implementation of Conway's Game of Life in C. The source code is split in three files: main.c and functions.c/functions.h, where I put my functions definitions and declarations.

Now, to create a grid of cell, I have a matrix of this type:

Cell grid[GRID_HEIGHT][GRID_WIDTH];

where GRID_HEIGHT and GRID_WIDTH are constants defined in functions.h:

#define GRID_HEIGHT 10
#define GRID_WIDTH 10

The program runs fine, compiled with make and Makefile. But the problem is: if I try to change GRID_HEIGHT or GRID_WIDTH, when I run again my Makefile it says that all files are up-to-date!
I've tried to compile using the good ol' way gcc main.c etc. and it runs as it should. So, why make does not recompile the source?

This is my Makefile:

CC = gcc
OBJECTS = main.o functions.o

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

%.o : %.c
    $(CC) -c 
lt; 

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

找回味觉 2024-12-30 01:15:32

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

尝试将其添加到您的 Makefile:

%.o : functions.h

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

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

Because you haven't told it that recompilation depends on functions.h.

Try adding this to your Makefile:

%.o : functions.h

Alternatively, modify your existing rule to be:

%.o : %.c functions.h
    $(CC) -c 
lt; -o $@
回忆那么伤 2024-12-30 01:15:32

您已经告诉 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.

最近可好 2024-12-30 01:15:32

如果您使用的是 GCC(嗯,确实如此),那么通常可以通过传递 -MD选项给编译器,GCC会生成一个包含Make依赖于包含头文件的文件:

CC = gcc
OBJECTS = main.o functions.o

%.o : %.c
    $(CC) -MD -c 
lt;

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

一些头文件相关的信息也可以在这个问题。

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:

CC = gcc
OBJECTS = main.o functions.o

%.o : %.c
    $(CC) -MD -c 
lt;

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

Some headers-related information can also be found in this question.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文