Makefile:
作用:记录项目构建规则流程的文本文件。
先在Makefile中写下项目的构建
\t 是指 Tab键。
格式如下图:
声明伪对象: 不管对象是否是最新的,每次都能重新生成。
格式: .PHONY : 对象名
如果不声明伪对象一旦出现和项目名相同的流程执行就会出错。
make
作用:
Makefile的解释器,逐行解释执行项目构建规则,完成项目的构建。从当前所在的目录找到Makefile,在Makefile中找到第一个目标对象后 执行命令;完毕后,make退出。
若是发现依赖对象也需要生成的话,则会向下查找依赖对象的生成规则,不断的向下递归生成。
具体如下:
执行后生成的文件如下:
也可以用%来代替文件名:
变量替换法
以下是三个文件
头文件 demo.h
#ifndef _DEMO_H
#define _DEMO_H
#include<stdio.h>
void CarryOut();
#endif
执行文件 fun.c
#include"demo.h"
void CarryOut()
{
printf("hello world\n");
}
主函数 main.c
#include"demo.h"
int main(int argc, char *argv[])
{
CarryOut();
return 0;
}
可以看出main的执行依赖于执行文件fun.c,就可以这样写
CC = gcc //这里用 CC 来代替 gcc, 使用的时候 $(CC) == gcc 了
//操作符也能用被代替 FLAGS = -o $(CC) $(FLAGS) == gcc -o
OBJS = main.o fun.o
BIN = main
$(BIN):$(OBJS)
$(CC) $^ -o $@
%.o:%.c
$(CC) -c $^ -o $@
.PHONY:clean
clean:
rm -rf *.o $(BIN)
运行结果
makefile 生成多个可执行文件
因为 makefile 的特性,导致 makefile 原则上只能生成一个可执行文件,所以需要使用 all 来帮助。使用 all 可以构造一个没有规则的终极目标all,并以这两个可执行文件作为依赖。
比如生成两个可执行文件 tss、css
all : tss css
cc = gcc
objs1 = tss.o
objs2 = mss.o
bin1 = tss
bin = mss
$(bin1):$(objs1)
$(cc) $^ -o $@
$(bin2):$(objs2)
$(cc) $^ -o $@
$(objs1):%.o:%.c
$(cc) -c $^ -o $@
$(objs2):%.o:%.c
$(cc) -c $^ -o $@
.PHONY:clean
clean:
rm -rf *.o $(bin1) $(bin2)