首页 > 代码库 > GNU-makefle (一) 基本介绍

GNU-makefle (一) 基本介绍

参考链接:http://blog.csdn.net/haoel/article/details/2886

android ndk编译,和源码环境下的编译需要写一个mk文件,其实它就是makefile文件。

在linux(unix) 平台上,makefile(或Makefile)它就是一个构建的规则,描述了哪些文件需要先编译,哪些后编译,如何链接... make就是一个命令工具,它来解释makefile中的规则,执行并生成规则中的定义。


全篇以c / c++ 代码为例。


关于程序的编译和链接:

编译生成目标文件(即中间代码文件object file),然后链接这些目标文件到我们的应用程序,生成可执行文件

目标文件,win平台:.obj       unix平台:.o

一组目标文件可以打包生成一个 库文件,库文件分静态链接库和动态链接库。

静态库,表示在程序编译时用到的库。win:.lib    unix:.a

动态库,表示在程序运行时用到的库。win:.dll    unix:.so

    动态库,在程序运行时才载入,如果程序中或者系统中,没有,那么就加载;已有,则直接使用。

    它的好处是,方便共享。本着有需求才调入原则,大大节省了系统资源。


makefile文件的命名:maikefile 或 Makefile

一个例子,所有.c和.h 都在同一级目录中:

edit : main.o kbd.o command.o display.o 	insert.o search.o files.o utils.o
		cc -o edit main.o kbd.o command.o display.o 		insert.o search.o files.o utils.o
 main.o : main.c defs.h
			cc -c main.c
 kbd.o : kbd.c defs.h command.h
			cc -c kbd.c
 command.o : command.c defs.h command.h
			cc -c command.c
 display.o : display.c defs.h buffer.h
			cc -c display.c
 insert.o : insert.c defs.h buffer.h
			cc -c insert.c
 search.o : search.c defs.h buffer.h
		cc -c search.c
 utils.o : utils.c defs.h
		cc -c utils.c
 files.o : files.c defs.h buffer.h command.h
		cc -c files.c

 clean :
		rm edit main.o kbd.o command.o display.o 			insert.o search.o files.o utils.o

冒号 左边的是 目标定义, 右边是它所依赖的。  目标 : 依赖

反斜杠\为一段命令的换行符。

表示执行命令时,左边的缩进要用使用TAB键。  例子中的cc命令 左边全是tab缩进。其他情况的间隔 都是用 空格。

上例子从上到下表示:

文件edit 依赖 一些.o 目标文件

创建edit执行文件,  cc -o 连续链接一些 .o文件

(执行make命令后,找到makefile或Makefile文件,读取它的规则

当读取到第一个目标文件(在本例中即是 edit)时,会将其作为最终需要生成的执行文件对待。

若某个.o不存在,或者修改了这个.o目标文件所依赖的文件,那么就需要新生成或重生成该.o,make会自动判断的。

以全局来说:就是被依赖者发生变化(比如头文件、源文件),那么依赖它的也将变化,相应的每一层级的依赖者都将变化。

)

main.o 依赖 main.c 和 defs.h      即 main.c 中 include “defs.h”

编译生成.o目标文件的执行命令 cc -c main.c

最后clean,在首个目标edit中没有被直接或间接依赖,那么它将不会被自动执行。而可以使用 make clean 来执行它所定义的命令

 

最后shell 进入工程所在目录,执行make命令

生成一个可执行文件:edit



GNU-makefle (一) 基本介绍