第五章 Makefile

合集下载

makefile的用法

makefile的用法

makefile的用法Makefile是一种用于自动化编译程序的工具,它可以根据源代码文件的依赖关系,自动编译出最终的可执行文件。

Makefile的使用可以大大提高程序的开发效率和可维护性,下面我们来详细了解一下Makefile的用法。

一、Makefile的基本语法Makefile的基本语法由一系列规则组成,每个规则由以下几部分组成:1. 目标(Target):表示需要生成的文件名或者是一个伪目标,如clean。

2. 依赖(Prerequisites):表示生成目标所依赖的文件或者是其他目标。

3. 命令(Command):表示生成目标的具体命令。

例如,下面是一个简单的Makefile规则:```hello: main.o hello.ogcc -o hello main.o hello.omain.o: main.cgcc -c main.chello.o: hello.cgcc -c hello.c```这个Makefile规则表示需要生成一个名为hello的可执行文件,它依赖于main.o和hello.o两个目标文件。

生成hello文件的具体命令是gcc -o hello main.o hello.o。

同时,main.o和hello.o两个目标文件分别依赖于main.c和hello.c两个源代码文件,生成它们的具体命令是gcc -c main.c和gcc -c hello.c。

二、Makefile的常用命令1. make:执行Makefile文件,生成目标文件。

2. make clean:删除所有生成的目标文件。

3. make install:将生成的目标文件安装到指定的目录中。

4. make uninstall:卸载已经安装的目标文件。

5. make help:显示Makefile文件中定义的所有规则。

三、Makefile的高级用法1. 变量Makefile中可以定义变量,用于存储一些常用的参数或者路径。

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文件时,需要注意语法规则和依赖关系,以确保编译过程的正确性。

c语言makefile编写规则

c语言makefile编写规则

c语言makefile编写规则C语言Makefile编写规则什么是MakefileMakefile是一种用于管理和构建软件项目的文件,通常被用于编译和链接C语言程序。

Makefile中包含了一系列的规则和指令,用于告诉编译器如何编译程序中的各个部分,并最终生成可执行文件。

Makefile的基本结构Makefile的基本结构由多个规则组成,每个规则由一个目标(target)和一个或多个依赖(dependencies)组成。

目标指明了要生成的文件或要执行的操作,依赖指明了目标所依赖的文件或操作。

一个简单的Makefile规则的语法如下:target: dependenciescommand其中,target是生成的文件或要执行的操作,dependencies是目标所依赖的文件或操作,command是执行的命令。

每个规则的命令必须以一个tab键开始。

Makefile的应用场景Makefile广泛应用于C语言项目的构建中,它可以自动化执行编译、链接和清理等操作。

通过Makefile,我们可以方便地管理源代码文件、头文件和库文件之间的关系,从而提高项目的可维护性和可扩展性。

Makefile的编写规则1.目标和依赖应该使用合适的命名方式,能够清晰地表达其作用以及所依赖的内容。

避免使用中文、空格和特殊字符,使用下划线和英文字母进行命名。

2.命令行命令应该以tab键开始,而不是空格。

这是Makefile的语法要求,且使用tab键可以提高代码的可读性。

3.注意规则的顺序,确保前置依赖在目标之前。

Makefile会按照规则的声明顺序进行构建,如果前置依赖在目标之后,可能导致构建失败。

4.使用变量来定义重复使用的内容,如编译器选项、源文件列表等。

这样可以提高代码的可维护性,并方便进行后续的修改和维护。

5.使用通配符来表示一类文件,如使用*.c表示所有的C语言源文件,使用$(wildcard pattern)函数来获取符合某种模式的文件列表。

makefile详解

makefile详解

makefile详解makefile⼀、初识makefile想要掌握makefile,⾸先需要了解两个概念,⼀个是⽬标(target),另⼀个就是依赖(dependency)。

⽬标就是指要⼲什么,或说运⾏ make 后⽣成什么,⽽依赖是告诉 make 如何去做以实现⽬标。

在 Makefile 中,⽬标和依赖是通过规则(rule)来表达的。

(⼀)、⽬标⾸次编写makefileall:echo "Hello world"上⾯Makefile 中的 all 就是我们的⽬标,⽬标放在‘:’的前⾯,其名字可以是由字⺟和下划线‘_’组成。

echo “Hello World”就是⽣成⽬标的命令,这些命令可以是任何你可以在你的环境中运⾏的命令以及 make 所定义的函数等等。

all ⽬标的定义,其实是定义了如何⽣成 all ⽬标,这我们也称之为规则.makefile定义多个⽬标all:echo "Hello world"test:echo "test game"下⾯是运⾏的结果由此可见,⼀个 Makefile 中可以定义多个⽬标。

