NDK—Makefile 文件

Makefile

makefile 定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要重新编译,如何进行链接等操作。

makefile 就是“自动化编译”, 告诉make命令如何编译和链接。

 

make 命令会在当前目录寻找 makefile文件

 

makefile包含以下五个内容:

显示规则

隐晦规则

变量定义:类似于宏

文件指示:  引入其他makefile, 指定makefile有效部分, 定义多行命令

注释: # 注释

 

makefile 的规则

target: 目标文件,可以是 ObjectFile,也可以是执行文件,还可以是标签 lable

prerequisites:依赖文件,即生成 target 所需要的文件或其他 target

command:make 需要执行的命令

文件的依赖关系以及如何生成目标文件

 

makefile 示例

# 当前目录存在 main. c tool.c tool.h 三个文件

#以下是makefile文件内容

main: main.o tool.o

    gcc main.o tool.o -0 main (前面是tab键)

.PHONY: clean  

clean:

    -rm main *.o

// 执行 make 后输出如下

cc  -c -o main.o main.c

cc   -c  -o tool.o tool.c

gcc main.o tool.o -o main

// 并且生成一个可执行文件main

 

clean: 标签,不会生成 clean 文件,这样的target 称之为“伪目标”,伪目标的名字不能和文件名重复,clean一般放在文件最后

.PHONY: 显示的指明clean 是一个 “伪目标”

 

make file 是如何工作的:

默认方式下,输入make命令后:

make 会在当前目录下找名字为 “Makefile” 或 “makefile” 的文件。

如果找到,它会找文件第一个目标文件(target),并把这个target作为最终的目标文件,如前面示例中的main。

如果mian 文件不存在, 或main依赖的 .o 文件的修改时间要比main文件新,那么它会执行后面所定义的命令来生成main文件。

如果main所依赖的.o 文件也存在,那么make 会在当前文件中找目标为 .o文件的依赖性,若找到则根据规则生成.o文件。

make 再用 .o 文件声明make 的终极任务,也就是执行文件 “main”。

 

makefile中使用变量

objects = main.o tool.o

main: $(objects)

    gcc $(objects) -o main

.PHONY: clean

clean:

    -rm main $(objects)

为了makefile的易维护, 在makefile中我们可以使用变量。

makefile的变量也就是一个字符串,理解成C语音中的宏。

比如 我们声明一个变量,叫objects, 于是,我们就可以 方便的在makefile中以“$(objects)”的方式使用这个变量。

 

引用其他的makefile

#语法格式

include<filename>

# 举个例子,有这样几个Makefile a.mk b.mk c.mk 还有个文件叫 foo.make, 以及一各变量$(bar)

其中包含 e.mk 和 f.mk

include foo.make *.mk $(bar)

#等价于:

include foo.make a.mk b.mk c.mk e.mk f.mk

#如果文件找不到,而你希望make时不理会那些无法读取的文件而继续执行

#可以在include 前面加一个 减号 “-” 如:

-include <filename>

 

环境变量MAKEFILES

如果当前环境中定义了环境变量 MAKEFILES,那么 make 会把这个变量中的值做一个类似于include的工作。这个变量中的值是其他的makefile,用空格分割。只是,它和include不同的是,从这个环境中引入的 Makefile的“目标”不会起作用,如果环境变量中定义的文件发现错误,make也会不理。但是建议不要使用这个环境变量,因为只要这个变量一被定义,那么当你使用make时,所有的makefile都会受他影响。

也许有时候Makefile出现了奇怪的事,那么可以查看当前环境中是否定义这个变量。

 

Makefile预定义变量

makefile自动变量

 

makefile 函数

不带参数

define FUNC

$(info echo "hello")

endef

$(call FUNC)

 

----输出 hello

 

带参数

define FUNC1

$(info echo $(1) $(2))

endef

$(call FUNC1,hello,world)

----

输出:hello world

 

Make的工作流程

GNU的make工作时的执行步骤如下:

1.读入所有的Makefile

2.读入被include 的其他Makefile

3.初始化文件中的变量。

4.推导隐晦规则,并分析所有规则。

5.为所有的目标文件创建依赖关系链。

6.根据依赖关系,决定哪些目标要重新生成。

7.执行生成命令。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值