参考链接: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