Makefile中依赖文件要不要写头文件

来源:互联网 发布:autodesk的造型软件 编辑:程序博客网 时间:2024/05/22 05:30

首先声明,本人刚入编程不久,很多东西处于起步状态,若表述有错误,还请指出,互相进步。

这段时间在学习Makefile,发现之前很多遇到的makefile依赖文件中都没有头文件,但是后来在系统学习的时候,发现书上经常把头文件写进Makefile的依赖文件中,我就特别好奇到底依赖文件中需不需要写头文件呢?

首先给大家分享一个自己写的代码,由于代码很长,本人故意将代码简化,只要能说明问题即可。

一个头文件:my.h

#include <stdio.h>
#include <string.h>

struct student
{
int num;
char name[20];
};
struct student stu[20];

memset(stu,0,120);


一个主函数:test.c

#include "my.h"

int main(void)
{
printf("hello world.\n");
return 0;
}


还有一个Makefile:

test:test.o
gcc -o test test.o

test.o:test.c
gcc -c test.c


测试方法:

1:直接make,会报错,相信很多人早就看出问题所在了,我在头文件中调用了memset函数,但这个调用是在main函数之外,肯定会报错的。

2:将头文件中的memset这句代码用//给屏蔽起来,然后make,编译通过。

3:再将memset这句代码解除屏蔽,再make一下,编译继续通过(会出现一行提示,意思是未发生改变)。


当时我遇到这个问题的时候,真的是彻底的懵了,今天看了Makefile之后,忽然焕然大悟。原因就在于Makefile的工作原理,是检查依赖文件是否发生变化来决定是否再次编译。

在本例的Makefile中,依赖文件一个是test.c文件,一个是test.o文件,test.o文件是依赖于test.c文件生成的。大家注意,我们在屏蔽memset函数之后,进行make和将memset函数解开,再次make的过程中,我们只修改了my.h的头文件,根本没有修改test.c文件。也就是说,生成test可执行文件的依赖文件test.c文件,我们一直都没有修改,所以我们make之后,根本不会再次编译。


解决方法:

1:我们在依赖文件中添加my.h,所以只要修改了my.h,make之后必定会重新编译,从而发现错误。

2:我们每次编译前先把所有之前生成的文件全都删除(如本例的test.o,test可执行文件,可以在Makefile中增加删除的相关命令),这样由于第二次编译时,发现没有test.o文件(相当于发生了变化),必定又重新编译从而发现错误。


以上都是本人自己总结,由于刚刚起步,可能很多东西都说的不对,望大家指正,谢谢。

原创粉丝点击