一个简单的makefile教程

一个简单的makefile教程

ID:8792577

大小:64.00 KB

页数:4页

时间:2018-04-07

一个简单的makefile教程_第1页
一个简单的makefile教程_第2页
一个简单的makefile教程_第3页
一个简单的makefile教程_第4页
资源描述:

《一个简单的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子目录,同时还包含了任何我们想要包

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。