本文有参考https://blog.csdn.net/wh_computers/article/details/97623394此篇博客。
目录
本问旨在从零学习Makefile编写。
引入Makefile文件是因为工程项目中有很多文件,并且它们相互依赖,一个一个编译会花很多时间,并且一旦某一文件发生修改后就需要重新编译,那么所有相关的文件都需要重新编译。Makefile文件是去判断哪个文件被修改了,然后会重新生成修改后的文件,而且只需要一个make命令,极大简化了编译过程。
一、make及其用法
Makefile文件是一类工程管理工具的工程描述符文件的默认名称,名称不一定是Makefile,也可以是makefile或GNUmakefile。
make命令会在执行路径中搜索Makefile文件,如果同时存在以上三个文件,执行顺序是GNUmakefile > makefile > Makefile,如果选择执行一个,其他的就不会再执行了。
如果想执行某个文件,只需要make -f 文件名就可以指定执行文件,-f也可以用–file=FILE或–makefile=FILE。
make命令详细参数通过make -h 或者 make --helo来获取。
二、Makefile文件编写规则
首先给出测试代码,测试代码有两个C文件构成,a.p和b.c,其中a.c包含主函数且调用b.c的函数,b.c为加法函数add(int a,int b)。
a.c
#include <stdio.h>
#include "b.c"
int main()
{
int a=1;
int b=2;
printf("%d\n",add(a,b));
return 0;
}
b.c
#include <stdio.h>
int add(int a,int b)
{
return a+b;
}
Makefile的核心——规则:
目标 : 依赖1 依赖2 ...
[TAB]命令
Makefile基础版本:
all: test #最后的可执行程序test,无论书写顺序是怎样,最后是生成test
test: a.o #test是结果,a.o是来源
#命令必须开头是tab键 -o后面生成目标
gcc -o test a.o
a.o: a.c #a.o是结果,a.c是来源
#-c表示只编译不链接,生成.o文件
gcc -c -o a.o a.c
在命令行中输入 make 指令:
Leo@Embed_Learn:~/makefile$ make
gcc -o test a.o
Leo@Embed_Learn:~/makefile$ ls
a.c a.o b.c Makefile test
Leo@Embed_Learn:~/makefile$ ./test
3
Makefile进阶版本
问题引入,如果某个文件被多次引用,但是现在需要修改文件名,那么一个一个修改就会很麻烦,所以Makefile文件中允许定义变量,然后后面只需要修改变量的值就可以了,原理就是Makefile文件会展开变量,类似于宏定义。
变量定义类型规则:变量名 = 命令,使用变量是通过$(变量名)
Bin = test # 定义变量名Bin
all: $(Bin) # 生成可执行文件test
test: a.o
gcc -o $(Bin) a.o
a.o: a.c
gcc -c a.c -o a.o
clean: # clean需要使用命令make clean才会执行
rm -f *.o $(Bin) # 删除生成的.o文件和可执行文件
如果要修改文件名,只需要修改test就行了。
一般如果再次make会提示make无需做任何事,但是需要重新生成的话需要把原来的.o可执行文件删除,所以定义一个clean,俗称假目标。
Makefile终极版
如果有很多个.o文件需要引用,每次写就会感到很烦,Makefile提出了自动便令的概念,需注意的是自动变量只能用在命令里面。
下面给出常用的六个自动变量:
变量名 | 作用 |
---|