ubuntu学习--make工具

来源:互联网 发布:金钥匙注音软件 编辑:程序博客网 时间:2024/05/29 07:32

    无论是在Linux还是在UNIX环境中,make都是一个非常重要的编译工具。无论是自己进行项目开发还是安装应用软件,都需要使用make工具。利用make工具,可以将大型的开发项目分解成为多个更易于管理的模块,对于一个包括几百个源文件的应用程序而言,使用make工具和makefile文件就可以清晰地理顺各个源文件之间的关系。而且如此多的源文件,如果每次都要输入gcc命令进行编译的话,对程序员来说是很难忍受的。make工具可以自动完成编译工作,并且只对程序员在上次编译后修改过的部分进行编译。因此,有效地利用make工具可以大大提高项目开发的效率。

  make工作原理:   

     一般来说,最简单的就是直接在命令行下输入make命令,make命令会找当前目录的makefile来执行,一切都是自动的。

      make工具最基本的功能是调用makefile文件,通过makefile文件来描述源程序之间的相互依赖关系并自动维护编译工作。当然,makefile 文件需要按照某种语法进行编写,需要说明如何编译各个源文件并连接生成可执行文件,以及定义源文件之间的依赖关系。makefile 文件是许多编译器(包括Windows下的编译器)维护编译信息的常用方法,在集成开发环境中,用户可以通过友好的界面修改makefile 文件。

例如,在当前目标下有一个文件名为"makefile"的文件,其内容如下(此文件的语法结构将在接下来的内容中介绍):

#It is a example for describing makefile
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         //main.c依赖关系
cc -c main.c           //完成的编译操作
kbd.o : kbd.c defs.h command.h         //kdo.c依赖关系
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
files.o : files.c defs.h buffer.h command.h
cc -c files.c
utils.o : utils.c defs.h
cc -c utils.c
clean:    //make clean命令将执行的操作
rm edit main.o kbd.o command.o display.o insert.o search.o files.o utils.o

这个描述文档就是一个简单的makefile文件。在这个例子中,第一个字符为#的行为注释行。第一个非注释行指定edit由目标文件main.o、kbd.o、command.o、display.o、insert.o、search.o、files.o、utils.o连接生成,这只是说明一个依赖关系。第三行描述了如何从edit所依赖的文件建立可执行文件,即执行命令cc -o edit main.o kbd.o command.o display.o insert.o search.o files.o utils.o,即调用gcc编译以上.o文件生成edit可执行文件。后面偶数行分别指定各目标文件所依赖的.c和.h文件。而紧跟依赖关系奇数行则指定了如何从目标所依赖的文件建立目标。

在默认的方式下,在当前目录提示符下输入"make"命令,系统将自动完成以下操作:

(1)make工具会在当前目录下寻找名字为"Makefile"或"makefile"的文件,GNU Make 工具在当前工作目录中按照GNUmakefile、makefile、Makefile的顺序搜索makefile执行文件。

(2)如果找到,它会查找文件中的第一个目标文件,在上面的例子中,系统将查找到"edit"这个目标,并把这个文件作为最终的目标文件。

(3)如果edit文件不存在,或是edit所依赖的后面的.o 文件的修改时间要比edit文件晚,那么,系统就会执行后面所定义的命令来生成edit这个文件。

(4)如果edit所依赖的.o文件也不存在,那么make工具会在当前文件中查找目标为.o文件的依赖性,如果找到,则根据这一个规则生成.o文件。

(5)如果此文件中列出的*.C文件和*.H文件都存在,于是make工具会首先生成.o 文件,然后再用.o文件生成可执行文件edit。

这就是make文件的依赖性,make会一层一层地去找文件的依赖关系,直到最终编译出第一个目标文件。在查找的过程中,如果出现错误,比如最后被依赖的文件没有找到,make就会直接退出并报错。而对于所定义的命令的错误,make不会检查

通常,makefile文件中还定义有clean目标,这是一个伪目标(后续小节将详细介绍),可用来清除编译过程中生成的中间文件,例如清除上例中的内容:

clean :
rm edit main.o kbd.o command.o display.o insert.o search.o files.o utils.o
更为简单的方法为:

clean:
rm -f *.o
在上述makefile文件中,clean没有被第一个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动执行。不过,可以在命令中要求执行,即使用命令"make clean",以清除所有的目标文件,以便重新编译。

多核处理器下提高make的效率

Linux开源程序编译往往会需要较长时间,多核处理器的应用可以大大缩短编译所需要的时间。

默认情况下,make并没有将多核处理器的性能发挥到极限。相反,它只使用了其中一个核心。

make的-j参数可以使make进行并行编译。make该参数的帮助如下:

make -j [N], --jobs[=N]          Allow N jobs at once; infinite jobs with no arg.

意思是在同一时间可以进行并行编译的任务数。比如说如下命令:

make -j 2

则是告诉处理器同时处理两个编译任务。

而如果-j后不跟任何数字,则不限制处理器并行编译的任务数。

我的处理器为8核心CPU,我直接运行:

make -j

编译boost库的时间大大缩短。

注意:make -j命令并不是任何情况下都可以用的,在存在编译依赖的情况下,单核编译还是一种比较稳妥的方案。


以上内容主要来源于网站:

http://www.2cto.com/os/201203/122087.html

http://blog.csdn.net/wangjingfei/article/details/4969942

参考网站:

http://wiki.ubuntu.org.cn/%E8%B7%9F%E6%88%91%E4%B8%80%E8%B5%B7%E5%86%99Makefile:make%E8%BF%90%E8%A1%8C

0 0