ImageVerifierCode 换一换
格式:DOCX , 页数:10 ,大小:137.57KB ,
资源ID:7880450      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/7880450.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(makefile 速成.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

makefile 速成.docx

1、makefile 速成分享一篇前短时间总结的makefile速成,教你一天搞定makefile,略加实践掌握其最核心部分。可以从下面的几个维度来学习和理解makefile: 规则 变量 函数 命令 make的命令选项 一个大型项目的makefile例子 make p的输出概览 在正式介绍makefile的以上四个方面之前,首先一句话概括一下makefile是什么:makefile是用来描述文件依赖关系,并告诉make命令如何根据这种依赖关系,调用shell完成目标文件建立的文件。makefile的执行时通过两步来完成的,第一步是扫描文件中的依赖关系,并藉此建立依赖关系树,然后从最底层想上来执行

2、。1. 规则(rule)Makefile从本质上说就是描述项目中文件依赖关系的文件。这种依赖关系的描述就是规则。Makefile的编写中的一切都是围绕规则来展开的,上面提到的四个方面:规则、变量、函数、命令都是为了规则能够方便快捷的发挥作用才引入的。一个简单规则可以表述为:目标文件:依赖文件(不同文件以空格分隔)得到目标文件需要的命令规则的常见种类有:Explicit Rule最简单的rule,明确指出了目标和依赖,以及如何有依赖得到目标。举例:Hello.o:hello.cppg+ -c hello.cppPattern Rule使用了wildcard(通配符)的规则。makefile中的通

3、配符是百分号%,相当于bash中的*,在描述规则的时候使用的都是%。makefile中也可以看到通配符*,这个一般是出现在命令之中,命令是要放到shell中运行的,所以要使用*作为通配符。举例:prog:*.c g+ -o prog $Suffix Rule 顾名思义,是只使用后缀来描述的rule,描述的时候不使用pattern,举例:.c.o: $(COMPILE.C) $(OUTPUT_OPTION) $这个suffix rule的作用和下面这个pattern rule的作用是完全一样的。区别仅在于描述依赖的时候,一个把目标放在后,一个把目标放在前面。%.o:%.c $(COMPILE.C

4、) $(OUTPUT_OPTION) $Implicit Rule就是看不到的rule,这些rule是make的内置rule。makefile有众多的build-in rule,这些规则为我们编写makefile带来了很大的便利。它们可以通过make p 来查看(在“# Implicit Rules “部分)。另外内置的规则里面还有大量的后缀规则,由于这些后缀规则在makefile中也不能直接看到,所以也可以叫做implicit rule。上面说的rule目标文件都是实实在在的文件,还有一种目标,它不代表文件,叫做phony target(伪目标)。伪目标总是未更新的。最常用的就是clean这

5、个phony target,他声明为:.PHONY: cleanclean: ls;who;rm *.cpp 伪目标可以帮用来帮我们测试我们的makefile,当我们想测试一段Makefile是不是正确的时候,可以把要执行的命令放到伪目标(比如伪目标test)的下面,然后执行make test就可以查看执行结果了。2. 变量自动变量刚刚在介绍规则的时候用到了$,这东西是什么呢?他是makefile中的automatic variable。这中变量是Makefile特有的变量,他是在股则的命令中自动得到的,不同规则中执行命令时使用相同的自动变量得到的结果不同,正是因为这个原因,所以叫做自动变量。

6、下面列出最常用的自动变量:$ 规则的目标$% 档案文件成员(archive member)结构中的文件名元素$ 第一个依赖文件名$ 所有的依赖文件名(已经消重),以空格分隔$+ 所有的依赖文件名(未经消重),以空格分隔$* 所有除掉后缀的依赖文件名,以空格分隔,仅适用于模式规则。注:文件名包含stem和suffix,去掉suffix就剩下了stem。比如hello.cpp的stem是hello,suffix就是cpp。$? 比目标文件新的依赖文件。vpath和VPATH变量 vpath用来告诉make命令到什么地方去寻找文件。如: VPATH:src 也可以用下面的形式,告诉make命令到指定

7、的文件去查找对应类型的文件:vpath %.h $(include_dirs)vpath %.a $(lib_dir) $(extra_lib_dirs)变量基本知识和bash中变量赋值的情况不同,makefile里面的变量使用是$()方式的。虽然使用$也可以,但这种方式并不常见。在使用$()来引用变量时,如果变量的长度为1,则可以省略括号,否则不能。如$arg,在makefile中$arg并没有被识别为一个变量,而是变量$a和字母rg。上面说到的自动变量$ $都是这种情况。另外,要特别注意的是makefile中使用的变量和bash中的变量不是一个体系,bash中的变量不能在makefile中

8、使用。且makefile有自己的内置变量。如CURDIR,代表当前的目录,SHELL,代表用来执行命令使用的shell。这些变量可以再make p 的# Variables中找到,表示为: # default。变量的展开和赋值makefile中的=并不立即赋值而是要延迟到是使用变量的时候。对于下面的makefile,运行make 5.o, 结果是:而,如果写成下面的形式: 结果就变成:除了上面的两个赋值符号,还有两种符号是:?= 在变量不存在的情况下进行赋值。咽喉扩展+= append operator,作用和C语言中相同。如果左边部分已经被定义则进行“立即扩展”,否则延后扩展C/C+编译过程

9、中用到的内置变量(make p可以看到):宏变量适合用来存储单行形式的值,可是对于多行形式的值,例如命令脚本,如果我们想在不同的地方执行它,该怎办?方法就是使用宏。宏是封装的命令序列。他可以内置换行符。用下面的方式定义宏:define create-jarecho Creating $.$(RM) $(TMP_JAR_DIR)$(MKDIR) $(TMP_JAR_DIR)$(CP) -r $ $(TMP_JAR_DIR)cd $(TMP_JAR_DIR) & $(JAR) $(JARFLAGS) $ .$(JAR) -ufm $ $(MANIFEST)$(RM) $(TMP_JAR_DIR)e

10、ndef使用宏和使用变量的方式相同,如下:$(UI_JAR): $(UI_CLASSES) $(create-jar)3. 函数函数可以分为字符串函数、文件名函数、流程控制函数,用户还可以自定应函数。函数调用形式为:$(function-name arg1, argn)注意:函数调用使用$()括起来$(后面直接跟函数名称函数名和第一个参数之间用空格,后面的参数之间使用逗号间隔例如:objects = $(subst .cpp,.o,$(sources)调用函数吧$(sources)中的.cpp替换成.o。常用函数有:4. 命令必须讲明,makefile的命令是要调用shell来运行的,而到底是

11、使用的哪个shell取决于makefile中SHELL变量的设置,默认为/bin/sh就是bash。在makefile中使用bash的变量。makefile中使用$()引用的是makefile内的变量,如果想使用bash环境的变量要使用双美元引用$,使用单个$引用的变量全部被解释为makefile的变量。以此类推,如果要想试图用bash中的进程号码就要使用四个$,即:$。另外,值得强调的一点是:makefile是一次发送一行命令,每发送一次命令,就会启动一个subshell来运行。这意味着命令之间不能共享变量,而且bash中可以使用的for和while,在这里面也不能换行,因为每行会被单独的发

12、送给bash来执行。要解决这个问题,要么使用makefile中的换行符”,要么写成单行的形式。如:使用换行符:写成单行:再如:$n是用来引用bash环境中的变量n的,上面第二条有解释。makefile的命令修饰符有三种: 不打印运行的命令- 屏蔽命令出错信息+ 只打印运行的命令,不运行5. make命令行选项在make的命令行上可以指定make使用的变量,覆盖makefile中的赋值。比如:make CXX=gcc另外,可以使用-C运行其他文件下面的makefile。例如:make -C src/main再如,你可能感觉make的时间特长,那么试试-j选项吧,这是make内置的并行指令方法:m

13、ake -j 8 #这就是并行8个job来完成make6. 一个大型项目makefile例子根目录下的makefile#初始化4个变量,用来收集子文件夹下面的信息modules := src/main src/util src/test src/ext #程序包括哪些模块,或者说文件夹programs := #收集excutable的sources := #收集cpp的libraries := #收集.o的extra_clean := #objects = $(subst .c,.o,$(sources) #调用函数由.c的文件得到.o的文件dependencies = $(subst .c,

14、.d,$(sources) #调用函数由.c的文件得到.d的文件,.d文件是用来得到子目录.o的include_dirs := lib includeCPPFLAGS += $(addprefix -I ,$(include_dirs)vpath %.h $(include_dirs)MV := mv -fRM := rm -fSED := sedall:include $(addsuffix /module.mk,$(modules) #用函数引入src/main/ module.mk等include $( dependencies).PHONY: allall: $(programs).P

15、HONY: librarieslibraries: $(libraries).PHONY: cleanclean: $(RM) $(objects) $(programs) $(libraries) $(dependencies) $(extra_clean)%.d: %.c #后缀规则,描述.d文件的生成 $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -M $ $.tmp $(MV) $.tmp $两个特殊的表达式:($(notdir $*).o) *: 函数notdir用来取“含路径的文件名”中的文件名,匹配出的是.c文件对应的.o文件$(dir $

16、)1 $: 函数dir用来取路径,1保存的是全面正则表达式的第一个匹配,$是目标即.d子目录下的module.mklocal_dir := lib/codeclocal_lib := $(local_dir)/libcodec.alocal_src := $(addprefix $(local_dir)/,codec.c)local_objs := $(subst .c,.o,$(local_src)libraries += $(local_lib)sources += $(local_src)$(local_lib): $(local_objs) $(AR) $(ARFLAGS) $ $在最

17、顶层目录使用make命令,整个项目的执行过程仍然是先建立依赖关系,然后从最底层来执行。这里的情况是:1. 由include进入,make先会到找每个目录下面找module.mk和.d文件2. .d的产生需要.c,这在每个子文件中条件已经具备了3. module.mk的运行需要.o,可能还有其他模块产生的的.a4. .o文件的产生,是在生成的.d文件中描述的(由g+ 的-M参数实现)5. .a文件的产生,是在module.mk文件中描述的至此,所有条件都已经具备。从后往前做就可以完成所有任务。7. make p的输出# GNU Make 3.80# Copyright (C) 2002 Free

18、 Software Foundation, Inc.# This is free software; see the source for copying conditions.# There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A# PARTICULAR PURPOSE.normal command execution occurs here# Make data base, printed on Thu Apr 29 20:58:13 2004# Variables 自动变量、内置变量都在这里.# Directories 将会被make检查的目录.# Implicit Rules 隐含虽则,当然也是内置规则.# Pattern-specific variable values.# Files 后缀规则在这里.# VPATH Search Paths vpath的设置

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1