我们写大型项目时,一般需要很多源文件,源文件会在不同的目录中的文件夹里面包含着,这样我们所有的源文件不会在一个文件中包含,用gcc -o main 所有的.c文件来编译,就很麻烦了,你需要记住所有的.c文件。这时makefile应运而生。
文章目录
一、makefile概念
【1. 概念:】
makefile它制定一系列的规则来指定,哪写文件需要先编译,哪写文件需要后编译,那些文件需要重新编译(可以自动检测哪写文件被修改了,修改了进行编译,没修改就不用重新编译了)。关系到整个工程的编译规则,也可执行操作系统的命令。和windows上IDE一样,管理工程,实现自动化编译。。
【2. 优点:】
- makefile带来的好处就是自动化编译,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
- 每次只会编译修改的和依赖于修改的那些文件,提高了编译效率。
【3. make】
make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数IDE都有这个命令。管理工程,实现自动化编译。
【4.make和makefile的关系】
make是一个命令,makefile是一个文件,当makefile文件写好后,只需要一个make命令就可以将makefile文件运行起来。所以make是解释makefile中指令的命令工具。
二、如何实现makefile
总结makefile文件的实现思想:就是把你需要的目标文件,.o文件,.c文件如何实现的规则(指令)按照格式写进去就可以。
(一)基础的makefile文件(生成单可执行文件)
前提:所有文件均在统一目录下。
1.格式
【】里内容是格式,()是解释。
首先对可执行文件的生成建立规则
第一行【最后要生成的可执行文件名:需要依赖的文件(.o)】
第二行【 (Tab键)生成可执行文件的指令(gcc -o main main.o ……)】
然后对.o文件的生成建立规则:
第三行【.o文件:需要依赖的文件(.c)】
第四行【 (Tab键)生成.o文件的指令(gcc -c main.c)】
如果还有.o文件继续重复3,4行,只需改变文件名即可。
我们最后只需要一个可执行文件,所以中间的.o文件我们不需要,可以把他们删了,这个标识的作用就是这个。
第n行【clean:(一个标识,需要手动调)】
第n+1行【rm *.o main(删除.o,main文件)】
2.示例
我们写四个函数方法文件(add.c,sub.c,mux.c,div.c)一个头文件(my_math.h),一个主函数文件(main.c)。
四个方法分别是加减乘除,内部实现很简单,我们示例除法的,其他类似:
# include "./my_math.h"
# include<stdio.h>
# include<stdlib.h>
double my_div(int a,int b)
{
if(b==0)
{
printf("b==0 error\n");
exit(0);
}
return (a*1.0)/b;
}
头文件里面我们声明这四个方法:
#ifndef ___MYMATH_H//防止头文件重复包含
#define __MYMATH_H
int my_add(int