C语言编程之 Makefile.doc





《C语言编程之 Makefile.doc》由会员分享,可在线阅读,更多相关《C语言编程之 Makefile.doc(10页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Makefile在Unix上写程式的人大概都碰过Makefile,尤其是用C来开发程式的 人。用make来开发和编译程式的确很方便,可是要写出一个Makefile 就不简单了。偏偏介绍Makefile的文件不多,GNUMake那份印出来要几 百页的文件,光看完Overview就快阵亡了,难怪许多人闻Unix色变。 本文将介绍如何利用GNUAutoconf及Automake这两套软体来协助我们 自动产生Makefile档,并且让开发出来的软体可以像Apache, MySQL和常见的GNU软体一样,只要会./configure,make, makeinstall就可以把程式安装到系统中。如果您有心
2、开发Open Source的软体,或只是想在Unix系统下写写程式。希望这份介绍文件能 帮助您轻松地进入UnixProgramming的殿堂。 1.简介 Makefile基本上就是目标(target),关连(dependencies)和 动作三者所组成的一连串规则。而make就会根据Makefile的规则 来决定如何编译(compile)和连结(link)程式。实际上,make可做的 不只是编译和连结程式,例如FreeBSD的portcollection中, Makefile还可以做到自动下载原始程式套件,解压缩(extract),修补 (patch),设定,然後编译,安装至系统中。 Make
3、file基本构造虽然简单,但是妥善运用这些规则就也可以变出许多不 同的花招。却也因此,许多刚开始学习写Makefile时会感到没有规范可 循,每个人写出来的Makefile长得都不太一样,不知道从何下手,而且 常常会受限於自己的开发环境,只要环境变数不同或路径改一下,可能 Makefile就得跟着修改。虽然有GNUMakefileConventions(GNU Makefile惯例)订出一些使用GNU程式设计时撰写Makefile的一些标 准和规范,但是内容很长而且很复杂,并且经常做些调整,为了减轻程式 设计师维护Makefile的负担,因此有了Automake。 程式设计师只需写一些预先定义
4、好的巨集(macro),交给Automake处理 後会产生一个可供Autoconf使用的Makefile.in档。再配合利用 Autoconf产生的自动设定档configure即可产生一份符合GNUMakefile 惯例的Makeifle了。 2.上路之前 在开始试着用Automake之前,请先确认你的系统已经安装以下的软体: 1.GNUAutomake 2.GNUAutoconf 3.GNUm4 4.perl 5.GNULibtool(如果你需要产生sharedlibrary) 我会建议你最好也使用GNUC/C+编译器、GNUMake以及其它GNU的 工具程式来做为开发的环境,这些工具都是属
5、於OpenSourceSoftware 不仅免费而且功能强大。如果你是使用RedHatLinux可以找到所有上述 软体的rpm档,FreeBSD也有现成的package可以直接安装,或着你也 可以自行下载这些软体的原始档回来DIY。以下的范例是在RedHat Linux5.2+CLE2的环境下所完成的。 3.一个简单的例子 Automake所产生的Makefile除了可以做到程式的编译和连结,也已经把 如何产生程式文件(如manualpage,info档及dvi档)的动作,还有 把原始程式包装起来以供散的动作都考虑进去了,所以原始程式所存放 的目录架构最好符合GNU的标准惯例,接下来我拿hel
6、lo.c来做为例 子。 在工作目录下建立一个新的子目录devel,再在devel下建立一个 hello的子目录,这个目录将作为我们存放hello这个程式及其相关 档案的地方: %mkdirdevel %cddevel %mkdirhello %cdhello 用编辑器写个hello.c档, #include intmain(intargc,char*argv) printf(Hello,GNU!n); return0; 接下来就要用Autoconf及Automake来帮我们产生Makefile档了, 1.用autoscan产生一个configure.in的雏型,执行autoscan後会产 生一
7、个configure.scan的档案,我们可以用它做为configure.in 档的蓝本。 %autoscan %ls configure.scanhello.c 2.编辑configure.scan档,如下所示,并且把它的档名改成 configure.in dnlProcessthisfilewithautoconftoproduceacon figurescript. AC_INIT(hello.c) AM_INIT_AUTOMAKE(hello,1.0) dnlChecksforprograms. AC_PROG_CC dnlChecksforlibraries. dnlChecksfo
8、rheaderfiles. dnlChecksfortypedefs,structures,andcompilerch aracteristics. dnlChecksforlibraryfunctions. AC_OUTPUT(Makefile) 3.执行aclocal和autoconf,分别会产生aclocal.m4及configure两个档案 %aclocal %autoconf %ls aclocal.m4configureconfigure.inhello.c 4.编辑Makefile.am档,内容如下 AUTOMAKE_OPTIONS=foreign bin_PROGRAMS=he
9、llo hello_SOURCES=hello.c 5.执行automake-add-missing,Automake会根据Makefile.am档产生 一些档案,包含最重要的Makefile.in %automake-add-missing automake:configure.in:installing./install-sh automake:configure.in:installing./mkinstalldirs automake:configure.in:installing./missing 6.最後执行./configure, %./configure creatingcac
10、he./config.cache checkingforaBSDcompatibleinstall./usr/bin/in stall-c checkingwhetherbuildenvironmentissane.yes checkingwhethermakesets$MAKE.yes checkingforworkingaclocal.found checkingforworkingautoconf.found checkingforworkingautomake.found checkingforworkingautoheader.found checkingforworkingmake
11、info.found checkingforgcc.gcc checkingwhethertheCcompiler(gcc)works.yes checkingwhethertheCcompiler(gcc)isacross-co mpiler.no checkingwhetherweareusingGNUC.yes checkingwhethergccaccepts-g.yes updatingcache./config.cache creating./config.status creatingMakefile 现在你的目录下已经产生了一个Makefile档,下个make指令就可 以开始编
12、译hello.c成执行档,执行./hello和GNU打声招呼吧! %make gcc-DPACKAGE=hello-DVERSION=1.0-I.-I.-g-O2-che llo.c gcc-g-O2-ohellohello.o %./hello Hello!GNU! 你还可以试试makeclean,makeinstall,makedist看看 会有什麽结果。你也可以把产生出来的Makefile秀给你的老板,让他从 此对你刮目相看:-) 4.一探究竟 上述产生Makefile的过程和以往自行编写的方式非常不一样,舍弃传统 自行定义make的规则,使用Automake只需用到一些已经定义好的巨集
13、 即可。我们把巨集及目标(target)写在Makefile.am档内,Automake 读入Makefile.am档後会把这一串已经定义好的巨集展开并且产生对应的 Makefile.in档,然後再由configure这个shellscript根据 Makefile.in产生适合的Makefile。 Figure1:利用autoconf及automake产生Makefile的流程 上图中表示在上一节范例中所要用的档案以及产生出来的档案,有星号 (*)者代表可执行档。在此范例中可藉由Autoconf及Automake工具所 产生的档案有configure.scan、aclocal.m4、conf
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C语言编程之 Makefile 语言 编程

限制150内