Linux makefile的基本使用
Posted 流楚丶格念
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux makefile的基本使用相关的知识,希望对你有一定的参考价值。
文章目录
gcc 输出文件类型
gcc 是用来编译代码的编译器
编译完后有一些常见的输出文件,他们是:
后缀名 | 含义 |
---|---|
.a | 静态库(文档) |
.c | 需要预处理的C语言源代码 |
.h | C语言源代码的头文件 |
.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的基本使用的主要内容,如果未能解决你的问题,请参考以下文章