makefile隐晦规则范文模板 29页.docx
- 文档编号:4921070
- 上传时间:2022-12-11
- 格式:DOCX
- 页数:24
- 大小:26.58KB
makefile隐晦规则范文模板 29页.docx
《makefile隐晦规则范文模板 29页.docx》由会员分享,可在线阅读,更多相关《makefile隐晦规则范文模板 29页.docx(24页珍藏版)》请在冰豆网上搜索。
makefile隐晦规则范文模板29页
本文部分内容来自网络整理,本司不为其真实性负责,如有异议或侵权请及时联系,本司将立即删除!
==本文为word格式,下载后可方便编辑和修改!
==
makefile隐晦规则
篇一:
吐血共享我收集并总结后的makefile的编写规则级方法
makefile关系到了整个工程的编译规则。
一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。
makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
make是一个命令工具,是一个解释makefile中指令的命令工具。
unix下的中间代码文件是.o文件。
头文件中应该只是声明,而定义应该放在C/C++文件中
makefile的规则是:
1)如果这个工程没有编译过,那么我们的所有C文件都要编译并被链接。
2)如果这个工程的某几个C文件被修改,那么我们只编译被修改的C文件,并链接目标程序。
3)如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的C文件,并链接目标程序。
只要我们的Makefile写得够好,所有的这一切,我们只用一个make命令就可以完成,make命令会自动智能地根据当前的文件修改的情况来确定哪些文件需要重编译,从而自己编译所需要的文件和链接目标程序。
Makefile的规则。
target...:
prerequisites...
command
...
...
target也就是一个目标文件,可以是ObjectFile,也可以是执行文件。
还可以是一个标签(Label),对于标签这种特性,在后续的“伪目标”章节中会有叙述。
prerequisites就是,要生成那个target所需要的文件或是目标。
command也就是make需要执行的命令。
(任意的Shell命令)
这是一个文件的依赖关系,也就是说,target这一个或多个的目标文件依赖于prerequisites中的文件,其生成规则定义在command中。
说白一点就是说,prerequisites中如果有一个以上的文件比target文件要新的话,command所定义的命令就会被执行。
这就是Makefile的规则。
也就是Makefile中最核心的内容
.PHONY:
clean,“.PHONY”表示,clean是个伪目标文件。
一般的风格都是:
clean:
rmedit$(objects)
更为稳健的做法是:
.PHONY:
clean
clean:
-rmedit$(objects)
前面说过,.PHONY意思表示clean是一个“伪目标”,。
而在rm命令前面加了一个小减号的意思就是,也许某些文件出现问题,但不要管,继续做后面的事。
Makefile里主要包含了五个东西:
显式规则、隐晦规则、变量定义、文件指示和注释。
1、显式规则。
显式规则说明了,如何生成一个或多的的目标文件。
这是由Makefile的书写者明显指出,要生成的文件,文件的依赖文件,生成的命令。
2、隐晦规则。
由于我们的make有自动推导的功能,所以隐晦的规则可以让我们比较粗糙地简略地书写Makefile,这是由make所支持的。
3、变量的定义。
在Makefile中我们要定义一系列的变量,变量一般都是字符串,这个有点你C语言中的宏,当Makefile被执行时,其中的变量都会被扩展到相应的引用位置上。
4、文件指示。
其包括了三个部分,一个是在一个Makefile中引用另一个Makefile,就像C语言中的include一样;另一个是指根据某些情况指定Makefile中的有效部分,就像C语言中的预编译#if一样;还有就是定义一个多行的命令。
有关这一部分的内容,我会在后续的部分中讲述。
5、注释。
Makefile中只有行注释,和UNIX的Shell脚本一样,其注释是用“#”字符,这个就像C/C++中的“//”一样。
如果你要在你的Makefile中使用“#”字符,可以用反斜框进行转义,如:
“\#”。
最后,还值得一提的是,在Makefile中的命令,必须要以[Tab]键开始。
默认的情况下,make命令会在当前目录下按顺序找寻文件名为“GNUmakefile”、“makefile”、“Makefile”的文件,你可以使用别的文件名来书写Makefile,比如:
“Make.Linux”,“Make.Solaris”,“Make.AIX”等,如果要指定特定的Makefile,你可以使用make的“-f”和“--file”参数,如:
make-fMake.Linux或make--fileMake.AIX。
引用其它的Makefile
在Makefile使用include关键字可以把别的Makefile包含进来,这很像C语言的#include,被包含的文件会原模原样的放在当前文件的包含位置。
include的语法是:
include
filename可以是当前操作系统Shell的文件模式(可以保含路径和通配符)
在include前面可以有一些空字符,但是绝不能是[Tab]键开始。
include和
举个例子,你有这样几个Makefile:
a.mk、b.mk、c.mk,还有一个文件叫foo.make,以及一个变量$(bar),其包含了e.mk和f.mk,那么,下面的语句:
includefoo.make*.mk$(bar)
等价于:
includefoo.makea.mkb.mkc.mke.mkf.mk
make命令开始时,会把找寻include所指出的其它Makefile,并把其内容安置在当前的位置。
就好像C/C++的#include指令一样。
如果文件都没有指定绝对路径或是相对路径的话,make会在当前目录下首先寻找,如果当前目录下没有找到,那么,make还会在下面的几个目录下找:
1、如果make执行时,有“-I”或“--include-dir”参数,那么make就会在这个参数所指定的目录下去寻找。
2、如果目录
/usr/local/bin或/usr/include)存在的话,make也会去找。
如果有文件没有找到的话,make会生成一条警告信息,但不会马上出现致命错误。
它会继续载入其它的文件,一旦完成makefile的读取,make会再重试这些没有找到,或是不能读取的文件,如果还是不行,make才会出现一条致命信息。
如果你想让make不理那些无法读取的文件,而继续执行,你可以在include前加一个减号“-”。
如:
-include
其表示,无论include过程中出现什么错误,都不要报错继续执行。
和其它版本make兼容的相关命令是sinclude,其作用和这一个是一样的。
GNU的make工作时的执行步骤入下:
(想来其它的make也是类似)
1、读入所有的Makefile。
2、读入被include的其它Makefile。
3、初始化文件中的变量。
4、推导隐晦规则,并分析所有规则。
5、为所有的目标文件创建依赖关系链。
6、根据依赖关系,决定哪些目标要重新生成。
7、执行生成命令。
make支持三各通配符:
“*”,“?
”和“[...]”。
波浪号(“~”)字符在文件名中也有比较特殊的用途。
如果是“~/test”,这就表示当前用户的$HOME目录下的test目录。
而“~hchen/test”则表示用户hchen的宿主目录下的test目录。
(这些都是Unix下的小知识了,make也支持)而在Windows或是MS-DOS下,用户没
有宿主目录,那么波浪号所指的目录则根据环境变量“HOME”而定。
通配符代替了你一系列的文件,如“*.c”表示所以后缀为c的文件。
一个需要我们注意的是,如果我们的文件名中有通配符,如:
“*”,那么可以用转义字符“\”,如“\*”来表示真实的“*”字符,而不是任意长度的字符串。
文件搜寻
在一些大的工程中,有大量的源文件,我们通常的做法是把这许多的源文件分类,并存放在不同的目录中。
所以,当make需要去找寻文件的依赖关系时,你可以在文件前加上路径,但最好的方法是把一个路径告诉make,让make在自动去找。
Makefile文件中的特殊变量“VPATH”就是完成这个功能的,如果没有指明这个变量,make只会在当前的目录中去找寻依赖文件和目标文件。
如果定义了这个变量,那么,make就会在当当前目录找不到的情况下,到所指定的目录中去找寻文件了。
VPATH=src:
../headers
上面的的定义指定两个目录,“src”和“../headers”,make会按照这个顺序进行搜索。
目录由“冒号”分隔。
(当然,当前目录永远是最高优先搜索的地方)
另一个设置文件搜索路径的方法是使用make的“vpath”关键字(注意,它是全小写的),这不是变量,这是一个make的关键字,这和上面提到的那个VPATH变量很类似,但是它更为灵活。
它可以指定不同的文件在不同的搜索目录中。
这是一个很灵活的功能。
它的使用方法有三种:
1、vpath
为符合模式
2、vpath
清除符合模式
3、vpath
清除所有已被设置好了的文件搜索目录。
vapth使用方法中的
“%”的意思是匹配零或若干字符,例如,“%.h”表示所有以“.h”结尾的文件。
例如:
vpath%.h../headers
该语句表示,要求make在“../headers”目录下搜索所有以“.h”结尾的文件。
(如果某文件在当前目录没有找到的话)
我们可以连续地使用vpath语句,以指定不同搜索策略。
如果连续的vpath语句中出现了相同的
如:
vpath%.cfoo
vpath%blish
vpath%.cbar
其表示“.c”结尾的文件,先在“foo”目录,然后是“blish”,最后是“bar”目录。
vpath%.cfoo:
bar
vpath%blish
而上面的语句则表示“.c”结尾的文件,先在“foo”目录,然后是“bar”目录,最后才是“blish”目录。
为了避免和文件重名的这种情况,我们可以使用一个特殊的标记“.PHONY”来显示地指明一个目标是“伪目标”,向make说明,不管是否有这个文件,这个目标就是“伪目标”。
.PHONY:
clean
只要有这个声明,不管是否有“clean”文件,要运行“clean”这个目标,只有“makeclean”这样。
于是整个过程可以这样写:
.PHONY:
clean
clean:
rm*.otemp
为了避免和文件重名的这种情况,我们可以使用一个特殊的标记“.PHONY”来显示地指明一个目标是“伪目标”,向make说明,不管是否有这个文件,这个目标就是“伪目标”。
.PHONY:
clean
只要有这个声明,不管是否有“clean”文件,要运行“clean”这个目标,只有“makeclean”这样。
于是整个过程可以这样写:
.PHONY:
clean
clean:
rm*.otemp
篇二:
makefile基础实例讲解
Makefile基础实例讲解
一、makefile简介
定义:
makefile定义了软件开发过程中,项目工程编译链、接接的方法和规则。
产生:
由IDE自动生成或者开发者手动书写。
作用:
Unix(MACOS、Solars)和Linux(RedHat、Ubuntu)系统下由make命令调用当前目录下的makefile文件执行,可实现项目工程的自动化编译。
二、语法规则
target:
prerequisites
command
其中,target为需要生成的目标,prerequisites为依赖项,command为make需要执行的命令(任意的Shell命令)。
注意:
其中command前必须以tab键开始。
三、makefile内容
Makefile里主要包含了五个东西:
显式规则、隐晦规则、变量定义、文件指示和注释。
1.显式规则。
显式规则说明了,如何生成一个或多的的目标文件。
这是由Makefile的书写者明显指出,要生成的文件,文件的依赖文件,生成的命令。
2.隐晦规则。
由于我们的make有自动推导的功能,所以隐晦的规则可以让我们比较粗糙地简略地书写Makefile,这是由make所支持的。
3.变量的定义。
在Makefile中我们要定义一系列的变量,变量一般都是字符串,这个有点你C语言中的宏,当Makefile被执行时,其中的变量都会被扩展到相应的引用位置上。
4.文件指示。
其包括了三个部分,一个是在一个Makefile中引用另一个Makefile,就像C语言中的include一样;另一个是指根据某些情况指定Makefile中的有效部分,就像C语言中的预编译#if一样;还有就是定义一个多行的命令。
有关这一部分的内容,请参考文末的参考资料。
5.注释。
Makefile中只有行注释,和UNIX的Shell脚本一样,其注释是用“#”字符,这个就像C/C++中的“//”一样。
如果你要在你的Makefile中使用“#”字符,可以用反斜框进行转义,如:
“\#”。
四、make的工作流程
在默认的方式下,也就是我们只输入make命令,则相当于makefirst_objname_in_makefile。
意思是生成出现在makefile中第一个目标文件。
或者指明生成的目标名称,如make[objname]。
按默认方式,输入make命令,其工作方式是:
1.make会在当前目录下找名字叫“Makefile”或“makefile”的文件。
2.如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,并把这个文件作为最终的目标文件。
3.如果target不存在,则根据target后的依赖项和command生成target。
如果target已存在,则make检测target依赖项是否有修改,若修改,则跟新target。
四、实例讲解
鄙人将以实际工作项目的makefile为例为大家讲解makefile的创建过程。
Makefile内容如下:
CCFILES+=$(wildcardsrc/*.cpp)
SRCDIR:
=./src/
VPATH=src:
./include:
./src/xmlparser:
./lib
#Compilers
#CC:
=/opt/intel/composer_xe_201X.0.079/bin/intel64/icpc
CC:
=icpc
#Compilerspara
FLAGS:
=-openmp-openmp-report-vec-report-O2
OBJECT:
=file_interface.otinyxml2.omic_decomposer.oCharset.onetwork.obuffer.o\task_queue.ocommon.omain.omic_function.ohashtree.onodeconfig.omd5_mic.ontlm_mic.o
ALG.out:
$(OBJECT)
(来自:
:
makefile隐晦规则)
$(CC)$(FLAGS)-oALG.out$(OBJECT)./lib/libxmlextern.a
file_interface.o:
global.htinyxml2.hfile_interface.h$(SRCDIR)file_interface.cpp
$(CC)$(FLAGS)-c$(SRCDIR)file_interface.cpp
tinyxml2.o:
tinyxml2.h$(SRCDIR)tinyxml2.cpp
$(CC)$(FLAGS)-c$(SRCDIR)tinyxml2.cpp
mic_decomposer.o:
$(SRCDIR)mic_decomposer.cppmic_decomposer.hmic_define.hce.h\common.hhashtree.h
$(CC)$(FLAGS)-c$(SRCDIR)mic_decomposer.cpp
Charset.o:
Charset.hce.h$(SRCDIR)Charset.cpp
$(CC)$(FLAGS)-c$(SRCDIR)Charset.cpp
network.o:
network.htask_queue.hnetwork_packet.hnodeconfig.h$(SRCDIR)network.cpp$(CC)$(FLAGS)-c$(SRCDIR)network.cpp
buffer.o:
network.htask_queue.hnetwork_packet.hnodeconfig.hbuffer.h$(SRCDIR)buffer.cpp$(CC)$(FLAGS)-c$(SRCDIR)buffer.cpp
task_queue.o:
task_queue.h$(SRCDIR)task_queue.cpp
$(CC)$(FLAGS)-c$(SRCDIR)task_queue.cpp
common.o:
common.hmic_define.hmic_function.h$(SRCDIR)common.cpp
$(CC)$(FLAGS)-c$(SRCDIR)common.cpp
main.o:
task_queue.hglobal.hnetwork.hnetwork_packet.hcommon.hnodeconfig.h\mic_define.hmic_function.hfile_interface.h$(SRCDIR)main.cpp
$(CC)$(FLAGS)-c$(SRCDIR)main.cpp
mic_function.o:
mic_function.h$(SRCDIR)mic_function.cpp
$(CC)$(FLAGS)-c$(SRCDIR)mic_function.cpp
hashtree.o:
hashtree.h$(SRCDIR)hashtree.cpp
$(CC)$(FLAGS)-c$(SRCDIR)hashtree.cpp
nodeconfig.o:
nodeconfig.h./src/xmlparser/tinyxml.h$(SRCDIR)nodeconfig.cpp
$(CC)$(FLAGS)-c$(SRCDIR)nodeconfig.cpp
md5_mic.o:
simd.hmic_define.hcommon.hshare_macro.hmd5_macro.hmd5_mic.h\file_interface.h$(SRCDIR)md5_mic.cpp
$(CC)$(FLAGS)-c$(SRCDIR)md5_mic.cpp
ntlm_mic.o:
simd.hmic_define.hcommon.hshare_macro.hntlm_macro.hntlm_mic.h$(CC)$(FLAGS)-c$(SRCDIR)sha256_mic.cpp
.PHONYclean:
rm-f*.o*.out
具体讲解:
1.CCFILES+=$(wildcardsrc/*.cpp)
利用wildcard函数获取src目录下所有.cpp文件,并赋值给自定义变量CCFILES。
2.SRCDIR:
=./src/
用于指明.cpp源文件所在目录。
SRCDIR变量在command中出现时,以类似于宏替换的方式将其载入command中。
3.VPATH=src:
./include:
./src/xmlparser:
./lib
指明makefile寻找依赖项时,若当前目录不存在,则去VPATH指明的目录去寻找。
各目录以“:
”号隔开。
4.CC:
=icpc,自定义变量CC指明为icpc,表示使用Intelc++Compiler编译项目。
5.FLAGS:
=-openmp-openmp-report-vec-report-O2,指明编译选项。
6.OBJECT:
=file_interface.otinyxml2.omic_decomposer.oCharset.onetwork.obuffer.o\
task_queue.ocommon.omain.omic_function.ohashtree.onodeconfig.omd5_mic.ontlm_mic.o
指明目标文件;其中反斜杠\表示一行还未结束。
7.ALG.out:
$(OBJECT)
$(CC)$(FLAGS)-oALG.out$(OBJECT)./lib/libxmlextern.a
此处表示makefile需要生成的第一个目标文件,也是不指明目标文件的make命令默认生成的目标文件。
加入icpc的编译选项,并指明目标ALG.out依赖的目标文件和静态链接库项./lib/libxmlextern.a后,进行链接生成可执行文件ALG.out。
8.file_interface.o:
global.htinyxml2.hfile_interface.h$(SRCDIR)file_interface.cpp
$(CC)$(FLAGS)-c$(SRCDIR)file_interface.cpp
指明file_interface.o的依赖项并编译成二进制文件file_interface.o。
后面的每个目标文件皆是如此做法。
9..PHONYclean:
rm-f*.o*.out
使用.PHONY关键字,指明clean是伪目标,仅作标签使用。
此处不依赖与任何项,使用方法是显示调用makeclean,用于执行rm操作。
但也可以添加依赖项,如:
all:
prog1prog2prog3
.PHONY:
all
则all依赖于ALG.out,那么使用makeall则可以生成三个目标文件prog1、prog2和prog3。
若将all放在所有目标文件的前面,则使用make即可,无需指明makeall,原因是make命令将makefile中第一个出现的目标作为最终目标,若不放在最前面,则必须指明makeall。
注意事项:
1.makefile赋值符号=:
=+=?
=的区别
=是最基本的赋值,以makefile中最后赋值
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- makefile隐晦规则范文模板 29页 makefile 隐晦 规则 范文 模板 29