makefile 一看就懂了

前言:没接触Linux下编译以前,以为很神秘,特别是makefile,一个简单的make命令就能编译一个大型项目生成一个可执行文件,接下来跟你们分享下学习的makefile的知识。shell

目录:函数

1.makefile简介工具

2.makefile规则学习

3.makefile隐晦规则ui

4.makefile伪目标文档

5.makefile变量get

6.makefile条件控制语句it

7.makefile文件引用编译

8.makefile函数编译原理

9.makefile注释,换行,-f

10.makefile动手实践

 

1.makefile简介

首先,咱们一般使用的make都是gnu make,也就是一种解析makefile的make工具,关于gnu和Linux还有一段鲜为人知的故事,你们能够本身查下。makefile就是一个文档,make工具经过解析这个文档,把一个个.c .cpp文件经过gcc/g++命令编译成.o(临时文件 Object file),再经过gcc/g++命令编译成一个二进制的可执行文件,也能够将.o文件连接成一个.a(静态连接库,Windows下为.lib)。

2.makefile规则

makefile接触最多的一个词就是目标,它能够是一个可执行文件,.o,伪目标。makefile编译就是把最终生成的可执行文件这个目标,依赖其余的目标,一层层依赖,最终依赖到.c,.cpp文件。另外,make编译的时候当发现目标所依赖的目标发生变化的时候,才会从新编译,节省了编译时间。makefile目标依赖以下,此处很关键:

target : prerequisites

    command

    ...

**提示:cmmand前面是一个tab 

示例:

main : main.o

    cc -o edit main.o

main.o : main.c main.h

    cc -c main.c

3.makefile隐晦规则

#原文件

main : main.o

    cc -o edit main.o

main.o : main.c main.h

    cc -c main.c

#变一下

main : main.o

    cc -o edit main.o

main.o : main.c main.h

#再变一下

main : main.o

    cc -o edit main.o

main.o : main.h

#隐晦规则:编译工具gcc会自动搜索main.o同目录的同名.c文件,即main.c,即自动推导。

固然还有不少其余的隐晦规则,就不一一列举。

4.makefile伪目标

常见伪目标all,clean..这些伪目标不会生成文件,主要是为了执行一些命令。

.PHONY : clean

clean :

    rm -f *.o

** .PHONY是为了不一种情形,当前目录下已存在名为clean的文件,在执行clean这个目标的时候,发现已存在clean文件,并clean什么也没有,make工具会认为此目标所依赖的目标没有发生更新,就不会从新编译这个目标,也就不会执行下面的rm命令。

5.makefile变量

makefile中的变量没有类型。一般用来定义一个目录或一些目标。

b = main.o head.o

a = $(b)

$(a)是对变量a的调用。

a := $(b)

:=是另外一种用法,区别是:=后面只能调用前面已经定义过的变量。避免产生循环调用。

6.makefile控制语句

if .../ifeq...

    ...

else

    ...

endif

 

foreach

...

7.makefile文件引用

#文件引用前面没有"#"

include "build.mk"

8.makefile函数

咱们可使用使用make提供的函数,也能够本身定义函数,也能够叫命令包。

define fun 

command

endef

调用函数:$(fun ...)

9.makefile注释,换行,-f

#此处注释,同shell注释#开头

    / 此处换行,也能够做为多行注释,因此此处也是注释,哈哈哈~

make命令执行默认会去执行当前目录下的makefile或者Makefile文件,或者能够用 -f、 --file 指定执行的makefile文件。make命令后面能够跟想要执行的目标,否则默认执行makefile开头的第一个目标。

make -f build.mk

10.makefile动手实践

说的再多不如动手实践,能力的得到%70来自实践。

赶忙动手写起来吧!

 

最后,makefile后面进阶,则须要多写makefile,想写出简洁可维护的makefile,仍是挺难的,也能够深刻了解下make工具的执行原理,以及gcc/g++的编译原理。推荐学习下大神陈皓的《跟我一块儿写 Makefile》。

相关文章
相关标签/搜索