#GNU的make步骤一般如下:
# 1、读入所有的makefile
# 2、读入被include的其他makefile
# 3、初始化所有的变量
# 4、推到隐藏规则,并分析所有规则
# 5、为所有目标文件创建依赖关系链
# 6、根据依赖关系。决定哪些目标要重新生成
# 7、执行生成命令
1、使用的基本文件,main.c 、tool.c、 tool.h这些文件都在同一个目录下
main.c
#include <stdio.h>
#include <stdlib.h>
#include "tool.h"
int main()
{
func();
return 0;
}
tool.h
#ifndef _TOOL_H__
#define _TOOL_H__
void func();
#endif
tool.c
#include <stdio.h>
#include <stdlib.h>
#include "tool.h"
void func()
{
printf("sdsfsdfsdfsd\n");
}
2、在相同的目录下创建名为Makefile文件
mm:main.o tool.o
cc -o mm main.o tool.o
main.o:main.c tool.h
cc -c main.c
tool.o:tool.c tool.h
cc -c tool.c
clean:
rm -rf *.o
3、基本Makefile 文件说明:
一种生成目标文件的命令
mm:main.o tool.o 目标:依赖项
cc -o mm main.o tool.o 命令、这个命令可以使shell命令或者其他命令
另外一种只执行命令,不生成目标文件
clean:命令,只执行命令,不生成目标文件
rm -rf *.o
4、生成目标文件的说明:
类似与俄罗斯套娃、或者递归的思维方式
上述Makefile要生成mm目标文件,就需要mm对应的依赖项main.o,tool.o。可是这两个依赖项并没有,所以这两个依赖项也需要在文件的某些位置当做目标项来生成。所以就有了下面main.o、tool.o的目标生成文件
5、一般规则:
最终目标: 目标依赖项
tab键开头 执行的shell命令
依赖目标: 依赖项
tab键开头 执行的shell命令
# 注释方式使用# ,命令的使用方式: make 命令。实际执行的是命令下面的命令
命令:
执行的shell命令
6、变量:
变量可以自定义,一般放置在文件的开头。
变量名自定义,
格式: 变量名=变量值
使用: ${变量名}
理解: 类似与将makefile文件中所有变量名指定的地方都替换为变量值,可以理解为宏的一种
7、隐藏规则:
一般目标.O文件的依赖项会包含相同名称的.C文件
实例:
#make命令寻找makefile命令的顺序为: GNUmakefile、makefile、Makefile
# 定义变量
objects = main.o tool.o
#include 会在当前位置引入外部的makefile文件
#include 1.mk 2.mk 3.mk *.mk
#注意,第一条规则将会被视为最终的生成目标,且只能有一个最终目标
#使用变量
mm : ${objects}
#命令必须是tab开头的才可以,否则会报错
cc -o mm ${objects}
#隐藏规则: 目标.o文件默认会依赖相同名称的.c文件,所以可以省略不写
main.o : tool.h
cc -c main.c
tool.o : tool.h
cc -c tool.c
#指明那些目标是伪目标,即执行命令的目标,并不生成目标文件
.PHONY : clean
clean :
rm -rf *.o mm