第五章 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的编译流程。
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编写规则什么是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,⾸先需要了解两个概念,⼀个是⽬标(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笔记一作者: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是一种脚本文件,用于自动构建程序。
它描述了如何从源代码生成可执行文件或库文件,并指定了需要使用的编译选项和依赖关系。
以下是一个简单的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基本语法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基本语法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规则,用于执行整个项目的编译和生成。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
河北联合大学轻工学院 李靖
例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