makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率
make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建
我们使用makefile就在当前目录下创建makefile/Makefile前单字母大写小写都可以。
makefile里面会有什么东西呢?
makefile里面会有依赖关系
依赖关系 :比如有个可执行文件test,但是想有它就要有test.c这个就叫做依赖关系,而使用test.c形成test这个就叫依赖方法
了解了这个我们就来正式使用makefile
在马克file输入下面代码,注意第二行不是用空格,一定要用TAB键
我们再把mytest.c文件给写上
这个时候我们就可以直接make,再运行make生成的可执行文件运行就行了
但是我们想要清理文件怎么办
vim makefile
改成那样就可以了.PHONY这是一个伪目标
输入 make clean就可以清除mytest可执行文件了
而至于为什么默认make是会执行make mytest而不是make clean是因为make mytest在上面,因为它是从上往下默认形成的
.PHONY:相当于makefile的语法格式中的一个关键字
比如clean被.PHONY修饰时,表明:总是被执行的
那么我们先来了解下总是不被执行的,比如下面的make 因为生成了mytest
所以接下的make除了第一次创建以外都会报错
而总是被执行就不会有这种问题,想执行多少次就执行多少次
但是它是怎么区分目标文件的新旧的
Access表示读取或者进入的时间
再了解下面二个,我们先回忆下文件 = 内容加属性
Modify表示内容变了的时间
Change表示属性变了的时间
看下面图片我们只改变了属性,可以看到只有change时间变了
但是这里要注意修改了内容,可能会改变属性,因为改变了内容,大小可能会发生变化
那么我们现在就来证明,因为旧文件比新文件生成的旧那么就不生成
那么我们来用touch来改下Modiy的更新时间看看make会不会成功,我们不改原代码
可以看到重新生成了
依次创建以下文件
test.c
#include"test.h"
void show()
{
printf("hello hello hello \n");
}
test.h
#include
extern void show();
main.c
#include"test.h"
int main()
{
show();
return 0;
}
makefile文件
hello:main.o test.o
gcc -o hello main.o test.o
main.o:main.c
gcc -c main.c -o main.o
test.o:test.c
gcc -c test.c -o test.o
.PHONY:clean
clean:
rm -f *.o hello