Linux makefile的基本使用

Posted 流楚丶格念

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux makefile的基本使用相关的知识,希望对你有一定的参考价值。

gcc 输出文件类型

gcc 是用来编译代码的编译器

编译完后有一些常见的输出文件,他们是:

后缀名含义
.a静态库(文档)
.c需要预处理的C语言源代码
.hC语言源代码的头文件
.i经过预处理后的C语言源代码
.o目标文件(经过汇编产生)
.s经过编译后产生的汇编语言代码

makefile

一般来说,无论是C、C++、还是pas,首先要把源文件编译成中间代码文件,在Windows下也就是 .obj 文件,UNIX下是 .o 文件,即 Object File,这个动作叫做编译(compile)。然后再把大量的Object File合成执行文件,这个动作叫作链接(link)。

Linux的过程都是自己可以控制的,在gcc中可以通过将.c文件编译成.o文件

那么如果有多个.c文件呢,这些都要编译成.o文件,这样需要输入多条指令去执行吗?

答案是不用,我们可以通过 makefile,来批量处理

makefile好处

自动化编译

make命令,需要一个makefile文件

在makefile文件中去告诉make命令需要怎样去编译和连接程序

makefile是一个文本形式的数据库文件,包含一些规则来告诉make处理哪些文件以及如果处理这些文件

makefile规则

基本规则:

target:depend
	command

其中各个部分表示为:

  • target:目标,可以是一个中间文件,也可以是最终的执行文件
  • depend:依赖,指要生成目标文件所需要的文件或目标
  • command:make需要执行的命令

例如下面 Makefile

hello.i:hello.c
​	gcc -E -o hello.i hello.c

hello.i就是要生成的目标,hello.c是生成hello.i的依赖,gcc -E -o hello.i hello.c就是由 hello.c 生成 hello.i 的命令语句。

makefile执行顺序

默认执行第一条,在执行第一条时,先找所有的依赖文件,如果没有,继续往下找有没有脚本能生成这个依赖文件,如果有就会先执行下面生成依赖文件的语句。

例如下面Makefile语句:

test:prog.o code.o
​	gcc -o test prog.o code.o
prog.o:prog.c 
​	gcc -c prog.c -o prog.o
code.o:code.c 
​	gcc -c code.c -o code.o

clean:
​	rm -f *.o

prog.o是下个Makefile规则产生的,所以到第一个规则的时候,找不到依赖项,他会继续向下执行…

makefile变量

makefile中的变量理解可以为字符串。

makefile变量定义的三种形式

OBJ = a b c 表示 OBJ 就是 a b c 这三个,不能改变了
OBJ := a b c 表示 OBJ 是 a b c 但可以用 += 再去追加
OBJ += d 表示 OBJ 变量添加了 d 这一个

makefile变量引用

当要用到上面定义的变量时,可以使用下面语句。

$(变量名)

通配符:% * ?

通配符的使用还是很大众的,例如:

  • % 表示任意一个
  • *表示所有
  • 表示匹配一个未知的东西

例如下面语句,可以直接将所有 .o 编译成 .c

OBJ:=myadd.o mysub.o
OBJ+=project1.o

myproject:$(OBJ)
	gcc $(OBJ) -o myproject
*.o:*.c
	gcc -c *.c -o *.o
clean:
	rm -rf *.o myproject

makefile示例

OBJ:=myadd.o mysub.o
OBJ+=project1.o

myproject:$(OBJ)
	gcc $(OBJ) -o myproject
myadd.o:myadd.c
	gcc -c myadd.c -o myadd.o
mysub.o:mysub.c
	gcc -c mysub.c -o mysub.o
project1.o:project1.c
	gcc -c project1.c -o project1.o

clean:
	rm -rf $(OBJ) myproject

更详细的可以参考这个老哥整理的(有点长,我是没看下去,我基本会用到这程度就行了,不会再去学):https://blog.csdn.net/weixin_38391755/article/details/80380786/

以上是关于Linux makefile的基本使用的主要内容,如果未能解决你的问题,请参考以下文章

Linux系统-Makefile规则介绍基本使用

Makefile

Linux虚拟机下makefile的编写应用

如何在linux下写makefile

Linux内核 - Kernel地图:Kconfig与Makefile

Linux Makefile使用方法