GNU-makefle (一) 基本介绍

来源:互联网 发布:mac百度搜索历史 编辑:程序博客网 时间:2024/06/08 08:40

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

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

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


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


关于程序的编译和链接(使用linux/unix下的gcc或cc):

编译生成目标文件(即中间代码文件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.occ -o edit main.o kbd.o command.o display.o \insert.o search.o files.o utils.o main.o : main.c defs.hcc -c main.c kbd.o : kbd.c defs.h command.hcc -c kbd.c command.o : command.c defs.h command.hcc -c command.c display.o : display.c defs.h buffer.hcc -c display.c insert.o : insert.c defs.h buffer.hcc -c insert.c search.o : search.c defs.h buffer.hcc -c search.c utils.o : utils.c defs.hcc -c utils.c files.o : files.c defs.h buffer.h command.hcc -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


使用变量

下面定义了一个变量名objs

objs = main.o kbd.o command.o display.o \insert.o search.o files.o utils.oedit : $(objs)cc -o edit $(objs) main.o : main.c defs.hcc -c main.c kbd.o : kbd.c defs.h command.hcc -c kbd.c command.o : command.c defs.h command.hcc -c command.c display.o : display.c defs.h buffer.hcc -c display.c insert.o : insert.c defs.h buffer.hcc -c insert.c search.o : search.c defs.h buffer.hcc -c search.c utils.o : utils.c defs.hcc -c utils.c files.o : files.c defs.h buffer.h command.hcc -c files.c clean :rm edit $(objs)

make会自动识别,并自动推导命令。如某.o,识别出同名的.c; 可以省略.c的依赖

如果本身就有一个clean的文件了,再make后,这个伪目标make clean就无法执行了,需要用.PHONY定义

-短横杠,表示忽略后面命令的执行错误情况

objs = main.o kbd.o command.o display.o \insert.o search.o files.o utils.oedit : $(objs)cc -o edit $(objs) main.o :  defs.h kbd.o :  defs.h command.h command.o :  defs.h command.h display.o :  defs.h buffer.h insert.o :  defs.h buffer.h search.o :  defs.h buffer.h utils.o :  defs.h files.o :  defs.h buffer.h command.h  .PHONY : clean clean :-rm edit $(objs)

一些同名的.h头文件,被很多.o所依赖。可以改成多个.o 依赖 一个.h

objs = main.o kbd.o command.o display.o \insert.o search.o files.o utils.oedit : $(objs)cc -o edit $(objs) $(objs) : defs.h main.o :  utils.o : kbd.o command.o files.o :  command.h display.o insert.o search.o files.o :   buffer.h  .PHONY : clean clean :-rm edit $(objs)


.o目标文件与.h头文件的依赖关系在源文件中已写明时,依赖关系中省略.h也可以

objs = main.o kbd.o command.o display.o \insert.o search.o files.o utils.oedit : $(objs)cc -o edit $(objs) main.o :    #这些没写依赖的后面的 冒号不能省略 kbd.o :  command.o :  display.o :  insert.o :  search.o :  utils.o :  files.o :  .PHONY : clean clean :-rm edit $(objs)


0 0
原创粉丝点击