Linux中make工具及makefile文件

一、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函数:模式匹配替换

四、附录:

gcc命令常用选项
选项说明
-c编译生成目标文件
-o生成可执行文件
-g编译debug版本,生成调试信息
-O在编译时进行优化
-E运行C预编译器
-Wall输出所有警告信息
-shared生成共享目标文件(建立动态库)
-static禁止使用共享连接

 参考文档:

linux下make以及makefile(一)_麒麒川的博客-CSDN博客_linux makefile

Linux编程工具-Makefile(一)_君莫笑的博客-CSDN博客


版权声明:本文为hml111666原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。