Makefile
定义
- Linux下用于编译大型C或C++工程时要用到的脚本语言
引子
- 目前在Windows下编译大型工程,一般是在集成开发环境(IDE)下进行,如VC6.0,VS2008~2017,Dev,cfree等等,只需要点击编译按钮,即可生成最终的exe或dll文件,中间过程都隐藏了。
- linux下用gcc编译C、C++工程, 可展示从源文件到最终的执行文件的整个微观过程。
linux下编程常用的工具及方式
- 虚拟机————安装Ubuntu操作系统
- SourceCRT————在windows系统下安装,配制虚拟机网关。控制linux的终端
- FileZila————远程上传工具,在windows和Linux之间传输文件
这种方式可以在windows下编写源代码文件,然后上传到linux下,进行编译并执行
源文件编译过程
预编译
- linux命令:gcc -E XXX.C -o XXX.i
- 将引用的头文件复制到源文件
- 展开宏定义
汇编
- Linux命令:gcc -S XXX.i -o XXX.S
- 生成汇编代码
编译
- Linux命令:gcc -c XXX.S -o XXX.o
- 生成二进制文件
链接
- LInux命令: gcc XXX.O -O XXX
- 链接相关联的.o文件,生成最终的可执行文件.elf
问题:当只有一个源文件的时候,以这种命令行的形式去编译,是可以接受的,但对于大型工程,有几十,几百个源文件时,这种方法明显不现实。于是就有了Makefile,它是一门类似于python,shell的脚本语言,为了改善linux下编译大型C、C++工程编译问题而产生的
Makefile语法
创建一个文本文件,重命名为Makefile,且不需要后缀。
显示规则
- 语法格式
目标文件:依赖文件
TAB+linux指令
- 第一个目标文件是终极目标
- 伪目标 .PHONY:
# 编译单个源文件
Hello : Hello.o
gcc Hello.o -o Hello
Hello.o : Hello.S
gcc -c Hello.S -o Hello.o
Hello.S : Hello.i
gcc -S Hello.i -o Hello.S
Hello.i : Hello.c
gcc -E Hello.c -o Hello.i
.PHONY:
#删除所有文件
clearAll:
rm -rf Hello.i Hello.S Hello.o Hello
#删除中间文件
clear:
rm -rf Hello.i Hello.S Hello.o
#编译多个源文件时
Test : cube.o circle.o main.o
gcc cube.o circle.o main.o -o Test
cube.o : cube.c
#简化预编译和汇编过程
gcc -c cube.c -o cube.o
circle.o : circle.c
#简化预编译和汇编过程
gcc -c cirle..c -o circle.o
main.o : main.c
gcc -c mian.c -o main.o
.PHONY:
#删除所有文件
clearAll:
rm -rf cube.o circle.o main.o Test
#删除中间文件
clear:
rm -rf cube.o circle.o main.o
- linux下执行的时候,切换到Makefile文件所在文件夹,在命令行输入make,就可以执行Makefile中除伪目标之外的其他目标
- 执行伪目标时,在命令行输入make 伪目标名,如make clearAll
变量
- = 替换
- += 追加
- := 常量
#编译多个源文件时
#将目标或指令中的TAR全部替换成Test,使用变量:$(变量名)
TAR = Test
Obj = cube.o circle.o main.o
#将常量CC等价于gcc指令,不可更改,使用常量:$(常量名)
CC := gcc
$(TAR) : $(Obj)
$(CC) $(Obj) -o $(tar)
cube.o : cube.c
#简化预编译和汇编过程
$(CC) -c cube.c -o cube.o
circle.o : circle.c
#简化预编译和汇编过程
$(CC) -c cirle..c -o circle.o
main.o : main.c
$(CC) -c mian.c -o main.o
.PHONY:
#删除所有文件
clearAll:
rm -rf $(Obj) $(TAR)
#删除中间文件
clear:
rm -rf $(Obj)
隐含规则
- %.c 表示任意的.c文件
- %。o 表示任意的.o文件
- *.c 表示所有的.c文件
- *.o 表示所有的.o文件