欢迎来到天天文库
浏览记录
ID:8792577
大小:64.00 KB
页数:4页
时间:2018-04-07
《一个简单的makefile教程》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、写Makefile是一个非常便利的编译方法,由于以前习惯把所有的代码都集中在一个文件中,体现不出make的优势,当把源代码拆分成若干个源文件,Makefile就显得必要了。以下是一份简单的Makefile的教程,参考自ASimpleMakefileTutorial。正如原文所说,这份教程只是打算让初学者快速入门,写自己的makefile,来维护中小型的项目。一个简单的例子,用K&RC中4.5那个例子:主程序(main.c)、函数代码(getop.c,stack.c,getch.c)、头文件(calc.h)。一般的,我们会使用1gcc
2、-ocalcmain.cgetch.cgetop.cstack.c-I.来编译。-I.是指gcc在当前目录(.)下寻找include文件。如果不用makefile,在测试-修改-调试过程中,如果我们不想重敲那条编译指令的话,我们必须不停地在终端中按上下键来寻找最后的那条编译指令。不幸的是,这种编译方法有两个缺陷:1.当你把编译指令丢失或者换电脑的时候,这样效率会很低;2.当我们只修改了一个.c文件时,每一次都将必须重新编译所有的文件,这非常耗时,不划算。现在是切入主题的时候了最简单的makefile写法:Version112calc
3、:main.cgetch.cgetop.cstack.c gcc-ocalcmain.cgetch.cgetop.cstack.c-I.如果把这些语句写入一个叫Makefile或者makefile的文件,然后在终端中输入make,她将会按你在makefile中要求地编译。注意:第一行中并没有任何参数,只是在冒号(:)后列出编译中所需的文件,当第一行中的任何文件中更改时,make就知道calc需要重新编译了。现在我们已经解决了问题1,不用上下按箭头了,但是对于问题2依旧没有很好地解决。注意,非常重要:gcc前面必须有一个tab,
4、在任何指令之前都要有一个tab,不然make就会罢工的。让事情变得更有效率一点:Version212345CC=gccCFLAGS=-I. calc:main.cgetch.cgetop.cstack.c $(CC)-ocalcmain.cgetch.cgetop.cstack.c$(CFLAGS)现在我们新定义了两个常量CC和CFLAGS。这些是与make交流的特殊的常量,让make知道我们要怎么编译.c文件。CC是C编译器所使用的,CFLAGS是编译用的参数。make会先分别编译.c文件,然后生成可执行文件calc。这种形
5、式的makefile在小项目中非常有效,但是有一个遗憾:include文件的变动。如果我们修改了calc.h文件,make是不会重新编译.c文件的,事实上我们需要重新编译。为了解决这一问题,我们必须告诉make所有的.c文件依赖于.h文件。我们可以在makefile中增加一条规则:Version31CC=gcc23456789CFLAGS=-I.DEPS=calc.h %.o:%.c$(DEPS) $(CC)-c-o$@$<$(CFLAGS) calc:main.ogetch.ogetop.ostack.o $(CC)-
6、ocalcmain.ogetch.ogetop.ostack.o$(CFLAGS)首先宏定义DEPS,声明.c文件所依赖的.h文件。然后我们定义一条规则,为所有的.c文件生成一个.o文件。规则描述:.o文件依赖于.c文件和DEPS中声明的.h文件,为了产生.o文件,make需要使用CC中声明的编译器来编译.c文件。-c意味着产生object文件,-o$@意思是编译生成的文件用上面的%.o来命名,$<指依赖关系中的第一项(%.c)CFLAGS的定义和之前一样。最后为了简化,我们使用特殊的宏定义$@和$^,分别表示冒号(:)的左右两边。
7、为了让make中所有的规则更具通用性,在Version4中,我们把所有的include文件作为DEPS的一部分,所有的object文件作为OBJ的一部分:Version401020304050607080910CC=gccCFLAGS=-I.DEPS=calc.hOBJ=main.ogetch.ogetop.ostack.o %.o:%.c$(DEPS) $(CC)-c-o$@$<$(CFLAGS) calc:$(OBJ) $(CC)-o$@$^$(CFLAGS)如果我们想把.h文件放在include目录下,.c文件放在
8、src目录下以及一些本地的库放在lib目录下,同时我们想把.o文件整理一下,避免整个目录的凌乱。在Version5中,定义了include,lib的目录,并把object文件放到了src目录下的obj子目录,同时还包含了任何我们想要包
此文档下载收益归作者所有