make的使用及Makefile万能模板
- 前言
- 为什么用make
- make的使用
- Makefile万能模板
前言
gcc 的编译,是将源码生成可执行程序。
例如:
gcc hello.c -o hello
源码到可执行程序需要四步处理
硬件——》机器语言——》汇编语言——》 高级语言
1)预处理
处理与#号相关的代码(展开头文件,删除无用定义,替换宏定义)
gcc -E xxx.c -o xxx.i
2)编译
检查语法错误;
如果语法有误则报错,如果语法没错则编译成汇编语言
gcc -S xxx.i -o xxx.s
3)汇编
将汇编语言解析成二进制文件(并非纯粹的二进制文件)
gcc -c xxx.s -o xxx.o
4)链接
将目标文件链接库文件生成机器能够识别的二进制文件
gcc xxx.o -o xxx
为什么用make
make工具工程管理器,顾名思义,是指管理较多的文件,Make工程管理器也就是个“自动编译管理器”,这里的“自动”是指它能构根据文件时间戳自动发现更新过的文件而减少编译的工作量,同时,它通过读入Makefile文件文件的内容来执行大量的编译工作。
当项目中包含多个c文件,但只对其中1个文件进行了修改,那用gcc编译会将所有的文件从头编译一遍,这样效率会非常低;所以通过make工具,可以查找到修改过的文件(根据文件时间戳),只对修改过的文件进行编译,这样大大减少了编译时间,提高编译效率。
make的使用
首先要分文件
第一步: main.c ——》main
第二步: xxxx.c——》多个.c(不同功能函数接口)
第三步: 编写.h头文件
头文件包含:
1.包含其他头文件
2.函数声明
3.构造数据类型
4.宏定义
5.重定义名
6.全局变量
第四步: 引用头文件
系统定义头文件:
#include <stdio.h>
自定义头文件:
#include “func.h”
第五步:Makefile的编写
格式:
目标:依赖
<tab> 命令
fun:func.o main.o
gcc func.o main.o -o fun
func.o:func.c
gcc -c func.c -o func.o
Makefile万能模板
CC=gcc //编译方法gcc
OBJS= main.o __.o __.o //__填写目标文件文件名
CFLAGS=-c -g -O //编译器的选项
main:$(OBJS) //目标文件(main):依赖(所有的OBJS)
$(CC) $(OBJS) -o $@ //gcc 所有的OBJS -o 目标文件的完整名称
$(OBJS):%.o:%.c //目标文件(所有的OBJS):依赖(.o 的.c 文件)
$(CC) $(CFLAGS) $^ -o $@ //gcc 编译 所有不重复的目标依赖文件 -o 目标文件的完整名称
.PHONY:clean
clean:
rm *.o //删除所有.o文件
$:表示取值
1、预定义变量
CC 默认值为cc,与gcc同
RM 默认值为rm -f
CFLAGS 无默认值,一般为c编译器的选项
OBJS 一般为目标文件xx.o
2、自动变量:
$< 第一个依赖文件的名称
$@ 目标文件的完整名称
$^ 所有不重复的目标依赖文件,以空格分开
3、.PHONY:clean——》.PHONY
声明一个伪命令。若之前的目标中有生成可知执行文件名为clean。执行“make clean”时,make会认为clean目标已实现。不执行clean目标对应的指令,用.PHONY声明后,make认为clean是一个指令,“make clean”时会执行clean指令对应的命令。