make/Makefile的用法
程序员文章站
2022-04-04 11:12:03
...
make/Makefile:
1. make
make是一条命令
2. makefile
Makefile 是一个文件,两个搭配起来使用,完成项目自动化处理
3. make/Makefile的作用:
- 1.一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,而Makefile定义了一系列的规则来制定。 哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于一些更为复杂的功能操作,因为Makefile就像是一个shell脚本一样,其中也可以执行操作系统的命令。
- 2.Makefile的好处——“ 自动化编译 ”。一旦写好,只需要一个make命令,整个工程完成自动化编译,极大的提高了软件开发的效率。
- 3.make是一个命令工具,是一个解释Makefile中指令的命令工具。
下面我们写一个计算器 math ,其中包含的文件有: add.c add.h sub.c sub.h mul.c mul.h div.c div.h main.c Makefile
代码:
add.c
#include "add.h"
int add(int a,int b)
{
return a + b;
}
add.h:
#ifndef __ADD_H__
#define __ADD_H__
int add(int a,int b);
#endif /// __ADD_H__
sub.c
#include "sub.h"
int sub(int a,int b)
{
return a - b;
}
sub.h
#ifndef __SUB_H__
#define __SUB_H__
int sub(int a,int b);
#endif /// __SUB_H
mul.c
#include "mul.h"
int mul(int a,int b)
{
return a * b;
}
mul.h
#ifndef __MUL_H__
#define __MUL_H__
int mul(int a,int b);
#endif /// __MUL_H
div.c
#include "div.h"
int div(int a,int b)
{
return a/b;
}
div.h
#ifndef __DIV_H__
#define __DIV_H__
int div(int a,int b);
#endif /// __DIV_H
sub.c sub.h mul.c mul.h div.c div.h 类似于add.c add.h
main.c
#include <stdio.h>
#include "add.h"
#include "sub.h"
#include "mul.h"
#include "div.h"
int main()
{
int a,b;
printf("input a b : ");
scanf("%d %d",&a,&b);
printf(" %d + %d = %d\n",a,b,add(a,b));
printf(" %d - %d = %d\n",a,b,sub(a,b));
printf(" %d * %d = %d\n",a,b,mul(a,b));
printf(" %d / %d = %d\n",a,b,div(a,b));
}
makefile的三种写法:
目标文件:依赖文件
tab命令 gcc 依赖文件 -o 目标文件
其中 $^代表依赖文件,aaa@qq.com代表目标文件。
- 第一种:
main : main.o add.o sub.o mul.o div.o
gcc main.o add.o sub.o mul.o div.o -o main
add.o : add.c
gcc -c add.c -o add.o
sub.o : sub.c
gcc -c sub.c -o sub.o
mul.o : mul.c
gcc -c mul.c -o mul.o
div.o : div.c
gcc -c div.c -o div.o
main.o : main.c
gcc -c main.c -o main.o
clean:
rm -rf *.o
第二种:
main:main.o add.o sub.o mul.o div.o
gcc $^ -o aaa@qq.com
%.o : %.c
gcc -c $^ -o aaa@qq.com
clean:
rm -rf *.o
第三种:
.PHONY:clean main
main:main.o add.o sub.o mul.o div.o
gcc $^ -o aaa@qq.com
%.o : %.c
gcc -c $^ -o aaa@qq.com
clean:
rm -rf *.o
1.其中clean:
rm -rf *.o 的意思是:去掉所有带有 .o 的文件
2. .PHONY:clean main的使用(使第一次make后,make clean后,不用更新Makefile文件,
也能执行main) ;如果没有这句话,不更新Makefile的情况下,第二次make,则会出现
“main”是最新的。
3. .PHONY的作用:
1 避免和同名文件冲突;
2 改善性能。
这个的作用就是:每次执行make的时候,都忽略最新的,而去每次执行 .PHONY后面的命令
假如.PHONY后面只有clean的话,如果没有make clean,执行make,会一直告诉我们
main是最新的,而如果加了main的话,不管有没有make clean,只要make,就会执行main
这条命令
第一.二种Makefile,make后的结果:
1.第一次 make,会编译
2. 然后再去执行make,会发现:make:”main”是最新的
3. 而如果make clean 之后,会发现再一次make的时候,会再去编译
第三种Makefile,make后的结果:
而加了.PHONY:main clean之后,无论执行不执行make clean,,都会去执行main这条命令