调⽤ make 命令时,我们得告诉它我们的⽬标是什么,即要它⼲什么。

当没有指明具体的⽬标是什么时,那么 make 以 Makefile ⽂件中定义的第⼀个⽬标作为这次运⾏的⽬标。

这“第⼀个”⽬标也称之为默认⽬标(和是不是all没有关系)。

当 make 得到⽬标后,先找到定义⽬标的规则,然后运⾏规则中的命令来达到构建⽬标的⽬的。

makefile中取消多余的命令⾏显⽰在上⾯的指令中,多了很多的echo "......"的内容,这部分不是我们所期望的,如果要去掉,需要对上⾯的makefile进⾏⼀个改动,也就是在命令前加上⼀个@,这个符号就是告诉make,在运⾏的时候这⼀⾏命令不显⽰出来。

all:@echo "Hello world"test:@echo "test game"运⾏结果:紧接着对makefile进⾏如下的改动,在all的后⾯加上testall: test@echo "Hello world"test:@echo "test game"运⾏结果如下:如上图所⽰,此时test也被构建了。

Makefile笔记

Makefile笔记

Makefile笔记一作者:sun_bunny2006-03-09 10:18 星期四阴一、Makefile的规则target ... : prerequisites ...command......target也就是一个目标文件,可以是Object File,也可以是执行文件。

还可以是一个标签(Label),对于标签这种特性,在后续的“伪目标”章节中会有叙述。

prerequisites就是,要生成那个target所需要的文件或是目标。

command也就是make需要执行的命令。

(任意的Shell命令)prerequisites中如果有一个以上的文件比target文件要新的话,command所定义的命令就会被执行。

这就是Makefile的规则。

也就是Makefile中最核心的内容。

二、make中需要注意的地方反斜杠(\)是换行符的意思。

这样比较便于Makefile的易读。

我们可以把这个内容保存在文件为“Makefile”或“makefile”的文件中,然后在该目录下直接输入命令“make”就可以生成执行文件edit。

如果要删除执行文件和所有的中间目标文件,那么,只要简单地执行一下“make clean”就可以了。

在定义好依赖关系后,后续的那一行定义了如何生成目标文件的操作系统命令,一定要以一个Tab键作为开头。

这里要说明一点的是,clean不是一个文件,它只不过是一个动作名字,有点像C语言中的label一样,其冒号后什么也没有,那么,make就不会自动去找文件的依赖性,也就不会自动执行其后所定义的命令。

要执行其后的命令,就要在make命令后明显得指出这个label的名字。

这样的方法非常有用,我们可以在一个makefile中定义不用的编译或是和编译无关的命令,比如程序的打包,程序的备份,等等。

三、make是如何工作的整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。

makefile编程 pdf

makefile编程 pdf

在编程中,Makefile是一种脚本文件,用于自动构建程序。

它描述了如何从源代码生成可执行文件或库文件,并指定了需要使用的编译选项和依赖关系。

以下是一个简单的Makefile示例,用于编译一个C程序:makefile复制代码CC=gccCFLAGS=-Wall -gSOURCES=main.c foo.c bar.cOBJECTS=$(SOURCES:.c=.o)TARGET=myprogall: $(TARGET)$(TARGET): $(OBJECTS)$(CC) $(CFLAGS) -o $(TARGET) $(OBJECTS)%.o: %.c$(CC) $(CFLAGS) -c $< -o $@clean:rm -f *.o $(TARGET)这个Makefile文件定义了一些变量和规则。

CC变量指定了编译器,CFLAGS变量指定了编译选项。

SOURCES变量包含所有源文件,OBJECTS变量包含了所有编译后的目标文件。

TARGET变量指定了最终生成的可执行文件名。

all规则是默认规则,它依赖于$(TARGET)规则。

$(TARGET)规则指定了如何从目标文件生成可执行文件。

在$(TARGET)规则中,使用了命令行来执行编译器,并指定了编译选项和依赖关系。

%.o: %.c规则指定了如何从C源文件编译为目标文件。

在规则中,使用了命令行来执行编译器,并指定了编译选项和依赖关系。

clean规则是一个特殊规则,用于清理生成的目标文件和可执行文件。

在规则中,使用了命令行来删除这些文件。

要使用这个Makefile,可以在终端中进入包含Makefile的目录,并运行make命令。

这将自动构建程序,并生成可执行文件。

如果需要清理生成的文件,可以运行make clean命令。

makefile编译规则

