MakeFile
make makefile 的参数
make makefile 的参数
make是一个常用的构建工具,用于自动化编译和构建软件项目。makefile是make工具的配置文件,用于描述项目的构建规则和依赖关系。本文将介绍makefile的参数,包括常用的参数及其用法。
一、常用参数及其用法
1. -f 文件名:指定makefile的文件名,默认为"makefile"或"Makefile"。通过该参数,可以使用其他名称的makefile文件。
2. -C 目录:指定make命令的工作目录。在执行make命令时,会切换到指定的目录,并在该目录下查找makefile文件进行构建。
3. -n:显示执行make命令时的操作,但不实际执行。通过该参数,可以预览make命令的执行过程,检查构建规则是否正确。
4. -p:显示make命令的内置变量和规则。通过该参数,可以查看make命令的内部工作机制,了解makefile文件的编写规则和使用方法。
5. -B:强制重新构建目标文件。通过该参数,可以忽略文件的时间戳,强制重新执行构建规则,生成新的目标文件。
6. -j 并发数:指定make命令的并发执行数。通过该参数,可以提高构建速度,同时执行多个任务。
7. -s:静默模式,不显示执行的命令。通过该参数,可以减少输出信息,使构建过程更加清晰。
二、makefile的构建规则
makefile由一系列构建规则组成,每个规则定义了目标文件、依赖文件和构建命令。make命令根据构建规则,自动判断需要更新的文件,并执行相应的构建命令。
构建规则的基本格式如下:
目标文件: 依赖文件
makefile 静态模式规则
makefile 静态模式规则
摘要:
1.Makefile 简介
2.静态模式规则的概念
3.静态模式规则的语法
4.静态模式规则的实例
5.静态模式规则的应用场景
6.静态模式规则的注意事项
正文:
Makefile 是Linux 和Unix 系统中最常用的构建工具,它可以自动化执行编译、链接、安装等操作。在Makefile 中,静态模式规则是一种特殊的规定,用于描述目标文件与依赖文件之间的关系。静态模式规则使得Makefile 更加简洁和高效。
静态模式规则的概念是指在Makefile 中,用简洁的文本描述目标文件和依赖文件之间的依赖关系。这种规则通常以“:”或“=”作为分隔符,将目标文件和依赖文件分开。例如,如果目标文件“target”依赖于文件“dependency”,可以使用如下静态模式规则表示:
```
target: dependency
```
静态模式规则的语法包括两部分:目标文件和依赖文件。目标文件是
Makefile 要生成的文件,依赖文件是生成目标文件所需要的文件。目标文件和依赖文件之间用冒号(:)或等号(=)分隔。
静态模式规则的实例可以帮助我们更好地理解这一概念。例如,假设我们有一个名为“main.o”的目标文件,它依赖于“main.c”和“header.h”两个文件。在Makefile 中,我们可以使用静态模式规则表示为:
```
main.o: main.c header.h
```
静态模式规则的应用场景包括编译、链接和安装等操作。在编译过程中,Makefile 可以根据静态模式规则自动生成目标文件;在链接过程中,Makefile 可以根据静态模式规则自动链接目标文件和依赖文件;在安装过程中,Makefile 可以根据静态模式规则自动安装目标文件。
makefile输出总结
makefile输出总结
【原创版】
目录
1.Makefile 简介
2.Makefile 的输出
3.Makefile 输出的格式
4.Makefile 输出的优点
5.总结
正文
1.Makefile 简介
Makefile 是一种构建脚本,用于自动化构建和编译软件项目。它通常包含一系列的规则和指令,用于描述项目的构建过程。Makefile 最早用于 Unix 系统,但现在已经广泛应用于各种操作系统和编程语言中。
2.Makefile 的输出
Makefile 的输出是指在执行 Makefile 后,系统生成的文件或结果。这些输出通常包括编译后的目标文件、可执行文件和库文件等。Makefile 的输出可以帮助开发者快速了解项目的构建状态,以便进行调试和测试。
3.Makefile 输出的格式
Makefile 的输出格式通常遵循一定的规范,例如在输出文件名前加上“@”符号,表示该文件是由 Makefile 生成的。另外,Makefile 还可以通过设置输出变量,来控制输出的格式和内容。
4.Makefile 输出的优点
Makefile 输出的优点主要体现在以下几个方面:
(1)自动化:Makefile 可以自动化执行构建过程,提高开发效率。
(2)可维护性:Makefile 可以将项目的构建过程描述得非常清晰,便于维护和修改。
(3)可扩展性:Makefile 可以通过调用其他脚本和程序,来实现更复杂的构建逻辑。
(4)跨平台性:Makefile 可以在各种操作系统和编程语言中使用,具有一定的通用性。
5.总结
总之,Makefile 是一种非常实用的构建脚本工具,可以帮助开发者自动化项目的构建过程,提高工作效率。
makefile中ifdef的用法
makefile中ifdef的用法
题目: makefile中的ifndef的用法
一、什么是makefile?
Makefile是一种用来管理和构建项目的文件,它由一系列的规则组成,指定了如何编译和链接源代码以生成最终的可执行文件或库文件。Makefile通常用于源代码非常复杂或需要跨平台构建的项目。
二、makefile的条件编译
在编写makefile时,我们经常需要根据不同的条件执行特定的编译选项或构建命令。条件编译是通过使用预处理指令来实现的。makefile支持两种常用的条件编译指令:ifdef和ifndef。
三、ifndef指令的用法
ifndef是"if not defined"的缩写,用于检查某个变量是否已定义。如果该变量未定义,就执行ifdef指令中的一组命令。
在makefile中,我们可以使用ifndef指令来检查环境变量、宏定义或其他makefile中定义的变量是否已定义。如果未定义,我们可以执行一组命令来设置默认值或终止构建。
以下是ifndef指令的基本语法:
ifndef variable_name
command1
command2
...
endif
四、ifndef指令的示例
下面以一个简单的示例来说明ifndef指令的用法。
假设我们正在构建一个C语言项目,并且希望根据操作系统的类型设置不同的编译选项。在这种情况下,我们可以使用ifndef指令来检查操作系统的环境变量,并根据其值设置不同的编译选项。
以下是一个makefile的示例:
ifndef OS
(error The OS variable is not defined!)
makefile文件语法
makefile文件语法
Makefile是一种用于自动化构建过程的工具,它使用一种特定的语法来定
义构建规则和依赖关系。下面是一些Makefile的基本语法规则:
1. 目标(Target):目标是指要构建的程序或文件。它通常以冒号(:)开头,后面跟着一个或多个依赖项(dependencies)。
```makefile
target: dependencies
commands
```
2. 依赖项(Dependencies):依赖项是指要构建目标所必需的文件或目标。在Makefile中,依赖项以空格分隔。
3. 命令(Commands):命令是指在构建目标时执行的命令行指令。这些
命令可以是编译、链接或其他任何必要的操作。
4. 变量(Variables):Makefile允许使用变量来存储值,以便在构建过程中重复使用。变量以符号开头,后面跟着变量名。
```makefile
VAR = value
```
5. 模式规则(Pattern Rules):模式规则允许根据文件模式匹配来构建目标。它们使用通配符来匹配文件名,并在匹配的文件上执行相应的命令。
```makefile
targets : pattern
commands
```
6. 条件语句(Conditionals):Makefile支持条件语句,可以根据条件执行不同的命令或规则。条件使用ifdef、ifndef、ifeq等关键字定义。
7. 注释(Comments):Makefile使用井号()作为注释标记,任何在该符号之后的内容都会被视为注释,并被忽略。
makefile的模式规则
Makefile中的模式规则是一种特殊的规则,它允许你使用模式来匹配目标文件,然后根据匹配结果执行相应的命令。模式规则中的目标文件名包含一个模式字符“%”,该字符可以匹配任何非空字符串。
在模式规则中,目标文件是一个带有模式字符“%”的文件,使用模式来匹配目标文件。一旦依赖目标中的“%”模式被确定,make 会被要求去匹配当前目录下所有的文件名,一旦找到,make就会执行规则下的命令。
在模式规则中,目标可能会是多个的,如果有模式匹配出多个目标,make就会产生所有的模式目标。此时,make关心的是依赖的文件名和生成目标的命令这两件事。
以下是一个简单的Makefile模式规则示例:
```makefile
%.o : %.c
$(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@
```
这个规则表示将所有的.c文件编译成.o文件。其中,“$<”表示了所有依赖目标的挨个值,“$@”表示了所有目标的挨个值。这些自动化变量将在后面的章节中详细讲述。
总的来说,Makefile的模式规则是一种强大的工具,它可以根据文件名模式自动构建目标文件,并执行相应的命令。
makefile编译流程
makefile编译流程
Makefile是一种用于自动化编译的工具,它可以根据源代码文件的依赖关系自动编译出目标文件。Makefile的编写需要遵循一定的规则和语法,下面将介绍Makefile的编译流程。
1. 编写Makefile文件
Makefile文件是一个文本文件,其中包含了编译的规则和依赖关系。在编写Makefile文件时,需要遵循一定的语法规则,如使用TAB键缩进、使用变量和函数等。
2. 执行make命令
在Makefile文件所在的目录下执行make命令,make会自动读取Makefile文件,并根据其中的规则和依赖关系进行编译。如果Makefile文件中没有指定目标,则默认编译第一个目标。
3. 分析依赖关系
在执行make命令时,make会先分析Makefile文件中的依赖关系,确定哪些文件需要重新编译。如果某个源文件被修改了,那么与之相
关的目标文件也需要重新编译。
4. 编译源文件
在确定需要重新编译的文件后,make会依次编译每个源文件,生成对应的目标文件。编译过程中,make会根据Makefile文件中的规则和命令进行编译。
5. 链接目标文件
在所有的源文件都编译完成后,make会将所有的目标文件链接起来,生成最终的可执行文件。链接过程中,make会根据Makefile文件中的规则和命令进行链接。
6. 完成编译
当所有的源文件都编译完成并链接成功后,make会输出编译成功的信息,并生成最终的可执行文件。如果编译过程中出现错误,make会输出错误信息并停止编译。
总之,Makefile编译流程是一个自动化的过程,它可以大大提高编译的效率和准确性。在编写Makefile文件时,需要注意语法规则和依赖关系,以确保编译过程的正确性。
大型项目makefile写法
大型项目makefile写法
1. 介绍
在大型软件项目中,为了方便管理和构建代码,通常会使用makefile 来编写构建规则。makefile是用于告诉make命令如何编译和信息程序的文件,它包含了一系列的规则和依赖关系,可以帮助开发人员自动化地构建项目。
2. makefile的基本语法
在编写makefile时,需要了解其基本语法。makefile由一系列规则组成,每个规则包括一个目标、一个或多个依赖项和一组命令。其中,目标是规则的执行目标,依赖项是目标的依赖文件或者其他目标,命令是执行规则时需要执行的命令。
3. makefile的变量和函数
makefile中可以定义变量和函数,以方便代码的重用和管理。变量可以用来存储一些常量或者路径,函数可以用来进行一些复杂的操作。在大型项目中,合理使用变量和函数可以使makefile更加清晰易读。
4. makefile的高级用法
除了基本的规则、变量和函数外,makefile还支持一些高级用法,比如模式匹配、自动变量等。这些高级用法可以进一步简化构建规则的编写,提高代码的复用性和可维护性。
5. 大型项目makefile的最佳实践
在大型项目中,makefile的写法需要遵循一些最佳实践,比如分模块编写、合理使用变量和函数、注意依赖关系的确定等。这些实践可以帮助开发人员更好地管理和构建项目,减少出错的可能性。
6. 总结
通过合理编写makefile,可以使大型项目的管理和构建变得更加高效和可靠。在编写makefile时,需要注意其基本语法、变量和函数的使用,以及一些高级用法和最佳实践,从而使makefile更加清晰易读、易于维护。7. makefile的模块化编写
makefile规则
makefile规则
makefile规则是指在编译和链接源程序时使用的指令说明集合,
它主要实现对源程序进行编译和链接操作。
makefile规则通常包括定义、变量( macro )、条件语句、文件
名模式、关系性质,以及各种命令的执行。
定义是指在 makefile 中定义一些环境变量,这样可以同时供
make 命令和源程序使用。变量就是把变量名称定义为字符内容或者字
符串。
条件语句是指在 makefile 中可以使用 if-then-else 语句条件
判断,实现对不同平台的兼容和不同编译器的支持。
文件名模式是指在 makefile 中,可以使用文件名模式来精确针
对特定文件和目录,完成不同操作。
关系性质是指 makefile 支持多个文件之间的依赖关系,即如果
文件 A 依赖于文件 B,当文件 B 的内容发生变化时,系统自动执行
文件 A 的操作。
makefile 还支持各种命令的执行,包括编译、链接、拷贝、安装
等操作。通过这些命令的执行,可以非常方便地把源程序编译和链接,实现最终的编译和链接结果。
通常,makefile 规则是由多个项目构成的,每一项都有一个名称,每一个项目都可以包含一些变量,关系和命令等,用于指定 make 命
令的行为。每个规则以一个制表符开头,然后是目标文件、依赖文件、变量名和命令,分别以冒号、逗号、空格和分号等符号隔开。
每个 makefile 都有一个默认的目标,如果在编译和链接时没有
指定特定的目标,则 make 命令会执行默认的目标。因此,完整的makefile 是必须设置默认目标的,才能在执行 make 命令时得到正确
makefile gcc编译
makefile gcc编译
Makefile 是一个用来组织代码编译的工具,而 GCC 是一个常用的 C 和 C++ 编译器。在 Makefile 中使用 GCC 进行编译可以通过以下步骤完成:
1. 创建一个名为 "Makefile" 的文本文件,并确保它位于你的项目根目录下。
2. 在 Makefile 中定义你的编译规则。例如,假设你有一个名为 "main.c" 的源文件需要编译成可执行文件 "app",你可以这样编写 Makefile:
make.
app: main.c.
gcc -o app main.c.
在这个例子中,我们定义了一个名为 "app" 的目标,它依赖于"main.c" 这个源文件。当你运行 "make" 命令时,Make 工具会根
据这个规则来执行编译。
3. 打开终端,进入到包含 Makefile 的项目目录下。
4. 运行命令 "make"。Make 工具会读取 Makefile 文件,并执行其中定义的编译规则。在这个例子中,它会使用 GCC 编译器来编译 "main.c" 并生成可执行文件 "app"。
需要注意的是,Makefile 可以包含更复杂的规则和变量定义,以及支持多个源文件的编译。你可以根据你的项目需求来进一步扩展和定制 Makefile 文件。
总之,通过合理编写 Makefile 并结合使用 GCC 编译器,你可以高效地组织和管理你的代码编译过程。
简述Makefile文件的格式
简述Makefile文件的格式
Makefile文件是一种常见的文本文件,用于描述一个项目中各个文件之间的依赖关系和编译规则。Makefile文件通常由一系列规则组成,每个规则由一个目标、依赖关系和命令组成。
Makefile文件的格式如下:
1. 目标(Target)
目标是指需要生成的文件或者执行的操作。在Makefile中,目标通常是一个可执行程序或者一个库文件。目标的格式为:
target: dependencies
command
其中,target表示目标名称,dependencies表示该目标所依赖的其他文件或者操作,command表示生成该目标所需要执行的命令。
2. 依赖关系(Dependencies)
依赖关系指该目标所依赖的其他文件或者操作。在Makefile中,可以
通过在目标后面加上冒号(:)来定义该目标所依赖的其他文件或者操作。多个依赖关系之间可以使用空格或者Tab键来进行分隔。
3. 命令(Command)
命令是指生成该目标所需要执行的具体操作。在Makefile中,可以通过在每个规则后面添加一行以Tab键开头的命令来定义具体操作。
4. 变量(Variables)
变量是指用于存储各种编译参数和路径等信息的变量。在Makefile中,可以通过使用$()符号来引用变量,并使用=符号来进行赋值操作。例如:
CFLAGS = -Wall -O2
CC = gcc
target: dependencies
$(CC) $(CFLAGS) -o target dependencies
5. 注释(Comments)
makefile编译规则
makefile编译规则
Makefile编译规则
一、引言
在软件开发过程中,编译是将源代码转化为可执行文件或者库文件的重要步骤。为了简化编译过程,提高开发效率,我们可以使用Makefile来管理和自动化编译过程。Makefile是一个文本文件,其中包含一系列的规则,用于描述源文件之间的依赖关系和编译操作。
二、Makefile基本语法
1. 目标(T arget)
Makefile中的目标是指我们希望生成的文件,可以是可执行文件、库文件或者中间文件等。目标一般以文件名表示,可以包含路径信息。
2. 依赖(Prerequisites)
依赖是指目标生成所依赖的文件或者其他目标。当依赖文件发生变化时,Make会自动重新编译相关的目标。
3. 规则(Rule)
规则是Makefile中最重要的部分,用于描述目标和依赖之间的关系,
以及如何生成目标文件。规则的基本语法如下:
```
target: prerequisites
command
```
其中,target表示目标文件,prerequisites表示依赖文件或者其他目标,command表示生成目标文件的命令。
4. 变量(Variable)
Makefile中的变量用于存储和传递数据,可以是字符串、路径、命令等。变量的定义使用“=”或者“:=”,例如:
```
CC = gcc
CFLAGS = -Wall -O2
```
变量的使用使用“$”符号,例如:
```
$(CC) $(CFLAGS) -o target source.c
```
5. 通配符(Wildcard)
通配符可以帮助我们查找符合某种模式的文件,常用的通配符包括“*”和“?”。例如,我们可以使用以下命令查找所有的.c文件:
makefile的工作原理
makefile的工作原理
Makefile是软件开发中常用的构建工具,它可以根据项目中的依赖关系和规则来自动化构建和管理项目。下面是Makefile的工作原理的详细解释,分为以下步骤:
1. 读取Makefile:Makefile是一个文本文件,记录了项目中的目标、依赖关系和构建规则。在使用make命令时,系统会读取当前目录下的Makefile文件。
2. 解析目标和依赖关系:Makefile中的每一行都由目标和依赖关系组成。解析器会解析这些目标和依赖关系,并将它们保存在内部数据结构中,以便后续使用。
3. 检查目标是否需要重新构建:构建过程中,Makefile会检查目标文件和依赖文件的时间戳,来确定是否需要重新构建。如果目标文件不存在、依赖文件的时间戳比目标文件新,或者依赖文件有更新,则需要重新构建目标。
4. 构建目标:如果目标需要重新构建,Makefile会执行相关的构建规则。构建规则由一系列命令组成,用于编译源代码、链接目标文件等。Makefile会按照规则中定义的顺序依次执行这些命令,完成目标的构建。
5. 更新目标的时间戳:构建完成后,Makefile会更新目标文件的时间戳,以便下一次构建时进行比较。
6. 检查下游目标:构建完成一个目标后,Makefile会检查该目标是否是其他目标的依赖。如果是,则会重复步骤3-5,以构建下游目标。
7. 构建完成:当所有目标都构建完成后,Makefile会退出。
Makefile的工作原理基于依赖关系和规则,通过检查目标和依赖文件的时间戳来确定是否需要重新构建。这种方式可以提高软件开发的效率,避免不必要的重复构建。同时,Makefile还可以支持并行构建,提高构建速度。
makefile的规则和编写方法
makefile的规则和编写方法
Makefile是一种文本文件,它包含了一系列规则和命令,用于描述源代码的编译和构建过程。Makefile的规则和编写方法对于项目的管理和维护非常重要。下面是关于Makefile规则和编写方法的一些要点:
1. 目标(Targets):
每个Makefile中都应该定义一个或多个目标。目标通常代表项目中的某个文件、可执行程序或者一个任务。在Makefile中,目标的名称应该在冒号(:)后面给出,并且每个目标都应该独占一行。
2. 依赖(Dependencies):
在Makefile中,每个目标通常都会依赖于其他文件或目标。依赖关系表示了一个文件或目标的生成所依赖的其他文件或目标。依赖关系可以使用冒号(:)来表示,冒号前是目标名称,冒号后是该目标所依赖的文件或目标。
3. 命令(Commands):
在Makefile中,每个目标都需要定义一个或多个命令,用于生成该目标所描述的文件或任务。每个命令需要以制表符(Tab)开头,紧随其后的是具体的操作指令,如编译命令、链接命令等。命令之间可以使用换行符进行分隔。
4. 变量(Variables):
在Makefile中,可以使用变量来存储常用的数值、目录路径或者编译器选项等信息。变量可以使用等号(=)或冒号等号(:=)进行赋值。通过使用变量,可以大大简化Makefile的编写和维护过程。
5. 注释(Comments):
注释用于解释Makefile中的规则和命令,以提高代码的可读性。在Makefile 中,可以使用井号(#)表示注释,井号后的内容会被忽略。
Makefile
计算机领域术语
目录
01 定义
03 自动化编译
02 示例 04 主要功能
一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规 则来指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作, 因为 makefile就像一个Shell脚本一样,也可以执行操作系统的命令。
主要功能
Make工具最主要也是最基本的功能就是通过makefile文件来描述源程序之间的相互关系并自动维护编译工作。 而makefile文件需要按照某种语法进行编写,文件中需要说明如何编译各个源文件并连接生成可执行文件,并要 求定义源文件之间的依赖关系。makefile文件是许多编译器--包括 Windows NT下的编译器--维护编译信息的常 用方法,只是在集成开发环境中,用户通过友好的界面修改 makefile文件而已。
谢谢观看
百度文库
定义
概述
Linux环境下的程序员如果不会使用GNU make来构建和管理自己的工程,应该不能算是一个合格的专业程序 员,至少不能称得上是 Unix程序员。在 Linux(unix )环境下使用GNU的make工具能够比较容易的构建一个属 于你自己的工程,整个工程的编译只需要一个命令就可以完成编译、连接以至于最后的执行。不过这需要我们投 入一些时间去完成一个或者多个称之为Makefile文件的编写。
makefile 语法
makefile 语法
Makefile是一种常用的构建工具,用于自动化构建和管理软件项目。它是一种文本文件,包含一系列规则,用于指定如何编译、链接和构建源代码。本文将介绍 Makefile 的语法和使用方法。
一、Makefile 的基本语法
Makefile 文件由一系列规则组成,每个规则由一个目标和一个或多个依赖项组成。目标是要生成的文件名,依赖项是生成目标所需要的文件或命令。当目标文件不存在或依赖项的时间戳比目标文件的时间戳更晚时,Makefile 将自动执行规则中的命令,生成目标文件。
一个简单的 Makefile 示例:
```
hello: main.c
gcc -o hello main.c
```
这个 Makefile 包含了一个规则,目标是 hello,依赖项是main.c。当 main.c 文件的时间戳比 hello 文件的时间戳更晚时,Makefile 将执行 gcc 命令编译 main.c 文件,并生成可执行文件hello。
Makefile 的规则语法如下:
```
target: dependencies
command1
command2
...
```
其中,target 是规则的目标,dependencies 是规则的依赖项,command1、command2 等是要执行的命令。命令必须以一个制表符或多个空格开头,否则 Makefile 将无法识别。
二、Makefile 的变量
Makefile 中可以定义变量,用于存储常用的值或命令。变量以$ 符号开头,可以在规则中使用。变量的定义语法如下:
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MAKE 的使用
当编译单个文件时,使用GCC已经绰绰有余,但对于有几十个甚至上百个源文件的大工程来讲,单纯用GCC命令进行编译肯定就不行了,那样编译一次太麻烦,这就要求有一种自动化的方法,于是在Linux系统中Make工具就诞生了。
1、什么是Make makefile shell
什么是Make,可以将Make理解为一种脚本,这种脚本主要是用于多文件编译,在传统的命令行式编译方式中,如果修改了工程中的某一个头文件,有时候不需要重新编译整个工程,而只需要编译与这个头文件相关联的源文件即可,但如何以手动的方式从一个大工程里将这些文件找出,并手动编译,是件很麻烦的事情。
为了解决这一问题,设计了Make,make程序可以维护具有相互依赖性的源文件,当某些文件发生改变时,它能自动识别出,并只对相应文件进行自动编译。
虽然make工具有很多智能识别机制,但它无法自动了解他所面对的工程源文件的组成以及依赖规则,这些都需要开发人员编写makefile脚本,告诉make工具。MakeFile编写好以后,就可以在每次修改源文件之后,执行make命令就好了。Makefile make 什么又是makefile了,很多windows的程序开发人员都不知道这个东西,因为那些Windows的IDE都为你做了这些工作,但我觉得要作为一个好的和专业的程序员,makefile还是要懂得,这就好像在有这么多的HTML的编辑器,但如果你想成为一个专业人士,就必须了解HTML的标识的含义。特别在Linux下的软件编译,你就必须自己写makefile了,会不会写makefile,从一个侧面说明了一个人是否具备完成某个大型大工程的能力。
2、makefile的组成
一个完整的makefile文件通常由五个部分组成:
◆显示规则
显示规则是指主动编写描述规则,用于指示在何种状态下更新哪些目标文件,即编写makefile时需要明确指出各目标文件所依赖的源文件的集合,以及编
译本目标文件所需的命令。
◆隐含规则
指用make中默认的编译方式进行编译,即make工具可以根据目标文件的类型自动推导出的规则(由于我们的make有自动推导的功能,所以隐晦的规则可以
让我们比较粗糙地简略书写Makefile ,这是由make所支持的)
abc.o abc.c cc -o abc.o -c abc.c
◆变量定义
为提升语句的灵活性,在make脚本中可以使用变量,来代表一个字符串,一组编译命令或一组文件名。(在makefile 中我们要定义一系列的变量,变量一般都是字符串,这个有点类似于C语言中的宏,当makefile 被执行时,其中的变量都会被扩展到相应的引用位置上)
◆makefile指示符
指示符告诉make工具,当程序在读取makefile文件时要执行的动作。
(文件指示包括三部分,一个是在一个makefile中引用另外一个makefile,就像C语言中的include一样,另一个是指根据某些情况制定MakeFile中的有效部分,就像C 语言中的预编译#if一样,还有就是定义一个多行的命令,)
◆注释
Makefile中将#作为注释标识符
【注】如果此行的第一个非空字符为#,则此行为注释
如果此行的结尾存在一个反斜杠(\),则下一行也被视为注释行
如果在代码中需要使用字符#,就要使用转义字符\#来表示此字符并非
一个注释符
3、makefile的基本语法
makefile主要由规则组成,即编写makefile要遵循一定的规则,在makefile中规则是用于描述在何种状态下,用何种命令创建何种文件。
一条makefile的规则原型:
Target … : dependency…
…
…
◆Target代表目标文件,既可以是一个目标代码文件,也可以是一个可执行文件,
还可以是一个伪目标
◆Dependency代表生成上述目标文件所需要的文件(即依赖文件)
◆Command代表响应命令,即由依赖文件生成目标文件所需要的命令
【注意】规则中的命令必须以Tab键开头,make 工具会将所有以Tab键开头的行当成命令交给shell 执行。
为方便阅读,对于一个较长的命令行可以书写到多行上,注意行与行之间要
用“\”链接。
在makefile中,规则主要包括两部分,一是依赖关系,一是生成目标的方法。
其中规则的顺序很重要,因为,makefile中只应该有一个最终目标,其他的目标都是
被这个目标所连带出来的,所以一定要让make知道你的最终目标是什么,一般来说,定义在Makefile中的目标可能会很多,但是第一条规则中的目标将被确立为最终的目标,如果第一条规则中目标有多个,那么,第一个目标将会成为最终目标,make所要完成的也就是这个目标。
4、Makefile变量
相比于C语言,Makefile中的变量更像C语言中的宏定义。在引用变量的地方,变量会被其定义的数据所代替。
1、变量的定义
◆递归展开式变量
递归展开式变量是通过“=”或“define”定义的,它的展开是在引用时严格的字符
串或数字的替换。
◆直接展开式变量
在变量的定义时就完成对其引用变量的展开,就确定了引用变量的值,这个值
不会随着其他变量的变化而变化。
2、变量的引用
定义了一个变量之后,就可以在很多地方使用它,变量的引用方式是:$(V AR_NAME)或者${V AR_NAME}
对于一些简单变量的引用,也可以不用括号进行变量名德标记就可以直接使
用,但此类型的引用方式只是用于变量名为单个字符的情况,当变量名为多个
字符而不加括号时,实际引用的是以变量名第一个字符为变量名德变量,为了
不造成混乱,建议所有的变量引用都加上括号。
五、Make的执行
1、make的执行原理
针对于makefile的原型表达式中,target这一个或多个的目标文件依赖于Dependency中的文件,其生成规则定义在Command中,说白一点就是,
dependency中如果有一个以上的文件比target文件要新的话,Command所定义
的命令就会被执行,这是makefile的规则,也是makefile中最核心的内容。
2、指定makefile文件
默认情况下,make会在当前的工作目录下搜索MakeFile文件,并读取、执行
MakeFile文件,查找顺序为:makefile、MakeFile。如果当前工作目录下没有找
到上述两个文件中的任何一个,Make将不读取任何文件,而可以通过命令行指
定一个目标,如果当前工作目录下存在符合此目标的依赖文件,则采用默认的
命令创建或更新目标文件。
Make –f Filename Or make –file FileName
3、使用make进行编译测试
Make在执行MakeFile时,如果出现命令执行错误,就会立即停止执行,也就
是说错误发生之后的命令将不会被执行。
Make –k Or make –keep-going
六、伪目标
伪目标并不代表一个真正的文件名,在执行make时,可以通过指定一个伪目
标来执行其所在规则中定义的命令。
有时候也将伪目标称为标签,经常会定义一个伪目标clean,用于清理工程编译
的文件:
Clean:
Rm *.o myapp
规则中rm是shell中的删除命令,用于删除当前目录下所有的.o文件和可执行
文件myapp,当进行重新编译时,通常会输入make clean调用命令rm *.o myapp
来删除旧的文件。
【注意】在定义一个为目标时,如果当前的目录下存在clean文件,则输入
make clean 时,由于伪目标规则中没有依赖文件,而且clean文件总是最新的,
因此按照MakeFile文件的运行规则,rm *.o myapp是不会被执行的,这显然是
有问题的,为了解决这种问题,要用到.PHONY,使用这个字符串可以显示指定
clean为伪目标,而不将其视为文件。
.PHONY 的格式为:
.PHONY :clean