一、make工具简介
1、make 工具通过一个称为 makefile 的文件(类似脚本)来完成并自动维护编译工作,针对目标(可执行文件)进行依赖性检测(要生成该可执行文件之前要有哪些中间文件)并执行相关动作(编译等)的工具 。其中makefile中内容包含make所要进行的处理动作以及依赖关系。
2、使用make 的其他好处:如果仅修改了某几个源文件,则只重新编译这几个源文件;如果某个头文件被修改了,则重新编译所有包含该头文件的源文件。提高了开发效率并且减少了重复编译时间。
二、Makefile组成
1、makefile组成三要素:目标、依赖、命令
hello.o:hello.c hello.h
gcc -c hello.c
上述为makefile基本组成,可描述为:我们最终要生成hello.o文件(目标),但是需要依赖hello.c文件、hello.h文件,而去处理gcc -c hello.c这个命令。
注:
①makefile文件与源文件(.c .h)存放在同一目录下
②每个命令之前都要用tab键分隔
三、makefie文件编写方式
准备工作
main.c、hello.h、hello.c文件(此处仅展示main.c)
1、普通版
main:main.o hello.o
gcc main.o hello.o -o main
main.o:main.c hello.h
gcc -c main.c
hello.o:hello.c hello.h
gcc -c hello.c
clean:
rm -rf *.o main
①ls查看
② 使用make命令,生成.o文件和可执行文件
③./main 运行
注:
①gcc main.o hello.o -o main:编译出可执行文件main。-o表示指定的可执行文件名
②gcc -c main.c:编译出main.o文件,-c是只把给它的文件编译成目标文件
③make clean:删除掉所有.o以及可执行文件,当修改了某一个源文件使用该指令清除旧的文件。
2、变量版
OBJ=main.o hello.o
G = gcc
main:$(OBJ)
$(G) $(OBJ) -o main
main.o:main.c hello.h
$(G) -c main.c
hello.o:hello.c hello.h
$(G) -c hello.c
clean:
rm -rf *.o main
使用make后生成文件同同变量版
注:
变量的格式为:var = content,如果要引用这个变量,用$(var)。
缺点:每添加一个.c文件,就需要修改makefile文件
3、函数版
SRCS := $(wildcard *.c)
OBJS := $(patsubst %.c,%.o,$(SRCS))
G = gcc
TARGETS = main
$(TARGETS):$(OBJS)
$(G) $^ -o $@
%.o:%.c
$(G) -c $<
clean:
rm -f *.o $@
使用make后生成文件同变量版
注:
1、SRCS := $(wildcard *.c) 表示产生一个所有以.c为结尾的文件列表,然后存入变量SRCS里。
2、OBJS := $(patsubst %.c,%.o,$(SRCS))
把SRCS文件列表中所有.c文件变成.o文件,接着形成一个新的列表,存入OBJS变量。3、wildcard函数:当前目录下匹配模式的文件
4、patsubst函数:模式匹配替换
四、附录:
选项 | 说明 |
---|---|
-c | 编译生成目标文件 |
-o | 生成可执行文件 |
-g | 编译debug版本,生成调试信息 |
-O | 在编译时进行优化 |
-E | 运行C预编译器 |
-Wall | 输出所有警告信息 |
-shared | 生成共享目标文件(建立动态库) |
-static | 禁止使用共享连接 |
参考文档: