什么是makefile
makefile是一个文本文件,make是一个应用工具,在linux终端的命令行可以使用make命令来运行makefile文件,进行大量的编译等功能。
举个例子:现在有多个.c文件(file_1.c、file_2.c……),需要全部编译,生成一个名为main的可执行文件,在linux命令行可以通过如下语句执行
gcc -o main *.c //将所有后缀为.c的文件联合编译为名为"main"的可执行文件
注意,当.c文件数量过多,编译时间是相当长的,如果我们更改了其中某个.c文件,理想情况下是只需编译对应那个.c文件,但是执行上述命令,是会全部进行编译的。为了解决这个问题,引入了makefile。
如何创建makefile
在linux终端的命令行直接使用vim编辑器就可以写一个makefile文件,命名为makefile或者Makefile就行。如下所示:
vi Makefile
//或者
vi makefile
make 命令在执行时默认查找的文件名是 Makefile 或者 makefile(不区分大小写)。这是约定俗成的命名规则,大多数情况下,开发者都会遵循这一规范,将构建项目的规则文件命名为 Makefile。
如何编写makefile
直接看一个简单的例子
all_o = file_1.o file_2.o
main:$(all_o)
gcc -o main $(all_o)
*.o:*.c
gcc -c $<
clean:
rm *.o
让我们逐行分析
·all_o相当于定义的一个变量,取名不定,这里取名的意思是所有(all)的.o文件。
·main:$(allo)的含义是要生成一个main文件,前提是需要变量all_o的存在,这里也可以列出所有的.o文件,因为.o文件连接后就是可执行文件,如果像例子这样用了变量代替,那么就要用$()
·执行链接的命令,即.o链接为可执行文件的具体指令。
·.o文件一开始并不是存在的,要用.c文件来编译生成。
·使用指令将每个.c文件生成对应的.o文件,$<代表自动化变量。
·clean,命令行用make clean执行clean里面的内容,例子中rm *.o就是删除所有的.o文件。
注意:
定义变量是用的“=”不是“:”
自动化变量除了用"$<",还可以用"$^"等
当文件中也有名为clean的文件时,要用".PHONY"对clean进行声明
以上都是很基础的关于makefile的知识,后续可以学cmake。