作者:流浪者时空 | 来源:互联网 | 2023-09-10 12:57
文章目录一、为啥要编写makefile二、makefile的一些规则2.1基本格式2.2编写方式2.3一些规则三、makefile编写四、makefile其余用法一、为啥要编写ma
文章目录
- 一、为啥要编写makefile
- 二、makefile的一些规则
- 三、makefile编写
- 四、makefile其余用法
一、为啥要编写makefile
目的很简单,减少我们的工作量啊。
在linux环境下,我们可以编译一个程序,可以用 gcc xxxxx.c 就行,但是编译多个文件呢。当然也可以,比如 gcc xx1.c xxx2.c … xxx99.c 这样就很麻烦,而且容易漏掉 ,所以为了避免这种问题,我们就需要使用makefile。你可以把makefile理解为自动编译文件。
二、makefile的一些规则
2.1 基本格式
target:components
TAB conmand
.......
target:components
TAB conmand
.....
....
target:components
TAB conmand
第一行表示的是目标文件和依赖关系。第二行是命令。TAB就是一个TAB键。
你可能很迷糊,我现在也很迷糊,但是我们先记下来好伐。下面一一记录。
target:目标文件,可执行文件(如 clean)。
components:依赖文件,可以多个文件(.o 文件)。
command:命令(如 gcc)。
2.2 编写方式
我们来举个例子
假设我们现在有几个源文件,要求用一个makefile文件来编写。
源文件有:
mian.c
add.c add.h(add.c对应的头文件)
sub.c sub.h(sub.c对应的头文件)
通过倒叙方式来编写
main:main.o add.o sub.ogcc main.o add.o sub.o -o main
main.o:main.c add.h sub.hgcc -c main.c -o main.o
add.o:add.c add.hgcc -c add.c -o add.o
sub.o:sub.c sub.hgcc -c sub.c -o sub.o
clean:rm -f main main.o add.o sub.o
2.3一些规则
按照上面的例子做一个解释
目标文件需要依赖文件
目标文件(没有后缀);-o命令生成目标文件
依赖文件需要源文件
依赖文件(-o文件);-c命令生成-o文件
源文件(.c文件);
三、makefile编写
为了展示,所以我们这里简简单单的写一个例子
我们写一个简单的计算文件
首先写一个main函数
main.c
int main()
{printf("1 + 1 =%d\n",add(1,1));printf("9 - 3 =%d\n",sub(9,3));return 0;
}
在编写一个 add.c函数
#include "test.h"
int add(int i, int j)
{return i + j;
}
再编写一个 sub.c函数
#include "test.h"
int sub(int a, int b)
{return a - b;
}
最后编写一个 test,h的头文件
#include #ifndef _TEST_H #define _TEST_H int add(int i, int j); int sub(int a, int b); #endif
编写一个 makefile文件(不用后缀)
main:main.o add.o sub.ogcc main.o add.o sub.o -o main
main.o:main.c add.c sub.c gcc -c main.c -o main.o
add.o:add.c test.hgcc -c add.c -o add.o
sub.o:sub.c test.hgcc -c sub.c -o sub.o
clean:rm -f main main.o add.o sub.o
四、makefile其余用法
如果你没有更改过文件,再次make,他会提示你 你编译的执行文件已经是最新的
如果你更改过源文件,他就会重新make一次
这是通过系统自带的时间来判断你更改文件的时间是make之前还是make之后。
同理我们也可以通过这样来判断你的源文件是否被改过。
make clean:
上面的代码可以看出,make clean就是删除所有的依赖文件。这样我们就可以重新编译代码,既方便又快捷。
你也可以把 make clean 看成一个标准格式里面的东西,因为基本上的makefile文件都也有他。