makefile
makefile文件定义了一系列的规则,makefile带来的好处就是"自动化编译",一旦写好,只需要make命令,整个工程即可完成自动编译;
基本规则
makefile基本规则如下:
目标:依赖
(tab) 命令
tab必须是tab键,否则报错
- 目标:要生成的目标文件
- 依赖:目标文件由哪些文件生成
- 命令:gcc命令
第一个makefile
;makefile
main: main.c fun1.c
gcc -o main main.c fun1.c
//fun1.c
#include <stdio.h>
int fun1(int argc,char* args[])
{
int i = 0;
for(;i < 10;i++)
{
printf("%d\n",i);
}
return 0;
}
//main.c
#include <stdio.h>
#include <stdlib.h>
#include "head.h"
int main(int argc,char* args[])
{
fun1();
return 0;
}
第二个makefile
main: main.o fun1.o
gcc -o main main.o fun1.o
main.o: main.c ;生成main.o的规则
gcc -c main.c -I ./
fun1.o: fun1.c
gcc -c fun1.c
变量
makefile使用变量类似于C语言中的宏定义,使用该变量相当于内容替换,使用变量可以使得makefile更加健壮;
普通变量
name=$fun1 ;自定义变量
CC=gcc ;编译器
CPPFLAGS:C ;预处理选项 -I
CFLAGS: ;编译器选项-Wall -g -c
LDFLAGS: ;连接器选项 -L -l
自动变量
- $@:标识规则中的目标
- $<:标识规则中的第一个条件
- $^:标识规则中的所有条件
第三个makefile
objfile=mainmain
CC=gcc
target=main
object=main.o fun1.o
CPPFLAGS=-I./
$(target): $(object)
$(CC) -o $@ $^
main.o: main.c
gcc -c $< $(CPPFLAGS)
fun1.o: fun1.c
gcc -c $<
模式规则
至少在规则的目标中需要包含’%‘标识一个或多个,在依赖条件中同样使用’%’,依赖条件中的’%'的取值取决于其目标;
第四个makefile
objfile=mainmain
CC=gcc
target=main
object=main.o fun1.o
CPPFLAGS=-I./
$(target): $(object)
$(CC) -o $@ $^
%.o:%.c
gcc -c $< $(CPPFLAGS)
makefile函数
wildcard- #查找指定目录下的指定的文件
src=$(wildcard *.c) #找到当前目录下所有后缀为.c的文件,赋值给src
patsubst- #配置替换
obj=$(patsubst %c,%o,$(src)) #把src变量里所有后缀为.c的文件替换为.o
第五个makefile
CC=gcc
target=main
CPPFLAGS=-I./
SRC=$(wildcard *.c)
objects=$(patsubst %.c,%.o,$(SRC))
$(target): $(objects)
$(CC) -o $@ $^
%.o:%.c
gcc -c $< $(CPPFLAGS)
makefile清理
第六个makefile
CC=gcc
target=main
CPPFLAGS=-I./
SRC=$(wildcard *.c)
objects=$(patsubst %.c,%.o,$(SRC))
$(target): $(objects)
$(CC) -o $@ $^
%.o:%.c
gcc -c $< $(CPPFLAGS)
.PHONY:clean
clean:
rm -f $(objects) $(target)
以后我们只需要修改target的名称,即可在任何文件中使用makefile