makefile编译规则

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是一个用来组织和管理程序编译和链接的工具。

通过定义一系列规则和命令,我们可以使用Makefile来自动化构建和管理大型项目的编译过程。

本文将介绍Makefile的基本语法和常用命令,以及如何编写一个简单的Makefile文件。

一、Makefile基本语法1. 标准格式Makefile由一系列规则组成,每个规则包含了一个目标(target)、我们想要生成的文件名,以及生成目标所需要的依赖关系(prerequisites)和命令(recipe)。

通常一个规则的基本格式如下:```makefiletarget: prerequisitesrecipes```其中,target是需要生成的文件名,prerequisites是依赖文件,recipes是生成目标所需要执行的命令。

2. 规则的执行原则- 如果target不存在或者target的依赖文件比target更新,那么执行recipes中的命令。

- 如果target的依赖文件有更新,那么也会执行recipes中的命令。

3. 空格和Tab键缩进在Makefile中,空格和Tab键具有不同的含义。

空格用来分隔目标、依赖和命令,而Tab键则用来标识命令行。

因此,在Makefile中,必须使用Tab键来缩进每条命令。

二、Makefile常用命令1. makemake命令是用来执行Makefile中的规则的。

通过运行make命令,可以自动编译和链接项目。

```shellmake target```2. make cleanclean是一个常用的命令,用于清除编译生成的文件。

在Makefile中,我们可以定义一个clean规则,然后通过运行make clean命令来执行清除操作。

```makefileclean:rm -f target```3. make allall是另一个常用的命令,在Makefile中可以定义一个all规则,用于执行整个项目的编译和生成。

makefile 中文手册 第五章 _ 规则的命令.

makefile 中文手册 第五章 _ 规则的命令.

第五章:规则的命令规则的命令由一些 shell 命令行组成,它们被一条一条的执行。

规则中除了第一条紧跟在依赖列表之后使用分号隔开的命令以外,其它的每一行命令行必须以 [Tab]字符开始。

