您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 其它行业文档 > Linux基础之make和makefile
GNUmake和makefile目录•一GNUmake概述•二Makefile的基本结构•三编写Makefile•四考核要求make的工作过程•现在来看一下make做的工作:•首先make按顺序读取makefile中的规则,然后检查该规则中的依赖文件与目标文件的时间戳哪个更新。•(1)如果目标文件的时问戳比依赖文件还早,就按规则中定义的命令更新目标文件。•(2)如果该规则中的依赖文件又是其他规则中的目标文件,那么依照规则链不断执行这个过程,直到Makefile文件的结束,至少可以找到一个不是规则生成的最终依赖文件,获得此文件的时间戳•(3)然后从下到上依照规则链执行目标文件的时间戳比此文件时间戳旧的规则,直到最顶层的规则•通过以上的分析过程,可以看到make的优点,因为.o目标文件依赖.c源文件,源码文件里一个简单改变都会造成那个文件被重新编译,并根据规则链依次由下到上执行编译过程,直到最终的可执行文件被重新连接。•例如,当改变一个头文件的时候,由于所有的依赖关系都在Makefile里,因此不再需要记住依赖此头文件的所有源码文件,make可以自动的重新编译所有那些因依赖这个头文件而改变了的源码文件,如果需要,再进行重新连接三编写Makefile•Makefile的基本结构不是很复杂,但当一个程序开发人员开始写Makefile时,经常会怀疑自己写的是否符合惯例,而且自己写的Makefile经常和自己的开发环境相关联,当系统环境变量或路径发生了变化后,Makefile可能还要跟着修改。这样就造成了手工书写Makefile的诸多问题,automake恰好能很好地帮助我们解决这些问题。•使用automake,程序开发人员只需要写一些简单的含有预定义宏的文件,由autoconf根据一个宏文件生成configure,由automake根据另一个宏文件生成Makefile.in,再使用configure依据Makefile.in来生成一个符合惯例的Makefile。下面我们将详细介绍Makefile的automake生成方法。编写Makefile实例•从helloworld入手•下面的过程简单的说就是:•新建三个文件:Helloworld.c;configure.in;Makefile.am•然后执行:aclocal;autoconf;automake--add-missing;./configure;make;./helloworld•就可以看到Makefile被产生出来,而且可以将helloworld.c编译通过。1、建目录•在你的工作目录下建一个helloworld目录,我们用它来存放helloworld程序及相关文件,如在/home/zgn下:$mkdirhelloword$cdhelloworld2、helloworld.c•然后用你自己最喜欢的编辑器写一个hellowrold.c文件,如命令:vihelloworld.c。使用下面的代码作为helloworld.c的内容。•intmain(intargc,char**argv)•{•printf(Hello,LinuxWorld!\n);•return0;•}•完成后保存退出。好了,现在在helloworld目录下就应该有一个你自己写的helloworld.c了。3、生成configure•我们使用autoscan命令来帮助我们根据目录下的源代码生成一个configure.in的模板文件。命令:•$autoscan•$ls•configure.scanhelloworld.c•执行后在hellowrold目录下会生成一个文件:configure.scan,我们可以拿它作为configure.in的蓝本。现在将configure.scan改名为configure.in,并且编辑它,按下面的内容修改,去掉无关的语句:•=========configure.in内容开始=====•#-*-Autoconf-*-#Processthisfilewithautoconftoproduceaconfigurescript.•AC_INIT(helloworld.c)•AM_INIT_AUTOMAKE(helloworld,1.0)•#Checksforprograms.•AC_PROG_CC•#Checksforlibraries.#Checksforheaderfiles.#Checksfortypedefs,structures,andcompilercharacteristics.#Checksforlibraryfunctions.•AC_OUTPUT(Makefile)•==========configure.in内容结束===========•然后执行命令aclocal和autoconf,分别会产生aclocal.m4及configure两个文件:•$aclocal•$ls•aclocal.m4configure.inhelloworld.c•$autoconf•$ls•aclocal.m4autom4te.cacheconfigureconfigure.inhelloworld.c•大家可以看到configure.in内容是一些宏定义,这些宏经autoconf处理后会变成检查系统特性、环境变量、软件必须的参数的shell脚本。•autoconf是用来生成自动配置软件源代码脚本(configure)的工具。configure脚本能独立于autoconf运行,且在运行的过程中,不需要用户的干预。•要生成configure文件,你必须告诉autoconf如何找到你所用的宏。方式是使用aclocal程序来生成你的aclocal.m4。•aclocal根据configure.in文件的内容,自动生成aclocal.m4文件。aclocal是一个perl脚本程序,它的定义是:“aclocal-createaclocal.m4byscanningconfigure.ac”。autoconf从configure.in这个列举编译软件时所需要各种参数的模板文件中创建configure。•autoconf需要GNUm4宏处理器来处理aclocal.m4,生成configure脚本。m4是一个宏处理器。将输入拷贝到输出,同时将宏展开。宏可以是内嵌的,也可以是用户定义的。除了可以展开宏,m4还有一些内建的函数,用来引用文件,执行命令,整数运算,文本操作,循环等。m4既可以作为编译器的前端,也可以单独作为一个宏处理器4、新建Makefile.am•新建Makefile.am文件,命令:•$viMakefile.am内容如下:AUTOMAKE_OPTIONS=foreignbin_PROGRAMS=helloworldhelloworld_SOURCES=helloworld.c•automake会根据你写的Makefile.am来自动生成Makefile.in。•Makefile.am中定义的宏和目标,会指导automake生成指定的代码。例如,宏bin_PROGRAMS将导致编译和连接的目标被生成5、运行automake•命令:•$automake--add-missing•configure.in:installing`./install-sh'configure.in:installing`./mkinstalldirs'configure.in:installing`./missing'Makefile.am:installing`./depcomp'•automake会根据Makefile.am文件产生一些文件,包含最重要的Makefile.in。6、执行configure生成Makefile•$./configure•$ls-l•Makefile-rw-rw-r--1rootroot15035Oct1510:40Makefile•可以看到,此时Makefile已经产生出来了。7、使用Makefile编译代码•$make•运行helloworld•$./helloworld•Hello,LinuxWorld!•这样helloworld就编译出来了,你如果按上面的步骤来做的话,会很容易地编译出正确的helloworld文件。你还可以试着使用一些其他的make命令,如makeclean,makeinstall,makedist,看看它们会给你什么样的效果。•自己能写出这么专业的Makefile,老板一定会对你刮目相看。考核要求•一掌握Makefile文件的基本结构•二掌握使用autoconf和automake生成Makefile文件的方法•三使用给定程序(目录src下)分析和使用makefile文件
本文标题:Linux基础之make和makefile
链接地址:https://www.777doc.com/doc-3356317 .html