首先要理解一下makefile是什么东西,有什么作用!官方的话就不说了,简单粗暴理解。makefile就是集成编译,比如说你写了好多个**.c**文件。平常就是一个一个gcc,就算你编译好了还要一个个运行不是太费事了嘛!所以makefile的存在就是“集成编译”一下子编译成一个文件。这样编辑运行起来不就简单太多了莫。废话不多说直接上代码,顺带说一下模块化编程:
我先建立一个makefile文件
vim makefile
任何创建方式都行只要创建的是文本文件就行。centos或者Ubuntu下的
gedit makefile
,deepin下的
dedit makefile
都是可以的。
接下来我们具体以例子说明。首先写一个最简单的C语言程序
#include <stdio.h>
void main()
{
printf("hello makefile\n");
}
经过gcc后生成了text可执行文件,下面我们给删除使用makefile来写。
我们来解释一下:text就是你要编译成的可执行文件,text然后**:**后面再跟一个空格 然后输入你的依赖文件。你是要编译hello.c文件,所以你的依赖文件就是hello.c。完整第一句就是
text: hello.c
然后换行,注意到换行后前面差不多有4个空格,那不是空格是按一下tap按键形成的,这里必须要按下tap按键。我用的是deepin系统,再vim中按下换行自动就形成了,如果在别的系统按下换行后还是首个格子一定要按下
tap
键然后就是写我们要执行的指令,
gcc hello.c -o text
意思就是编译hello.c文件并且生成文件名为text的可执行文件。然后保存退出。接着我们再终端下输入
make
运行makefile文件。
可以清楚看到再执行make后系统就运行了gcc hello.c -o text命令,./text后可以运行。
接下来我们看一下模块化编程如何使用makefile:
涉及到三个文件tool.c,tool.h,和main.c
我们先来看tool.c
main文件
可以看出find_max是一个比较大小的函数,传入数组和数,通过数组中的元素和传入的数比较大小,输出数组中最大的那个数。即直接再mian函数里面直接调用find_max函数,在tool.c文件里面写find_max函数。那么注意到find_max函数并没有声名,所以我们在tool.h文件里面声名
.c
文件都是函数部分,
.h
文件是函数的声名和一些参数的定义。
我们看一下tool.h文件
#ifndef _TOOL_H
#define _TOOL_H
#include <stdio.h>
int find_max(int arr[],int n);
#endif
在
.h
文件里:
#ifndef _TOOL_H
#define _TOOL_H
·
·
·
#endif
格式都是这样,注意图中化框的部分一般情况下_TOOL_H这是个参数,一般为_文件名_H这个格式,(其实写什么都行)模块化编程就是这个要求。
在tool.h文件里面我们对find_max函数进行了声名,以及头文件
#include <stdio.h>
的调用,这样我们在使用头文件时候只需要调用
#include "tool.h"
即可,注意这里面包含了find_max函数的声名,在调用这个函数的文件必须调用
#include "tool.h"
。
接下来我们看一下makefile的编写:
main: main.c tool.o
gcc main.c tool.o -o main
tool.o: tool.c
gcc -c tool.c
clean:
rm *.o main
main.c里面就是主函数,tool.c是写函数的文件,tool.h是写的函数的声名文件。
看第一行main: main.c tool.o,解释一下tool.o文件是tool.c文件编译成的中间文件。假设这个程序有多个函数,那么就会用多个.o文件,tool2.o tool3.c tool4.o、、、、、直接跟在后面即可。gcc就是对这些整体进行编译。
tool.o: tool.c
gcc -c tool.c
这一部分就是将tool.h编译成中间文件tool.o的过程,注意-c是参数。意思是编译成
.o
文件.
clean 这一部分是删除部分,意思是删除编译生成的可执行文件mian和所有
.o
文件。
我们看一下运行结果:
这就是这一部分的makefile最简单的基础,后续还会继续更makefile.欢迎指正交流。谢谢