多个命令行之间可以有空行和注释行(所谓空行,就是不包含任何字符的一行。

如果以 [Tab]键开始而其后没有命令的行,此行不是空行。

是空命令行, 在执行规则时空行被忽略。

通常系统中可能存在多个不同的 shell 。

但在 make 处理 Makefile 过程时,如果没有明确指定,那么对所有规则中命令行的解析使用“ /bin/sh”来完成。

执行过程所使用的 shell 决定了规则中的命令的语法和处理机制。

当使用默认的“ /bin/sh”时,命令中出现的字符“ #”到行末的内容被认为是注释。

当然了“ #”可以不在此行的行首,此时“ #”之前的内容不会被作为注视处理。

另外在 make 解析 makefile 文件时,对待注释也是采用同样的处理方式。

我们的shell 脚本也一样。

5.1命令回显通常, make 在执行命令行之前会把要执行的命令行输出到标准输出设备。

我们称之为“回显”,就好像我们在 shell 环境下输入命令执行时一样。

但是,如果规则的命令行以字符“ @”开始,则 make 在执行这个命令时就不会回显这个将要被执行的命令。

典型的用法是在使用“ echo ”命令输出一些信息时。

如:@echo 开始编译 XXX 模块 ......执行时,将会得到“开始编译 XXX 模块...... ”这条输出信息。

如果在命令行之前没有字符“ @”,那么, make 的输出将是:echo 编译 XXX 模块 ......编译 XXX 模块 ......另外,如果使用 make 的命令行参数“ -n ”或“ --just-print ”,那么 make 执行时只显示所要执行的命令, 但不会真正的去执行这些命令。

只有在这种情况下 make 才会打印出所有 make 需要执行的命令,其中也包括了使用“ @”字符开始的命令。

makefile 命令行参数

makefile 命令行参数
2. -C选项
-C选项可以指定Makefile所在的路径。如果我们在当前路径下执行make命令,但是Makefile文件不在当前路径下,那么就需要使用-C选项来指定Makefile所在的路径。例如:
make -C /path/to/Makefile
3. -f选项
-f选项可以指定要使用的Makefile文件名。如果我们有多个Makefile文件,那么就可以使用-f选项来指定要使用哪个Makefile文件。例如:
makefile 命令行参数
Makefile是一种用来管理代码编译的工具,它可以自动化执行编译任务,帮助程序员更高效地管理代码。在Makefile中,可以定义一系列规则来指定如何编译代码。在使用Makefile时,我们可以通过命令行参数来控制编译过程的行为。本文将详细介绍makefile命令行参数的使用方法。项
-j选项可以指定并行编译时所使用的线程数。如果我们有多个CPU核心,并且要编译大型项目,那么就可以使用-j选项来加速编译过程。例如:
make -j4
5. --dry-run选项
--dry-run选项可以模拟执行make命令,并输出将要执行的命令列表,但是并不会真正地执行这些命令。这个功能非常实用,因为我们可以预先查看将要执行的命令,确保它们是正确的。例如:
这样做的好处是,我们可以在不修改Makefile的情况下,通过命令行参数来控制编译过程的行为。
四、总结
本文介绍了Makefile命令行参数的用法,包括make命令、-C选项、-f选项、-j选项、--dry-run选项和--print-data-base选项。同时,本文还介绍了一些Makefile常用技巧,包括使用变量来存储编译选项、使用通配符来自动生成目标文件列表和使用命令行参数来控制编译过程。希望本文能够对大家理解和学习Makefile有所帮助。

Makefile基础教程(重制版)

Makefile基础教程(重制版)
I
目录
Makefile 基础教程(重制版)
6.3 命令出错......................................................................................................... 29 6.4 嵌套执行 make(级联) ............................................................................... 30 6.5 定义命令包..................................................................................................... 33 第 7 章 Makefile 中变量的使用 ............................................ 34 7.1 变量的基础..................................................................................................... 34 7.2 变量中的变量................................................................................................. 35 7.3 变量的高级用法............................................................................................. 37 7.4 追加变量值..................................................................................................... 40 7.5 override 指示符 .............................................................................................. 41 7.6 多行变量......................................................................................................... 41 7.7 环境变量......................................................................................................... 42 7.8 目标变量......................................................................................................... 42 7.9 模式变量......................................................................................................... 43 第 8 章 Makefile 中的条件判断 ............................................ 44 8.1 Makefile 中的条件判断语句的示例 ............................................................. 44 8.2 Makefile 中的条件表达式的语法 ................................................................. 45 第 9 章 Makefile 中函数的使用 ............................................ 47 9.1 函数调用的语法............................................................................................. 47 9.2 字符串处理函数............................................................................................. 48 9.3 文件名操作函数............................................................................................. 52 9.4 foreach 函数.................................................................................................... 54 9.5 if 函数 ............................................................................................................. 55 9.6 call 函数 .......................................................................................................... 55 9.7 origin 函数 ...................................................................................................... 56 9.8 shell 函数 ........................................................................................................ 57 9.9 控制 make 命令的函数 .................................................................................. 58 9.10 wildcard 函数................................................................................................ 58 第 10 章 make 的运行原理 ................................................ 60 10.1 make 的退出码 ............................................................................................. 60

Makefile

Makefile

定义
概述
Linux环境下的程序员如果不会使用GNU make来构建和管理自己的工程,应该不能算是一个合格的专业程序 员,至少不能称得上是 Unix程序员。在 Linux(unix )环境下使用GNU的make工具能够比较容易的构建一个属 于你自己的工程,整个工程的编译只需要一个命令就可以完成编译、连接以至于最后的执行。不过这需要我们投 入一些时间去完成一个或者多个称之为Makefile文件的编写。
在 UNIX系统中,习惯使用 Makefile作为 makefile文件。如果要使用其他文件作为 makefile,则可利用 类似下面的 make命令选项指定 makefile文件:
make命令
$ make -f Makefile.debug
Makefile文件工程样例例如,一个名为prog的程序由三个C源文件filea.c、fileb.c和filec.c以及库文件 LS编译生成,这三个文件还分别包含自己的头文件a.h、b.h和c.h。通常情况下,C编译器将会输出三个目标文件 filea.o、fileb.o和filec.o。假设filea.c和fileb.c都要声明用到一个名为defs的文件,但filec.c不用。即 在filea.c和fileb.
所要完成的Makefile文件描述了整个工程的编译、连接等规则。其中包括:工程中的哪些源文件需要编译以 及如何编译、需要创建哪些库文件以及如何创建这些库文件、如何最后产生我们想要的可执行文件。尽管看起来 可能是很复杂的事情,但是为工程编写Makefile的好处是能够使用一行命令来完成“自动化编译”,一旦提供一 个(通常对于一个工程来说会是多个)正确的 Makefile。编译整个工程你所要做的事就是在shell提示符下输入 make命令。整个工程完全自动编译,极大提高了效率。

makefile编译流程

makefile编译流程

makefile编译流程一、概述makefile是一种用于建立并自动化执行程序编译的工具。

它定义了编译过程中涉及的文件和命令,使得程序的编译变得更加简单高效。

本文将介绍makefile的编译流程,并详细解释每个步骤的作用和实现方式。

二、makefile编译流程的基本概念在讨论makefile的编译流程之前,我们需要了解一些基本概念,包括目标、依赖、规则和命令。

2.1 目标(Target)目标是makefile中需要生成的文件,可以是可执行文件、库文件、中间文件等。

每个目标都有一个名称和一组依赖关系,make会根据目标的依赖关系来判断是否需要重新生成目标。

2.2 依赖(Dependency)依赖是指目标所依赖的其他文件或目标。

如果一个目标的依赖发生了变化,那么该目标需要重新生成。

依赖可以是其他目标、源文件或中间文件。

2.3 规则(Rule)规则定义了目标和其依赖之间的关系,以及生成目标所需要执行的命令。

规则由两部分组成:目标和其依赖。

通过规则,make可以根据目标的依赖关系自动化执行编译过程。

2.4 命令(Command)命令是指生成目标所需要执行的动作或操作。

命令通常是一些编译器的调用和一些特定的构建脚本。

三、makefile的编译流程makefile的编译流程可以分为以下几个步骤:3.1 解析makefile文件在编译过程开始之前,make会首先读取并解析makefile文件。

这个过程包括对文件的语法进行检查,解析目标、依赖和规则等信息。

3.2 检查目标和依赖的状态在解析makefile文件之后,make会检查所有目标和依赖的状态,判断是否需要重新生成目标。

如果目标不存在或其依赖发生了变化,那么该目标需要重新生成。

3.3 根据规则生成目标对于需要重新生成的目标,make会根据相应的规则来执行动作。

这个动作通常是一些编译器的调用以及其他一些特定的构建脚本。

make会根据规则中定义的命令来执行相应的动作。

makefile语法详解

makefile语法详解

makefile语法详解Makefile 是一种构建自动化工具,它用于管理源代码的编译顺序和依赖关系。

Makefile 使得程序员能够简化构建过程、自动处理依赖关系、并增强项目的可读性和可理解性。

Makefile 使用一些特定语法来实现这些功能,这篇文章将带领大家逐步学习 Makefile 的语法。

1. 行尾分隔符在 Makefile 中,行尾的分隔符是一个反斜杠( \ )。

这个符号可以将一行的内容分成多行,在下一行继续编写。

这样做不会改变命令的含义,但会使命令更易读。

2. 变量定义Makefile 中的变量可以定义用于存储字符串。

这些变量可以在整个 Makefile 中使用,方便地重用代码。

定义变量的语法是使用美元符号( $)和括号( ())包含变量的名字。

例如:``` CFLAGS = -Wall -g CC = gcc ```在这个例子中,我们定义了两个变量,一个用于存储编译器选项(CFLAGS),另一个用于存储编译器名称(CC)。

3. 条件语句Makefile 支持条件语句来控制项目的编译方式。

条件语句的语法基于 ifeq、ifdef、ifndef、endif 等关键字。

例如,下面的代码段将根据目标平台指定编译器选项:``` ifndef PLATFORM $(error "You must define PLATFORM") endififeq ($(PLATFORM), WINDOWS) CFLAGS += -DWIN32 endif ```4. 函数Makefile 中的函数是一个有用的工具,可以实现在Makefile 中执行某些任务。

这些函数在规则和命令中使用,语法主要是通过 $() 实现的。

例如,$(wildcard) 函数,可以用于扩展通配符,例如:``` SOURCE_FILES = $(wildcard *.c) ```5. 模式规则Makefile 中的模式规则是一种将一类文件与另一类文件匹配的规则。

makefile 条件编译

makefile 条件编译

makefile 条件编译MakefileUnix/Linux译系统编写程序所必需的文件,其中包含了定义规则以及编译程序所必需的指令。

通常情况下,一个规则描述了从一个或多个源文件到一个或多个目标文件之间的变换过程。

在特定的编译环境中,定义的规则必须能够生成所有需要的目标文件及时准确的。

有时候,一个源文件或多个源文件具有不同的编译条件,此时Makefile件编译的技术就派上用场了。

这种技术可以根据指定的编译条件自动生成 Makefile则,使得编译器只有在满足编译条件时才会编译特定的源文件。

Makefile件编译基本依赖于 make令,它可以根据给定的源文件及编译条件,自动生成 Makefile则。

Make令使用 C言编写,可以从一个或多个文本文件中读取输入,比如源文件,然后根据相应的编译条件,使用 if句来生成 Makefile则。

要想理解 Makefile件编译,首先必须明白 Makefile几个基本概念。

Makefile 中有若干规则,每个规则由一个目标文件,一个或多个依赖文件,以及一系列的命令组成。

它们通常以三个元素表示: target: dependenciestcommands其中,target 代表目标文件,dependencies该目标文件的依赖文件,commands该目标文件生成所需的命令。

为了利用 Makefile件编译,可以将每个文件的编译条件定义为一个 Makefile量,这样 Make编译文件时就可以根据指定的编译条件来生成 Makefile则。

例如,对于两个源文件 A B,A编译条件为BUILD_A,B编译条件为 BUILD_B,只有当 BUILD_A 为真,A会被编译,当 BUILD_B 为真,B会被编译。

要实现 Makefile件编译,可以使用 Make 中的 if件语句:ifeq (BUILD_A,1)A: ../A.cpptg++ -o A ../A.cppendififeq (BUILD_B,1)B: ../B.cpptg++ -o B ../B.cppendif上面的 Makefile 中,对于 A B两个源文件,它们的编译条件分别是 BUILD_A BUILD_B,即 BUILD_A 为真时,A会被编译,BUILD_B 为真时,B会被编译。

makefilePPT课件

makefilePPT课件
5、注释。和UNIX的Shell脚本一样Makefile中只有行注释, 其注释是用“#”字符,这个就像C/C++中的“//”或者 “ /*”。 在Makefile中的命令,必须要以[Tab]键开始!!!
2021/2/10
Makefile的默认文件名为GNUmakefile、 makefile或Makefile,多数Linux程序员使用 第三种。
gcc –o test prog.o code.o prog.o:prog.c prog.h code.h
gcc –c prog.c –o prog.o code.o:code.c code.h
gcc –c code.c –o code.o clean:
rm –f *.o
2021/2/10
上面的Makefile文件中共定义了四个目标: test、prog.o、code.o和clean。目标从每行的最左 边开始写,后面跟一个冒号(:),如果有与这 个目标有依赖性的其他目标或文件,把它们列在 冒号后面,并以空格隔开。然后另起一行开始写 实现这个目标的一组命令。在Makefile中,可使 用续行号(\)将一个单独的命令行延续成几行。 但要注意在续行号(\)后面不能跟任何字符 (包括空格和键)。
2021/2/10
但是,在检查文件prog.o和code.o的时间戳之前, make会在下面的行中寻找以prog.o和code.o为目标的 规则,在第三行中找到了关于prog.o的规则,该文件 的依赖文件是prog.c、prog.h和code.h。同样,make 会在后面的规则行中继续查找这些依赖文件的规则, 如果找不到,则开始检查这些依赖文件的时间戳,如 果这些文件中任何一个的时间戳比prog.o的新,make 将执行“gcc –c prog.c –o prog.o”命令,更新prog.o文 件。

C++学习进阶之Makefile基础用法详解

C++学习进阶之Makefile基础用法详解
.PHONY: clean
$(TARGET):$(TESTOBJ) $(LIB) $(CXX) $< -o $@ $(LDFLAGS) $(LDLIBS)
$(LIB):$(OBJS) $(CXX) -shared $^ -o $@
$(TESTOBJ) $(OBJS):%.o:%.cpp $(CXX) $(CXXFLAGS) $< -o $@
makefile 文件可改为:
TARGET = simpletest OBJS = simple.o simpletest.o
$(TARGET):$(OBJS) g++ $(OBJS) -o $(TARGET)
simple.o:simple.cpp simpletest.o:simpletest.cpp clean:
绝大多数的 IDE 开发环境都会为用户自动编写 Makefile。
Make 是怎么工作的?
Make 工作的原则就是:
一个目标文件当且仅当在其依赖文件(dependencies)的更改时间戳比该目标文件的创建时间戳新时,这个目标文件才需要 被重新编译。
Make 工具会遍历所有的依赖文件,并且把它们对应的目标文件进行更新。编译的命令和这些目标文件及它们对应的依赖文件 的关系则全部储存在 Makefile 中。
Makefile 中也指定了应该如何创建,创建出怎么样的目标文件和可执行文件等信息。
除此之外,你甚至还可以在 Makefile 中储存一些你想调用的系统终端的命令,像一个 Shell 脚本一样使用它。
作用:
Makefile 文件告诉 Make 怎样编译和连接成一个程序
可用命令 dnf install make 安装make功能

使用makefile编译文件

使用makefile编译文件

Makefile 是一种组织代码编译的方式,它定义了一组规则来指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,等等。

这些规则被写入到一个文件中,通常这个文件被命名为 "Makefile"。

一个基本的 Makefile 可能看起来像这样:
all: program
program: main.o utility.o
gcc -o program main.o utility.o
main.o: main.c
gcc -c main.c
utility.o: utility.c
gcc -c utility.c
clean:
rm *.o program
在这个例子中,all 是默认的目标,当你在命令行中只输入 make 时,它会被执行。

program 是一个目标,它依赖于 main.o 和 utility.o。

当这两个文件比 program 更新时,program 就会被重新编译。

main.o 和 utility.o 同样
有它们的依赖和编译规则。

clean 是一个特殊的目标,它没有依赖,但是当你执行make clean 时,它会删除所有的 .o 文件和program 文件。

要使用Makefile 编译文件,你需要在命令行中输入make 命令。

如果你的Makefile 文件名不是默认的"Makefile",你需要使用 -f 选项指定 Makefile 文件,例如 make -f MyMakefile。

请注意,Makefile 对空格和制表符是敏感的。

每个规则的命令部分必须以制表符开始,而不能使用空格。

makefile使用

makefile使用

makefile使用1 makefile 实际上是一个单行shell脚本,用make来调用。

2 makefile 使用的命令解释器由SHELL这个变量所控制,make 启动时会从用户环保导入所有的变量经作为make有变量,但不包括SHELL变量。

3 每个命令必须以跳格符(tab)开头在工作目标之后,凡是第一个字符为跳格的文本行一律被视为命令。

@放在要执行的命令前,执行时不打印这个命令。

4 $ 符号跟开括号,函数名,空格后跟一列由逗号分隔的参数,最后用关括号结束。

例如 SOURCES = $(wildcard *.c) 这行会产生一个所有以 '.c' 结尾的文件的列表,然后存入变量 SOURCES 里。

5 常用函数。

A, wildcard, 它有一个参数,功能是展开成一列所有符合由其参数描述的文件名,文件间以空格间隔。

$(wildcard *.c)产生一个所有以'.c' 结尾的文件的列表.B, patsubst, 它需要3个参数——第一个是一个需要匹配的式样,第二个表示用什么来替换它,第三个是一个需要被处理的由空格分隔的字列. OBJS = $(patsubst%.c,%.o,$(SOURCES)) 处理所有在 SOURCES 字列中的字(一列文件名),如果它的结尾是 '.c' ,就用 '.o' 把 '.c'取代.C.notdir 去除路径。

6 规则分为三部分,A 工作目标, B 它的必要条件。

C 所要执行的命令。

工作目标是一个必须建造的文件或进行的事情,必要条件或依存对像是工作目标得以被成功创建之前,必须事先存在的那些文件,而所要执行的命令是必要条件成立时将会创建工作目标的那些shell命令。

-l<NAME>,形式的必要条件出现时,make 会搜索libNAME.so 文件,如果没有会再找libNAME.a文件,找到后就进行最后的动作----链接。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
• CXXC++编译器的名称,默认值为g++ • CXXFLAGSC++编译器的选项
河北联合大学轻工学院 李靖
例2_3: 修改例2中的makefile,使用预定义变量,使其更加通用。
河北联合大学轻工学院 李靖
Makefile补充命令
• make命令补充:
– [ options ]的含义: – -v:显示make工具的版本信息 – -w:在处理makefile之前和之后显示工作路径 – -C dir:读取makefile之前改变工作路径至dir目录 – -n:只打印要执行的命令但不执行
Makefile是make读入的唯一配置文件。
河北联合大学轻工学院 李靖
5.2 Makefile语法及其执行
• makefile语法规则: 目标:依赖文件列表 <Tab>命令列表 1、目标: 通常是要产生的文件名称,目标可以是可执行文件或其它obj文件,也 可是一个动作的名称 2、依赖文件: 是用来输入从而产生目标的文件,一个目标通常有几个依赖文件(可 以没有) 3、命令: make执行的动作,一个规则可以含几个命令(可以没有)
• 有多个命令时,每个命令占一行
河北联合大学轻工学院 李靖
简单的Makefile实例:例1
• main.c • main.h
• makefile:
河北联合大学轻工学院 李靖
Makefile语法及其执行
• make命令格式 make [ -f file ] [ options ] [ targets ] 1.[ -f file ]: make默认在工作目录中寻找名为GUNmakefile、makefile、Makefile的文件 作为makefile输入文件。
保存编译器名
保存编译参数 保存编译的输出
...
河北联合大学轻工学院 李靖
Makefile变量
• makefile的变量分类: • 自定义变量 – 在makefile文件中定义的变量。 – make工具传给makefile的变量。
• 系统环境变量
– make工具解析makefile前,读取系统环境变量并设置为makefile的 变量。
河北联合大学轻工学院 李靖
5.3 Makefile变量
• 为了简化ห้องสมุดไป่ตู้辑和维护makefile,我们来学习比较通用的makefile。
• makefile变量类似于C语言中的宏,在makefile中定义的名字,用来代 替一个字符串。当makefile被make工具解析时,其中的变量会被展开 ,可以代替目标、依赖文件、命令及文件中的其他部分。 • 变量的作用: 保存文件名列表 保存文件目录列表
河北联合大学轻工学院 李靖
• AR归档维护程序的程序名,默认值为ar • ARFLAGS归档维护程序的选项 • AS汇编程序的名称,默认值为as • ASFLAGS汇编程序的选项
• C编译器的名称,默认值为cc
• CFLAGSC编译器的选项 • CPPC预编译器的名称,默认值为$(CC) -E
• CPPFLAGSC预编译的选项
河北联合大学轻工学院 李靖
make主要解决两个问题:
一、大量代码的关系维护
大项目中源代码比较多,手工维护、编译时间长而且编译命令复杂,难以记忆 及维护。
把代码维护命令及编译命令写在makefile文件中,然后再用make工具解析此文 件自动执行相应命令,可实现代码的合理编译。 二、减少重复编译时间 在改动其中一个文件的时候,能判断哪些文件被修改过,可以只对该文件进 行重新编译,然后重新链接所有的目标文件,节省编译时间。
第五章 工程管理软件make
河北联合大学轻工学院 李靖
• make概述
• makefile语法及其执行
• makefile变量
河北联合大学轻工学院 李靖
5.1 make概述
• • • • • GNU make是一种代码维护的工具,可以自动进行编译管理,可以自动发现更 新的文档,而减少编译的工作量,调高效率。 make工具会根据makefile文件定义的规则和步骤,完成整个软件项目的代码 维护工作。 一般用来简化编译工作,可以极大地提高软件开发的效率。 windows下一般由集成开发环境自动生成。 Linux下需要由我们按照其语法自行编写。几乎所有的嵌入式Linux下的项目都 会涉及Makefile。
河北联合大学轻工学院 李靖
修改例2中的Makefile:例2_2
• 例2_2:

修改例2中的makefile,使用自定义变量使其更加通用。
河北联合大学轻工学院 李靖
makefile中常见的预定义变量
• 预定义变量
makefile中有许多预定义变量,这些变量具有特殊的含义,可在makefile 中直接使用。
• 预定义变量(自动变量)
河北联合大学轻工学院 李靖
Makefile变量
• 自定义变量语法定义变量:
变量名=变量值
• 引用变量:
$(变量名)或${变量名}
• makefile的变量名:
makefile变量名可以以数字开头
• 变量是大小写敏感的
• 变量一般都在makefile的头部定义
• 变量几乎可在makefile的任何地方使用
• -s:执行但不显示执行的命令
河北联合大学轻工学院 李靖
实验
• Makefile练习
编写Makefile完成计算器程序(01_练习代码/calc)的编译,并通过假 想目标(clean)清除目标文件
• • • 第一步:不使用任何变量完成功能 第二步:使用自定义变量让程序更加通用 第三步:使用预定义变量让程序更加通用
-f可以指定以上名字以外的文件作为makefile输入文件。
2.[ options ] 执行参数:辅助makefile执行。 3.[ targets ]: 若使用make命令时没有指定目标,则make工具默认会实现makefile文件内的 第一个目标,然后退出。 • 指定了make工具要实现的目标,目标可以是一个或多个(多个目标间用空格 隔开)。
河北联合大学轻工学院 李靖
Makefile:
• • •
如printf1.c和printf1.h文件在最后一次编译到printf1.o目标文件后没有改动,它 们不需重新编译。 main可以从源文件中重新编译并链接到没有改变的printf1.o目标文件。 如printf1.c和printf1.h源文件有改动,make将在重新编译main之前自动重新编 译printf1.o。
$@目标名 $*目标名中除含扩展名的部分 扩展名包括:S、s、C、c、cc、cp、cpp、o、a等 $<依赖文件列表中的第一个文件 $^依赖文件列表中除去重复文件的部分
$+依赖文件列表中所有的文件
$?依赖文件列表中比目标文件新的文件
河北联合大学轻工学院 李靖
makefile中常见的预定义变量
河北联合大学轻工学院 李靖
稍复杂的Makefile实例:例2
• • 例2:稍复杂的Makefile实例 main.c调用printf1.c中的printf1函数,同时需要使用main.h的中PI,printf1.h需 要使用main.h中的PI printf1.c
main.c
main.h
printf1.h
相关文档
最新文档