Windows 下的 Makefile 编写(三)推理规则
- 格式:pdf
- 大小:213.65 KB
- 文档页数:3
makefile编写规则⼀、makefile 规则:⼀般开头都是 Tab ,不能空格, include 前⾯不能是 Tab; 1、如果没编译过,将所有的(.c)⽂件编译并且链接; 2、如果有其中的(.c)⽂件改变,编译并链接改变的⽂件; 3、如果(.h)⽂件被修改,编译引⽤相应的(.c)⽂件, 链接; 4、在随意修改时间的情况下,会导致编译过程中⽣成的(.o 中间⽂件)与可执⾏⽂件时间不⼀致,此时会编译相应的⽂件,并链接,最终编译成可执⾏⽂件;⼆、第⼀版 makefile: 例如有2个 .h ⽂件(utils.h, player.h, actor.h)和 3个 .c ⽂件( main.c, player.c, actor.c)需要编译链接:/*****main.c*********/#include "utils.h"#include "player.h"void main() {// do something}/*******player.c**********/#include "utils.h"#include "actor.h"bool create_player() {// do something}/****actor.c************/#include "utils.h"bool create_actor() {// do something}/********* makefile *****************/test : main.o actor.occ -o test main.o actor.omain.o : main.c utils.h player.h actor.hcc -c main.cpalyer.o: player.c player.h actor.h utils.hcc -c player.cactor.o: actor.h utils.hcc -c actor.cclean:rm test ain.o player.o actor.o 优点:可毒性很强,思路清晰明了; 缺点:⿇烦,重复的依赖过多,当需要编译⼤量⽂件时容易出错;第⼆版:利⽤ makefile 的变量;/********* makefile *****************/OBJ = main.o actor.o // 跟第⼀版⽐较,唯⼀的区别在这test : $(OBJ) // 这⼉cc -o test $(OBJ) // 这⼉main.o : main.c utils.h player.h actor.hcc -c main.cpalyer.o: player.c player.h actor.h utils.hcc -c player.cactor.o: actor.h utils.hcc -c actor.c .PHONY : clean // 伪⽬标,避免:如果当前⽬录下存在 clean rm 指令不执⾏clean:-rm test $(OBJ) // 前⾯的(-)表⽰,执⾏过程中不 care 出错;第三版:利⽤ GUN make 的⾃动推导规则 当 make 看到(.o )⽂件,他会⾃动把(.c)⽂件加上依赖关系,包括执⾏的语句(cc -c xx.c);/********* makefile *****************/OBJ = main.o actor.o // 跟第⼀版⽐较,唯⼀的区别在这test : $(OBJ) // 这⼉cc -o test $(OBJ) // 这⼉main.o : utils.h player.h actor.hpalyer.o: player.h actor.h utils.hactor.o: actor.h utils.h .PHONY : clean // 伪⽬标,避免:如果当前⽬录下存在 clean rm 指令不执⾏clean:-rm test $(OBJ)第四版:对第三版的整理(有⼀些重复的 .h) 公共的⼀起依赖,单独的单独依赖/********* makefile *****************/OBJ = main.o actor.o // 跟第⼀版⽐较,唯⼀的区别在这test : $(OBJ) // 这⼉cc -o test $(OBJ) // 这⼉$(OBJ) : utils.h actor.omain.o player.o .PHONY : clean // 伪⽬标,避免:如果当前⽬录下存在 clean rm 指令不执⾏clean:-rm test $(OBJ)优点:简洁缺点:不好理解以上的makefike⽂件的基本写法;或许你也发现了,如果有⼏百个源⽂件咋整呢,光是⽬录就要晕死,下⾯就是针对这种情况来说⼀下⼤型⼯程 makefile 的编写设计⼆、⼤型项⽬makefile编写: Makefile 同样也有像 c / c++ 类似的include功能; 例如我们有⼀堆 a.mk , b.mk以及 foo.make和⼀个变量 $(bar),其包含了 e.mk,f.mk, 那么 include foo.make *.mk $(bar) ------- 等价-------》 include foo.make a.mk b.mk e.mk f.mk。
Windows Makefile编写规则1. 简介Makefile是一种用于自动化构建和管理项目的工具,它为程序员提供了一种简单的方式来定义和组织项目的编译和链接规则。
在Windows操作系统上,我们可以使用GNU Make工具来解析和执行Makefile文件,实现自动化构建。
2. Makefile的基本语法Makefile由一系列规则组成,每个规则包含一个或多个目标、依赖和命令。
当目标所依赖的文件发生变化时,Make工具会根据规则中定义的命令来重新构建目标。
2.1 目标目标是Makefile中的主要元素,它表示需要构建的文件或操作。
目标可以是一个文件名,也可以是一个伪目标,用于执行一系列命令而不产生任何文件。
target: dependenciescommand2.2 依赖依赖表示目标所依赖的文件或目标。
当依赖的文件发生变化时,Make工具会重新构建目标。
target: dependency1 dependency2command2.3 命令命令是Makefile中的具体操作,用于构建目标或执行其他任务。
命令必须以Tab键开头,否则Make工具无法正确解析。
target:command1command23. Windows下的Makefile在Windows操作系统下,我们可以使用GNU Make工具来执行Makefile文件。
为了能够在Windows上使用Make工具,我们需要安装MinGW或Cygwin等工具集,以提供类Unix环境的支持。
3.1 安装MinGWMinGW是一个Windows上的开发工具集,它提供了一系列的GNU工具,包括GCC编译器和Make工具。
我们可以通过以下步骤来安装MinGW:1.下载MinGW安装程序,可以从官方网站或镜像站点下载。
2.运行安装程序,选择需要安装的组件,包括GCC编译器和Make工具。
3.设置安装路径,并完成安装。
3.2 编写Makefile在Windows下编写Makefile与在Unix系统下基本相同,只是需要注意路径的表示方式。
Makefile中的模式规则是一种特殊的规则,它允许你使用模式来匹配目标文件,然后根据匹配结果执行相应的命令。
模式规则中的目标文件名包含一个模式字符“%”,该字符可以匹配任何非空字符串。
在模式规则中,目标文件是一个带有模式字符“%”的文件,使用模式来匹配目标文件。
一旦依赖目标中的“%”模式被确定,make 会被要求去匹配当前目录下所有的文件名,一旦找到,make就会执行规则下的命令。
在模式规则中,目标可能会是多个的,如果有模式匹配出多个目标,make就会产生所有的模式目标。
此时,make关心的是依赖的文件名和生成目标的命令这两件事。
以下是一个简单的Makefile模式规则示例:
```makefile
%.o : %.c
$(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@
```
这个规则表示将所有的.c文件编译成.o文件。
其中,“$<”表示了所有依赖目标的挨个值,“$@”表示了所有目标的挨个值。
这些自动化变量将在后面的章节中详细讲述。
总的来说,Makefile的模式规则是一种强大的工具,它可以根据文件名模式自动构建目标文件,并执行相应的命令。
makefile文件语法规则Makefile文件的基本语法规则包括以下几点:1. 注释:以井号(#)开头的行被视为注释,不会被执行。
2. 规则:每条规则由一个目标文件和一组依赖文件组成,以及一个用于构建目标文件的命令。
规则的格式如下:Css:目标文件:依赖文件命令目标文件和依赖文件之间用冒号(:)分隔,命令部分指定了如何从依赖文件生成目标文件。
3. 变量:Makefile中可以使用变量来存储值,变量的值可以包含文本、空格、数字等。
变量名以美元符号($)开头,例如:Makefile:VAR = value命令= $VAR4. 函数:Makefile支持使用函数来执行更复杂的操作。
函数的语法如下:Scss:函数名(参数)Makefile中内置了一些常用的函数,如字符串操作函数、条件判断函数等。
也可以自定义函数。
5. 通配符:Makefile中可以使用通配符来匹配多个文件,常见的通配符有“*”和“?”。
例如,“*.c”表示匹配所有以“.c”结尾的文件,“a?b”表示匹配“ab”、“axb”、“ayb”等字符串。
6. 回声:在Makefile中,命令前面加上“@”符号可以关闭回声,即不会在执行命令时显示该命令。
例如:Makefile:@echo Hello, world!这条命令执行时不会输出“Hello, world!”的文本。
7. 模式规则:Makefile中的模式规则允许根据一组通配符匹配的文件来定义规则,格式如下:Makefile:模式:目标文件命令1命令2模式匹配的文件将按照指定的命令构建目标文件。
Makefile 隱含規則在我們使用Makefile 時,有一些我們會經常使用,而且使用頻率非常高的東西,比如,我們編譯C/C++的來源程式為中間目的檔案(Unix下是[.o]文件,Win dows 下是[.obj]文件)。
本章講述的就是一些在Makefile中的—隱含的II早先約定了的,不需要我們再寫出來的規則。
—隱含規則也就是一種慣例,make會按照這種—慣例心照不喧地來運行,那怕我們的Makefile中沒有書寫這樣的規則。
例如,把[.c]檔編譯成[.o]檔這一規則, 你根本就不用寫出來,make會自動推導出這種規則,並生成我們需要的[.o]文件—隱含規則I會使用一些我們系統變數,我們可以改變這些系統變數的值來定制隱含規則的運行時的參數。
如系統變數一CFLAGS可以控制編譯時的編譯器參數。
我們還可以通過我式規則I的方式寫下自己的隱含規則。
用—尾碼規則來定義隱含規則會有許多的限制。
使用—模式規則I會更回得智慧和清楚,但—尾碼規則可以用來保證我們Makefile 的相容性。
我們瞭解了―隱含規則I,可以讓其為我們更好的服務,也會讓我們知道一些—勺定俗成了的東西,而不至於使得我們在運行Makefile時出現一些我們覺得莫名其妙的東西。
當然,任何事物都是矛盾的,水能載舟,亦可覆舟,所以,有時候—隱含規則I 也會給我們造成不小的麻煩。
只有瞭解了它,我們才能更好地使用它。
、使用隱含規則如果要使用隱含規則生成你需要的目標,你所需要做的就是不要寫出這個目標的規則。
那麼,make 會詴圖去自動推導產生這個目標的規則和命令,如果make 可以自動推導生成這個目標的規則和命令,那麼這個行為就是隱含規則的自動推導。
當然,隱含規則是make事先約定好的一些東西。
例如,我們有下面的一個Makefile :foo : foo.o bar.occ p foo foo.o bar.o $(CFLAGS) $(LDFLAGS)我們可以注意到,這個Makefile中並沒有寫下如何生成foo.o和bar.o這兩目標的規則和命令。
Makefile编写规则(三)条件判断和伪⽬标Makefile编写规则(三)条件判断和伪⽬标Makefile条件判断使⽤ Makefile 编译⽂件时,可能会遇到需要分条件执⾏的情况,⽐如在⼀个⼯程⽂件中,可编译的源⽂件很多,但是它们的类型是不相同的,所以编译⽂件使⽤的编译器也是不同的。
⼿动编译去操作⽂件显然是不可⾏的(每个⽂件编译时需要注意的事项很多),所以 make 为我们提供了条件判断来解决这样的问题。
条件语句可以根据⼀个变量的值来控制 make 执⾏或者时忽略 Makefile 的特定部分,条件语句可以是两个不同的变量或者是常量和变量之间的⽐较。
注意:条件语句只能⽤于控制 make 实际执⾏的 Makefile ⽂件部分,不能控制规则的 shell 命令执⾏的过程。
下⾯是条件判断中使⽤到的⼀些关键字:关键字功能ifeq判断参数是否不相等,相等为 true,不相等为 false。
ifneq判断参数是否不相等,不相等为 true,相等为 false。
ifdef判断是否有值,有值为 true,没有值为 false。
ifndef判断是否有值,没有值为 true,有值为 false1)ideq和ifneq条件判断的使⽤⽅式如下:ifeq (ARG1, ARG2)ifeq 'ARG1' 'ARG2'ifeq "ARG1" "ARG2"ifeq "ARG1" 'ARG2'ifeq 'ARG1' "ARG2"实例:libs_for_gcc= -lgnunormal_libs=foo:$(objects)ifeq($(CC),gcc)$(CC) -o foo $(objects) $(libs_for_gcc)else$(CC) -o foo $(objects) $(noemal_libs)endif条件语句中使⽤到三个关键字“ifeq”、“else”、“endif”。
makefile编译规则Makefile编译规则一、引言在软件开发过程中,编译是将源代码转化为可执行文件或者库文件的重要步骤。
为了简化编译过程,提高开发效率,我们可以使用Makefile来管理和自动化编译过程。
Makefile是一个文本文件,其中包含一系列的规则,用于描述源文件之间的依赖关系和编译操作。
二、Makefile基本语法1. 目标(T arget)Makefile中的目标是指我们希望生成的文件,可以是可执行文件、库文件或者中间文件等。
目标一般以文件名表示,可以包含路径信息。
2. 依赖(Prerequisites)依赖是指目标生成所依赖的文件或者其他目标。
当依赖文件发生变化时,Make会自动重新编译相关的目标。
3. 规则(Rule)规则是Makefile中最重要的部分,用于描述目标和依赖之间的关系,以及如何生成目标文件。
规则的基本语法如下:```target: prerequisitescommand```其中,target表示目标文件,prerequisites表示依赖文件或者其他目标,command表示生成目标文件的命令。
4. 变量(Variable)Makefile中的变量用于存储和传递数据,可以是字符串、路径、命令等。
变量的定义使用“=”或者“:=”,例如:```CC = gccCFLAGS = -Wall -O2```变量的使用使用“$”符号,例如:```$(CC) $(CFLAGS) -o target source.c```5. 通配符(Wildcard)通配符可以帮助我们查找符合某种模式的文件,常用的通配符包括“*”和“?”。
例如,我们可以使用以下命令查找所有的.c文件:```sources = $(wildcard *.c)```6. 函数(Function)函数是Makefile中的一个重要概念,可以帮助我们处理字符串、路径和文件等。
常用的函数包括:- $(patsubst pattern,replacement,text):将文本中符合模式pattern的部分替换为replacement;- $(shell command):执行shell命令,并返回结果;- $(dir names):返回文件路径部分;- $(notdir names):返回文件名部分;- $(basename names):返回文件名去除后缀部分;- $(suffix names):返回文件后缀部分。
makefile的规则和编写方法Makefile是一种文本文件,它包含了一系列规则和命令,用于描述源代码的编译和构建过程。
Makefile的规则和编写方法对于项目的管理和维护非常重要。
下面是关于Makefile规则和编写方法的一些要点:1. 目标(Targets):每个Makefile中都应该定义一个或多个目标。
目标通常代表项目中的某个文件、可执行程序或者一个任务。
在Makefile中,目标的名称应该在冒号(:)后面给出,并且每个目标都应该独占一行。
2. 依赖(Dependencies):在Makefile中,每个目标通常都会依赖于其他文件或目标。
依赖关系表示了一个文件或目标的生成所依赖的其他文件或目标。
依赖关系可以使用冒号(:)来表示,冒号前是目标名称,冒号后是该目标所依赖的文件或目标。
3. 命令(Commands):在Makefile中,每个目标都需要定义一个或多个命令,用于生成该目标所描述的文件或任务。
每个命令需要以制表符(Tab)开头,紧随其后的是具体的操作指令,如编译命令、链接命令等。
命令之间可以使用换行符进行分隔。
4. 变量(Variables):在Makefile中,可以使用变量来存储常用的数值、目录路径或者编译器选项等信息。
变量可以使用等号(=)或冒号等号(:=)进行赋值。
通过使用变量,可以大大简化Makefile的编写和维护过程。
5. 注释(Comments):注释用于解释Makefile中的规则和命令,以提高代码的可读性。
在Makefile 中,可以使用井号(#)表示注释,井号后的内容会被忽略。
编写一个简单的Makefile示例:```# 定义变量CC = gccCFLAGS = -Wall -O2# 定义目标和依赖关系myprogram: main.o func1.o func2.o$(CC) $(CFLAGS) -o myprogram main.o func1.o func2.o# 生成目标的命令main.o: main.c$(CC) $(CFLAGS) -c main.cfunc1.o: func1.c$(CC) $(CFLAGS) -c func1.cfunc2.o: func2.c$(CC) $(CFLAGS) -c func2.c# 清理目标文件的命令clean:rm -f *.o myprogram```以上是一个简单的Makefile示例。
makefile编写规则 ifeq【实用版】目录1.Makefile 简介2.Makefile 编写规则3.ifeq 函数的作用4.ifeq 函数的语法5.ifeq 函数的实例6.结论正文1.Makefile 简介Makefile 是一种用于自动化构建和编译软件的脚本文件。
它通常包含一系列的规则,用于指定如何构建和编译源代码。
Makefile 的主要目的是为了简化和自动化构建过程,以便开发者能够更专注于编写代码。
2.Makefile 编写规则在 Makefile 中,编写规则通常遵循以下格式:```目标:依赖文件t命令```其中,目标表示要构建的文件,依赖文件表示构建目标所需的输入文件,命令表示用于构建目标的命令。
例如,要编译一个名为“main.c”的源文件,可以编写如下规则:```main.o: main.ctgcc -c main.c```3.ifeq 函数的作用ifeq 函数是 Makefile 中的一种条件函数,用于根据某个条件决定是否执行相应的命令。
它可以帮助开发者根据不同的环境或配置选择性地执行代码。
4.ifeq 函数的语法ifeq 函数的语法如下:```ifeq (条件)ttrue-casetfalse-caseelsetelse-caseendif```其中,条件是一个逻辑表达式,true-case 和 false-case 分别表示条件为真和假时执行的命令。
else-case 是可选的,用于表示条件不满足时执行的命令。
5.ifeq 函数的实例假设我们希望根据不同的操作系统选择不同的编译器选项,可以编写如下 Makefile 规则:```%.o: %.ctifeq ($(OS), Linux)ttgcc -o $@ $< -std=gnu99telsettgcc -o $@ $< -std=ansitendif```在这个例子中,我们使用 ifeq 函数根据当前操作系统($(OS))选择不同的编译器选项。
makefile编写规则 ifeqifeq是makefile中的一个条件判断语句,用于判断变量的值是否相等。
在makefile中,ifeq语句的基本语法如下:ifeq(条件1, 条件2)条件1和条件2相等时执行的命令else条件1和条件2不相等时执行的命令endififeq语句可以用在makefile中的任何地方,用于根据条件来执行相应的命令。
在本文中,我们将重点讨论ifeq语句的用法及其在makefile 中的应用。
一、ifeq语句的基本用法ifeq语句的基本用法是用来比较两个变量的值是否相等,如果相等则执行相应的命令,否则执行另外的命令。
在makefile中,ifeq语句通常用在条件判断中,如下所示:```makefileifeq ($(VAR1), $(VAR2))echo "VAR1和VAR2相等"elseecho "VAR1和VAR2不相等"endif```上面的示例中,我们使用ifeq语句来比较变量VAR1和VAR2的值是否相等,如果相等则执行echo "VAR1和VAR2相等",否则执行echo "VAR1和VAR2不相等"。
这样我们可以根据条件来执行不同的命令,以实现makefile的灵活控制。
二、ifeq语句的扩展用法除了用来比较变量的值是否相等外,ifeq语句还可以用来比较其他条件,如下所示:```makefileifeq ($(shell uname), Linux)echo "当前系统是Linux"else ifeq ($(shell uname), Darwin)echo "当前系统是MacOS"elseecho "当前系统不是Linux也不是MacOS"endif```上面的示例中,我们使用ifeq语句来判断当前系统类型,如果是Linux则执行echo "当前系统是Linux",如果是MacOS则执行echo "当前系统是MacOS",如果既不是Linux也不是MacOS则执行echo "当前系统不是Linux也不是MacOS"。
windows makefile编写规则【实用版】目录1.编写 Makefile 的必要性2.Makefile 的基本结构3.变量定义4.规则与依赖关系5.编写 Windows Makefile 的注意事项正文一、编写 Makefile 的必要性在软件开发过程中,我们常常需要编译和链接源代码以生成可执行文件。
尤其是在大型项目中,如何自动化地管理这些编译和链接过程就显得尤为重要。
Makefile 就是在这种情况下应运而生的一种工具,它能帮助我们简化和规范化这个过程。
二、Makefile 的基本结构一个典型的 Makefile 主要包括以下几个部分:1.变量定义:用于设置一些编译选项和路径等。
2.规则:定义了如何将源文件编译成目标文件。
3.依赖关系:描述了目标文件依赖于哪些源文件。
三、变量定义在 Makefile 中,我们可以通过“define”语句来定义变量。
例如:```CC = g++CFLAGS = -g -Wall```上述代码定义了两个变量:CC 和 CFLAGS。
CC 表示编译器,这里设置为 g++;CFLAGS 表示编译选项,这里设置为-g(输出调试信息)和-Wall (启用所有警告)。
四、规则与依赖关系规则和依赖关系是 Makefile 的核心部分,它们描述了如何将源文件编译成目标文件。
规则的一般形式为:```目标文件 : 源文件 1 源文件 2...t$(CC) $(CFLAGS) -o $@ $^```其中,$@表示目标文件,$^表示所有源文件。
依赖关系则是通过“depends”语句来描述的,例如:```target.o : source1.o source2.ot$(CC) $(CFLAGS) -c $< -o $@```五、编写 Windows Makefile 的注意事项在 Windows 系统上编写 Makefile 时,需要注意以下几点:1.路径问题:在 Windows 系统上,路径使用双反斜杠()或者单斜杠(/)表示,需要根据实际情况进行设置。
windows下的makefile教程先说几句废话以前看书时经常遇到makefile,nmake这几个名词,然后随之而来的就是一大段莫名其妙的代码,把我看得云里雾里的。
在图书馆和google上搜了半天,也只能找到一些零零星星的资料,把我一直郁闷得不行。
最近因缘巧合,被我搞到了一份传说中的MASM6手册,终于揭开了NMAKE的庐山真面目。
想到那些可能正遭受着同样苦难的同志以及那些看到E文就头晕的兄弟,所以就写了这篇文章。
假如大家觉得有帮助的话,记得回复一下,当作鼓励!如果觉得很白痴,也请扔几个鸡蛋.本文是总结加翻译,对于一些关键词以及一些不是很确定的句子,保留了英文原版,然后再在括号里给出自己的理解以作参考。
由于水平有限,加上使用NMAKE的经验尚浅,有不对的地方大家记得要指正唷。
MASM6手册在AOGO(好像是)可以download,在我的BLOG上有到那的链接。
关于NMAKEMicrosoft Program Maintenance Utility,外号NMAKE,顾名思义,是用来管理程序的工具。
其实说白了,就是一个解释程序。
它处理一种叫做makefile的文件(以mak为后缀),解释里面的语句并执行相应的指令。
我们编写makefile文件,按照规定的语法描述文件之间的依赖关系,以及与该依赖关系相关联的一系列操作。
然后在调用NMAKE时,它会检查所有相关的文件,如果目标文件(target file,下文简称target,即依赖于其它文件的文件)的time stamp (就是文件最后一次被修改的时间,一个32位数,表示距离1980年以来经过的时间,以2秒为单位)小于依赖文件(dependent file,下文简称dependent,即被依赖的文件)的time stamp,NMAKE就执行与该依赖关系相关联的操作。
请看下面这个例子:foo.exe : first.obj second.objlink first.obj,second.obj第一行定义了依赖关系,称为dependency line;第二行给出了与该依赖关系相关联的操作,称为command line。
windows makefile编写规则在Windows系统中,可以使用GNU Make工具来编写Makefile。
Makefile是一个文本文件,其中包含一系列规则(rules),用于指定项目的构建过程。
以下是编写Makefile规则的基本规范:1. 每条规则通常包括三个主要部分:目标(target)、依赖(prerequisites)和命令(commands)。
2. 目标是规则要构建的文件名。
它可以是一个单独的文件,也可以是一个虚拟目标(如"clean"),用于执行一系列命令。
3. 依赖是目标所依赖的文件名列表。
当某个目标文件的依赖文件发生变化时,目标就需要重新构建。
4. 命令指示Make工具构建目标的具体操作。
它必须以Tab键开头,紧随目标和依赖之后。
5. 注释可以用#符号开头。
注释可以出现在任何地方,但不能出现在命令之前。
6. 变量允许您定义一些可重用的值,如编译器命令或编译参数。
使用变量可以使Makefile更加易于维护和扩展。
以下是一个简单的Windows Makefile示例:```makefile# 定义变量CC = gccCFLAGS = -Wall# 默认构建目标all: hello.exe# 目标hello.exe依赖于hello.o,执行gcc命令将hello.o链接成可执行文件hello.exehello.exe: hello.o$(CC) $(CFLAGS) -o hello.exe hello.o# 目标hello.o依赖于hello.c,执行gcc命令编译hello.c为目标文件hello.ohello.o: hello.c$(CC) $(CFLAGS) -c hello.c# 清理操作clean:del hello.o hello.exe```在这个示例中,我们定义了两个变量CC和CFLAGS,分别表示编译器和编译参数。
然后,我们使用这些变量来构建目标。
windows下使⽤makefile1. 准备⼯作:程序:MinGW-3.1.0-1.exe windows下的gcc,编译c语⾔的⼯具make 按照makefile规则编译程序的⼯具配置环境: 环境变量配置 :控制⾯板> 系统 >⾼级 >环境变量 >系统变量 >添加MinGW 安装⽬录下的bin⽬录到path中去,或者命令⾏下运⾏:set PATH= MinGW 安装⽬录下的bin⽬录把C:\WINDOWS\system32⽤上边⽅法添加到path中以找到make.exe创建四个⽂件://---------------------------Main.c : ---------------------------//#include "stdio.h"main(){func();printf("this is main\n");getch();}//---------------------------func.c : ---------------------------//#include "stdio.h"func(){printf("this is func\n");getch();}⼀个空⽂件,⽂件名为makefile或者Makefile,这个⽂件名是必须的因为make默认查找该⽂件创建compile.bat⽂件内容为:makecmd2. 编写makefile⽰例:test:main.o func.ogcc -o test main.o func.ofunc.o:func.cgcc -c func.cmain.o:main.cgcc -c main.c1⾏:⽣成test可执⾏⽂件,它的依赖于main.o func.o,也就是说⽣成test你得先⽣成它们,2⾏:gcc前边必须是tab也就是7个空格,表⽰编译⽣成test后边是依赖项的⽣成规则然后运⾏compile.bat就可以⽣成test.exe⽂件了,同时会附加⽣成func.o和main,o两个中间代码的⽂件,类似于VC中的obj⽂件1. 3. makefile的编写规则1. 4. gcc的参数同VC,TC等编译器不同,GCC其实是可以很⽅便的在提⽰符下编译程序的。
makefile文件的显示规则Makefile文件是用于构建和管理软件项目的工具,它定义了一系列规则,用来指导如何编译、链接和安装软件。
在本文中,我们将详细介绍Makefile文件中的显示规则。
一、目标规则(T arget Rule)目标规则是Makefile中最常见的一种规则,它用来指定如何生成一个目标文件。
一个目标规则由目标、依赖和命令组成。
目标是我们要生成的文件,依赖是生成目标文件所需要的其他文件,而命令则是生成目标文件的具体步骤。
例如,我们可以定义一个目标规则来生成一个名为"hello"的可执行文件:```hello: main.o func.ogcc -o hello main.o func.o```在这个例子中,"hello"是目标文件,"main.o"和"func.o"是依赖文件,而命令"gcc -o hello main.o func.o"则是生成目标文件的具体步骤。
二、伪目标规则(Phony T arget Rule)伪目标规则用来指定一些特殊的目标,它们并不是真正的文件,而是一些需要执行的命令。
伪目标规则的目标名前面通常会加上一个"phony"修饰符,以便与真正的文件区分开来。
例如,我们可以定义一个伪目标规则来清理编译生成的文件:```.PHONY: cleanclean:rm -f hello *.o```在这个例子中,".PHONY"表示这是一个伪目标规则,"clean"是目标名,而命令"rm -f hello *.o"则是清理编译生成的文件的具体步骤。
三、模式规则(Pattern Rule)模式规则是一种更加抽象的规则,它可以匹配多个目标文件。
模式规则使用通配符来表示目标和依赖中的文件名模式,并使用"%"来表示匹配的部分。
makefile编写规则 ifeqifeq是Makefile中的一个条件语句,用于判断给定的两个参数是否相等,如果相等则执行后续的指令。
ifeq语句的基本语法如下:ifeq (参数1, 参数2)指令1else指令2endif其中,参数1和参数2可以是任意字符串或者变量。
一般来说,参数1可以是一个Makefile变量的值,参数2可以是一个常量或者字符串。
ifeq语句在Makefile中非常有用,它可以根据不同的条件执行相应的动作,例如选择不同的编译器、设置不同的编译选项等。
下面是一个具体的例子,展示了如何使用ifeq语句:```Makefileifeq ($(CC), gcc)CFLAGS += -std=c99elseCFLAGS += -std=c11endififeq ($(OS), Windows_NT)RM = del /f /qelseRM = rm -fendifall:$(CC) $(CFLAGS) -o program program.cclean:$(RM) program```在上面的例子中,我们使用ifeq语句判断变量$(CC)的值是否为"gcc",如果是则给变量CFLAGS添加编译选项"-std=c99",否则添加"-std=c11"。
这样就能根据不同的编译器选择不同的编译选项。
另外,我们还使用ifeq语句判断变量$(OS)的值是否为"Windows_NT",如果是则将删除文件的命令设置为"del /f /q",否则设置为"rm -f"。
这样就能在不同的操作系统上使用相应的删除命令。
最后,我们定义了两个目标,分别是"all"和"clean"。
"all"目标使用$(CC)编译$(CFLAGS)选项将program.c文件编译为可执行程序"program";"clean"目标使用$(RM)命令删除"program"文件。
Makefile 是一种用来管理软件编译过程的工具,它通过定义一系列目标和规则来自动化编译过程。
在软件开发过程中,Makefile 扮演着非常重要的角色,能够提高编译效率,减少人为错误,并且方便维护代码。
下面将从 makefile 的概念、目标、规则三个方面展开讨论。
一、 makefile 的概念1. 什么是 makefileMakefile 是一个包含一系列规则的文件,用来指示 make 命令如何编译和信息程序。
它描述了每个文件的依赖关系和编译规则,使得整个工程的编译过程更加自动化和可靠。
2. makefile 的作用Makefile 主要用于管理软件项目的构建过程,它能够根据代码的更新情况自动判断哪些文件需要重新编译,从而减少不必要的编译时间。
makefile 也可以定义一些通用的编译规则,方便在不同的开发环境下使用。
二、 makefile 的目标1. 目标是什么在 makefile 中,目标是指我们要生成的文件或者执行的动作。
它可以是一个可执行文件,也可以是一个中间文件或者一个操作。
2. 如何定义目标在 makefile 中,我们可以使用下面的语法来定义一个目标:```target: dependencies[tab]mand```其中,target 表示目标文件或动作名称,dependencies 表示该目标依赖的文件或动作mand 则是执行该目标时所需要执行的命令。
三、 makefile 的规则1. 规则的作用规则是指在 makefile 中定义的编译规则,它描述了如何将源文件编译成目标文件的过程。
在 makefile 中,规则通常包含了依赖关系和具体的编译命令。
2. 规则的语法在 makefile 中,我们可以使用下面的语法来定义一个规则:```target: dependencies[tab]mand```其中,target 表示目标文件,dependencies 表示该目标依赖的文件mand 则是执行该目标时所需要执行的命令。
下的编写(三)推理规则作者:推理规则是中自动化的核心功能之一,掌握了推理规则会让的编写更简单和更易维护。
推理规则推理规则提供命令来更新目标并推理目标的依赖项。
推理规则是用户自定义的或者是预定义的,预定义的推理规则可以被重新定义。
定义规则是依赖文件的扩展名,是目标文件的扩展名。
在依赖文件扩展名前面的号必须被放在行首。
在应用了推理规则之后,可以简单地写为在命令行下的输出结果如下:由此可以看出来,推理规则已经从目标文件自动推导出相应的文件,并且为每一个目标执行一次编译命令。
上述的推理规则叫做标准推理规则,标准推理规则会被调用多次。
在文件数量很多的时候,这样显然会降低速度,为此在及以后的版本中,还定义了批模式规则。
当条命令通过推理规则时,批模式推理规则只调用一次该推理规则。
如果没有批模式推理规则,将需要调用条命令。
是触发推理规则的依赖项的数目。
由于较低版本的不支持批模式推理规则,所以在使用批模式规则时最好先检查一下当前的版本:_NMAKE_VER 宏可以返回当前nmake的文件版本,返回的是一个字符串文本。
批模式和标准模式唯一的差异就是在目标后多加上一个冒号:样在编译期间只会被调用一次,相对于多次调用速度要快。
需要注意的一个地方是:由于一次处理多个文件,这就得要求执行命令的程序本身支持处理多个文件,假如一次只能处理单个源文件,那么使用批模式肯定会导致失败。
在上面的例子中,目标文件和依赖文件都没有指定路径,所以默认使用当前目录。
如果目标文件或者依赖文件不在当前目录下,就需要为其指定搜索路径:大括号是必须的,且每个扩展名只能指定一个目录路径,(空的大括号)表示当前目录。
在执行命令之前目录必须存在,否则编译命令将失败。
命令成功执行后,会在目录下生成文件,最终的可执行文件生成在当前目录下。
为了能更好的理解上面的推理规则,可以将上面的宏进行展开:最后需要说明的是,在批模式下,必须使用宏来指定依赖文件项目。
如果你理解了宏,预处理和推理规则,那么已经可以阅读大多数下开源项目的文件了,并且已经可以自己写出实用的。
makefile的模式规则-回复什么是makefile的模式规则?为什么我们需要它们?如何定义模式规则?如何使用模式规则?这些问题将在下文中一步一步回答。
首先,让我们来解释一下什么是makefile的模式规则。
模式规则是一种特殊类型的规则,用于告诉make工具如何生成目标文件。
它们通常用于编译源代码文件,例如C或C++文件,以及生成执行文件或库文件。
模式规则可以根据文件名模式来匹配源文件,并指定相应的命令来生成目标文件。
通过使用模式规则,我们可以减少重复的工作,提高编译的效率。
接下来,让我们来探讨一下为什么我们需要makefile的模式规则。
在大型软件项目中,通常有许多个源代码文件,这些文件需要编译为目标文件,并最终链接为可执行文件或库文件。
手动编译每个源文件是非常繁琐且容易出错的。
此外,当我们进行代码修改时,只需要重新编译修改的源文件以及相关依赖文件,而不是重新编译整个项目。
模式规则能够自动识别哪些文件需要重新编译,并执行相应的编译命令,从而提高了开发效率和编译速度。
现在让我们来看一下如何定义模式规则。
在makefile中,模式规则由三部分组成:目标模式、依赖模式和命令。
目标模式指定了生成的目标文件的格式,依赖模式指定了源文件的格式,而命令则用于生成目标文件。
目标模式和依赖模式都可以包含通配符,通配符有“”和“”符号。
通配符“”表示匹配任意字符,而通配符“”表示从目标模式中提取的字符。
通过使用通配符,我们可以定义一个模式规则,以匹配多个源文件,并生成对应的目标文件。
下面让我们看一个具体的例子来理解如何使用模式规则。
假设我们有一个项目,包含多个C源代码文件(例如main.c、util.c和helper.c),我们想要将它们编译成目标文件,并最终链接为一个可执行文件。
我们可以使用模式规则来自动生成编译和链接的规则,而不需要手动指定每个源文件的目标文件和命令。
.o: .cgcc -c < -omain: main.o util.o helper.ogcc ^ -o在上面的例子中,我们定义了一个模式规则来编译C源文件为目标文件。
下的编写(三)推理规则
作者:
推理规则是中自动化的核心功能之一,掌握了推理规则会让的编写更简单和更易维护。
推理规则
推理规则提供命令来更新目标并推理目标的依赖项。
推理规则是用户自定义的或者是预定义的,预定义的推理规则可以被重新定义。
定义规则
是依赖文件的扩展名,是目标文件的扩展名。
在依赖文件扩展名前面的号必须被放在行首。
在应用了推理规则之后,可以简单地写为
在命令行下的输出结果如下:
由此可以看出来,推理规则已经从目标文件自动推导出相应的文件,并且为每一个目标执行一次编译命令。
上述的推理规则叫做标准推理规则,标准推理规则会被调用多次。
在文件数量很多的时候,这样显然会降低速度,为此在及以后的版本中,还定义了批模式规则。
当条命令通过推理规则时,批模式推理规则只调用一次该推理规则。
如果没有批模式推理规则,将需要调用条命令。
是触发推理规则的依赖项的数目。
由于较低版本的不支持批模式推理规则,所以在使用批模式规则时最好先检查一下当前的版本:
_NMAKE_VER 宏可以返回当前nmake的文件版本,返回的是一个字符串文本。
批模式和标准模式唯一的差异就是在目标后多加上一个冒号:
样在编译期间只会被调用一次,相对于多次调用速度要快。
需要注意的一个地方是:由于一次处理多个文件,这就得要求执行命令的程序本身支持处理多个文件,假如一次只能处理单个源文件,那么使用批模式肯定会导致失败。
在上面的例子中,目标文件和依赖文件都没有指定路径,所以默认使用当前目录。
如果目标文件或者依赖文件不在当前目录下,就需要为其指定搜索路径:
大括号是必须的,且每个扩展名只能指定一个目录路径,(空的大括号)表示当前目录。
在执行命令之前目录必须存在,否则编译命令将失败。
命令成功执行后,会在
目录下生成文件,最终的可执行文件生成在当前目录下。
为了能更好的理解上面的推理规则,可以将上面的宏进行展开:
最后需要说明的是,在批模式下,必须使用宏来指定依赖文件项目。
如果你理解了宏,预处理和推理规则,那么已经可以阅读大多数下开源项目的文件了,并且已经可以自己写出实用的。
剩下的就是多加练习,试着为向导生成的项目编写,多尝试几次之后你会发现原来很简单。