makefile讲解

合集下载

make 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的可维护性和灵活性。

构建命令可以是任意的Shell命令,包括编译、链接、拷贝等操作。

makefile中make指令传入的参数

makefile中make指令传入的参数

makefile中make指令传入的参数Makefile中make指令传入的参数是指在执行make命令时,可以通过命令行传入的参数。

这些参数可以用于控制程序的编译、运行等行为,使得程序更加灵活和可配置。

在Makefile中,我们可以通过在命令行中输入make和参数来执行相应的操作。

参数可以是任意的字符串,可以用于指定编译选项、目标文件、源文件等等。

下面我将结合一些实际的例子,来详细讲解一下如何使用make指令传入的参数。

我们需要在Makefile中定义一些变量,用于存储传入的参数。

可以通过在命令行中使用“变量名=参数值”的方式来传入参数。

例如,我们可以定义一个变量CC,用于存储编译器的路径:```CC = gcc```在命令行中执行make命令时,可以通过“make CC=/usr/local/bin/gcc”来传入参数,将编译器的路径设置为“/usr/local/bin/gcc”。

接下来,我们可以在Makefile中使用这些参数。

例如,我们可以使用$(CC)来表示编译器的路径:```$(CC) -o target source.c```在执行make命令时,make会将$(CC)替换为实际的参数值,然后执行相应的命令。

这样,我们就可以通过命令行传入不同的编译器路径,来编译源文件。

除了编译器的路径,还可以通过命令行传入其他的参数。

例如,我们可以定义一个变量CFLAGS,用于存储编译选项:```CFLAGS = -Wall -O2```在命令行中执行make命令时,可以通过“make CFLAGS=-g”来传入参数,将编译选项设置为“-g”。

然后,我们可以在Makefile中使用这些参数。

例如,我们可以在编译命令中加入$(CFLAGS):```$(CC) $(CFLAGS) -o target source.c```在执行make命令时,make会将$(CFLAGS)替换为实际的参数值,然后执行相应的命令。

makefile--参数传递、条件判断、include(五)

makefile--参数传递、条件判断、include(五)

makefile--参数传递、条件判断、include(五)在多个Makefile嵌套调⽤时,有时我们需要传递⼀些参数给下⼀层Makefile。

⽐如我们在顶层Makefile⾥⾯定义的打开调试信息变量DEBUG_SYMBOLS,我们希望在进⼊⼦⽬录执⾏⼦Makefile时该变量仍然有效,这是需要将该变量传递给⼦Makefile,那怎么传递呢?这⾥有两种⽅法:1. 在上层Makefile中使⽤”export”关键字对需要传递的变量进⾏声明。

⽐如:1 2DEBUG_SYMBOLS = TRUE export DEBUG_SYMBOLS当不希望将⼀个变量传递给⼦ make 时,可以使⽤指⽰符 “unexport”来声明这个变量。

export⼀般⽤法是在定义变量的同时对它进⾏声明。

如下:1export DEBUG_SYMBOLS = TRUE2. 在命令⾏上指定变量。

⽐如:1$(MAKE) -C xxx DEBUG_SYMBOLS = TRUE这样在进⼊⼦⽬录xxx执⾏make时该变量也有效。

像编程语⾔⼀样,Makefile也有⾃⼰的条件语句。

条件语句可以根据⼀个变量值来控制make的执⾏逻辑。

⽐较常⽤的条件语句是ifeq –else-endif、ifneq-else-endif、ifdef-else-endif。

ifeq关键字⽤来判断参数是否相等。

⽐如判断是否⽣成调试信息可以这么⽤:1 2 3 4 5 6ifeq ($(DEBUG_SYMBOLS), TRUE) >---CFLAGS += -g -Wall -Werror -O0 else>---CFLAGS += -Wall -Werror -O2 endifIfneq和ifeq作⽤相反,此关键字是⽤来判断参数是否不相等。

ifdef关键字⽤来判断⼀个变量是否已经定义。

后两个关键字⽤法和ifeq类似。

现在我们继续改进我们上⼀节的Makefile,上⼀节的Makefile完成Makefile的嵌套调⽤,每⼀个模块都有⾃⼰的Makefile。

makefile编写规则 ifeq

makefile编写规则 ifeq

makefile编写规则 ifeq什么是makefile?makefile是一种用于自动化构建程序的工具,它能够根据文件之间的依赖关系,自动决定哪些文件需要重新编译。

makefile由一系列规则组成,每个规则定义了如何生成一个或多个目标文件。

make命令会根据这些规则来执行相应的操作,从而实现自动化构建的功能。

ifeq规则的作用在makefile中,ifeq是一种条件语句,用于判断某个条件是否为真。

它的基本语法如下:ifeq (condition, value)# 条件为真时执行的操作else# 条件为假时执行的操作endifcondition是一个条件表达式,可以使用各种比较运算符来进行比较。

value是一个字符串,用于与condition进行比较。

如果condition和value相等,则条件为真,执行ifeq后面的操作;否则条件为假,执行else后面的操作。

ifeq规则的使用场景ifeq规则在makefile中的使用场景很多,下面列举了几个常见的用法:1. 根据不同的操作系统执行不同的操作在跨平台开发中,可能需要根据不同的操作系统执行不同的操作。

可以使用ifeq 规则来判断当前的操作系统,然后执行相应的操作。

ifeq ($(OS),Windows_NT)# Windows系统下的操作CC = clelse# 非Windows系统下的操作CC = gccendif上面的示例中,如果当前操作系统是Windows,则将CC变量设置为cl;否则,将CC变量设置为gcc。

2. 根据变量的值执行不同的操作有时候需要根据某个变量的值来执行不同的操作。

可以使用ifeq规则来判断变量的值,然后执行相应的操作。

ifeq ($(DEBUG),1)# 调试模式下的操作CFLAGS = -gelse# 非调试模式下的操作CFLAGS =endif上面的示例中,如果DEBUG变量的值为1,则将CFLAGS变量设置为-g;否则,将CFLAGS变量设置为空。

makefile中make指令传入的参数

makefile中make指令传入的参数

makefile中make指令传入的参数(实用版)目录1.Makefile 简介2.Make 指令的作用3.Make 指令传入的参数4.示例与实践正文1.Makefile 简介Makefile 是一种构建脚本,用于自动化构建和编译软件项目。

它通常包含一系列的规则和指令,可以自动地执行编译、链接和安装等任务。

Makefile 最早用于 Unix 系统,现在已广泛应用于各种操作系统和编程语言。

2.Make 指令的作用在 Makefile 中,Make 指令是最核心的命令。

它可以自动地执行一系列的编译、链接和安装等任务,以构建软件项目。

Make 指令的工作原理是基于依赖关系,它可以自动地发现源文件和目标文件之间的依赖关系,并按照一定的顺序执行相应的操作。

3.Make 指令传入的参数Make 指令传入的参数主要有以下几种:(1)目标:指定要构建的目标文件,通常是可执行文件或库文件。

(2)源文件:指定构成目标文件的源文件,可以是 C、C++等源代码文件。

(3)编译器:指定用于编译源文件的编译器,例如 gcc、g++等。

(4)链接器:指定用于链接目标文件和库文件的链接器,例如 ld、ld.so 等。

(5)其他选项:还可以指定其他选项,例如优化级别、输出文件名等。

4.示例与实践下面是一个简单的 Makefile 示例,用于编译一个 C 语言程序:```CC = gccCFLAGS = -Wall -o2SOURCES = main.cOBJECTS = main.oTARGET = mainall: $(TARGET)$(TARGET): $(OBJECTS)t$(CC) $(CFLAGS) $^ -o $@$(OBJECTS): $(SOURCES)t$(CC) $(CFLAGS) -c $< -o $@```在这个示例中,我们指定了编译器(CC)、优化选项(CFLAGS)、源文件(SOURCES)、目标文件(TARGET)和依赖关系(all: $(TARGET))。

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

mk文件语法

mk文件语法

mk文件语法
“MK文件语法”通常指的是Makefile文件的语法。

Makefile是一种用于自动化构建程序的工具,它描述了如何从源代码生成可执行文件或库文件。

Makefile文件使用特定的语法规则来定义构建规则、依赖关系和编译选项等。

Makefile的语法包括以下部分:
1.变量定义:使用VAR = value的形式定义变量,可以使用${VAR}引用变量
的值。

2.规则定义:使用target: dependencies的形式定义规则,其中target是要
生成的目标文件,dependencies是生成目标文件所需的依赖文件。

例如:hello: main.o utility.ogcc -o hello main.o utility.o
3.命令:定义规则之后可以跟一系列命令,用于生成目标文件。

命令会在执
行Makefile时顺序执行。

例如:%.o: %.cgcc -c $< -o $@
4.条件判断和循环:Makefile支持条件判断和循环结构,可以根据条件执行
不同的命令或重复执行一组命令。

例如:
ifeq ($(CC), gcc)CFLAGS += -O2elseCFLAGS += -O0endif
5.函数:Makefile还提供了一些内置函数,可以在变量、规则和命令中使用。

例如:$(warning "This is a warning message")
以上是Makefile语法的一些基本组成部分。

具体的语法规则和用法可能会根据不同的Makefile版本和工具而有所不同。

makefile obj用法

makefile obj用法

文章标题:深入探讨Makefile中的Obj用法在软件开发中,Makefile是一个非常重要的工具,它帮助程序员管理项目的编译和信息过程。

而Makefile中的Obj用法则是Makefile中非常重要的一部分,它用来指定项目中的目标文件。

在本篇文章中,我们将深入探讨Makefile中的Obj用法,从简单到复杂,由浅入深,帮助读者更好地理解和运用Obj用法。

1. 什么是Makefile在开始深入探讨Makefile中的Obj用法之前,我们先来了解一下什么是Makefile。

Makefile是一种文件,其中包含了一系列规则和命令,用于指导编译器如何编译和信息项目中的源文件,最终生成可执行文件。

Makefile通过维护文件之间的依赖关系,可以使得在修改源文件后,只重新编译需要重新编译的文件,而不是整个项目。

这样可以提高编译的效率,特别是在大型项目中非常重要。

2. Obj用法的基础概念Obj用法是Makefile中用来指定目标文件的一个重要部分。

在Makefile中,通常通过指定目标文件来定义一个编译单元,Obj用法就是用来指定这些目标文件的。

在Makefile中,Obj用法通常是在规则中使用的,用来指定编译的目标文件是哪些。

我们可以这样定义一个规则:```main.o : main.cgcc -c main.c -o main.o```在这个例子中,main.o就是通过Obj用法指定的目标文件,它告诉Makefile需要生成名为main.o的目标文件,并且它是由main.c编译而来的。

3. Makefile中的Obj用法进阶除了简单地指定目标文件外,Obj用法还可以进一步扩展。

在实际开发中,一个目标文件可能由多个源文件编译而来,这时候就需要用到Obj用法的进阶用法了。

在Makefile中,我们可以使用通配符来指定一组目标文件,例如:```%.o : %.cgcc -c $< -o $@```这个规则中,%表示任意的文件名,$<表示依赖文件,$@表示目标文件。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
编译C++程序的隐含规则 编译Pascal程序的隐含规则 编译Fortran/Ratfor程序的隐含规则 预处理Fortran/Ratfor程序的隐含规则 汇编和汇编预处理的隐含规则
• 链接Object文件的隐含规则
“<n>‖目标依赖于“<n>.o‖,通过运行C的编译器来运行链接程序生 成,其生成命令是: $(CC) $(LDFLAGS) <n>.o $(LOADLIBES) $(LDLIBS)
• 老式风格的"后缀规则"
双后缀 定义一对后缀:目标文件的后缀和依赖目标的后缀。例如“.c.o‖相 当于“%o : %c‖ 单后缀 定义一个后缀,也就是依赖目标的后缀。例如".c"相当于"% : %.c―
• 自定义后缀
伪目标.SUFFIXES: .pco .cob .pc
自动化变量列表
• • • • • $@表示规则中的目标文件集。 $%仅当目标是函数库文件中,表示规则中的目标成员名。 $<依赖目标中的第一个目标名字。 $?所有比目标新的依赖目标的集合,以空格分隔。 $^所有的依赖目标的集合,以空格分隔。如果在依赖目标 中有多个重复的,那个这个变量会去除重复的依赖目标, 只保留一份。 • $+这个变量很像"$^",也是所有依赖目标的集合。只是它 不去除重复的依赖目标。 • $* 这个变量表示目标模式中"%"及其之前的部分。
隐含规则
• 特点
是Makefile默认运行的规则 可使用系统变量 可自定义隐含规则 显式规则优于隐含规则
隐含规则
• 隐含规则实例
foo : foo.o cc –o foo foo.o 等价于 foo.o : foo.c cc –c foo.c
隐含规则一览
• 编译C程序的隐含规则
“<n>.o‖的目标的依赖目标会自动推导为“<n>.c‖,并且其生成命令 是 $(CC) –c $(CPPFLAGS) $(CFLAGS)
Makefile的条件语法
• 条件表达式的语法为: <conditional-directive> <text-if-true> endif
以及:
<conditional-directive> <text-if-true> else <text-if-false> endif 其中<conditional-directive>表示条件关键字 ,这个关键字有四个ifeq , ifneq ,ifdef,ifndef • <conditional-directive>允许多余的空格, • else,endif, <conditional-directive>不能以[Tab]键做为开始
Makefile的引用函数
• 调用举例
$(subst <from>,<to>,<text> )
名称:字符串替换函数——subst。 功能: <from>--被替换前的字符串 <to>------ 被替换后的字符串 <text>-----被替换的字串 $(subst ee,EE,feet on the street) 原为feet on the street 调用函数后为fEEt on the street
如果目标文件的依赖文件不存在或者更新,会重新编译目标文 件 如果没有依赖文件,make不会自动执行command命令
• 在过程中出现错误,make会直接退出并报错
简单的Makefile实例
• objects = main.o kbd.o command.o display.o \ insert.o search.o files.o utils.o edit : $(objects) cc -o edit $(objects) main.o : defs.h kbd.o : defs.h command.h command.o : defs.h command.h display.o : defs.h buffer.h insert.o : defs.h buffer.h search.o : defs.h buffer.h files.o : defs.h buffer.h command.h utils.o : defs.h
Makefile的引用函数
• 调用语法
$(<function> <arguments> ) ${<function> <arguments>}
<function>函数名
<arguments>函数的参数
• 语法要求
参数间以逗号“,‖分隔 函数名和参数之间以“空格”分隔 函数调用以“$‖开头, 以圆括号或花括号把函数名和参数括起
make的工作方式
1、读入Makefile。 2、读入引用Makefile等文件。 3、初始化文件中的变量。 4、推导隐晦规则,并分析所有规则。 5、为所有的目标文件创建依赖关系链。 6、根据依赖关系,决定哪些目标要重新生成。 7、执行生成命令。
Makefile的默认工作原理
• 找到第一个目标文件,并把该文件作为最终文件 • 根据依赖关系进行工作
targets : prerequisites ; command command
targets-- -- 文件名,以空格分开 prerequisites--目标所依赖的文件,以空格分开多个文件 command-- -命令行, [Tab键]开头,用分号做为分隔
Makefile的引用文件
• include <filename1> <filename2>
Makefile的规则
• target ... : prerequisites ... command
target 目标文件 prerequisites 源文件 command源文件生成目标文件的规则,shell命令
Makefile内容
• Makefile里主要包含了五项内容
显式规则 隐晦规则 变量 引用文件 注释
filename—文件名称+路径
• 特点
符合shell的任意文件模式
多个文件以空格分开 include不能以[Tab]键开始 ,可以存在空格
Makefile的引用变量
• 变量命名语法 包含字符、数字,下划线(可以是数字开头) 不能使用“:‖、“#‖、“=‖或是空字符(空格、回车等) 大小写敏感 • 定义 变量在声明时需要赋初值 • 使用 在变量名前加上“$‖符号,建议使用小括号“()”或是大括号“{}‖ • 变量引用变量 • $(var:a=b)‖或是“${var:a=b} • 操作符“=‖和”:=‖的区别 • 操作符 “?=‖
Makefile讲解
• • • •
Makefile概述 Makefile编写 Makefile运行 Makefile应用实例
课前培训
• 什么是Unix shell脚本 • 什么是Makefile • 什么是程序的编译链接
Makefile概述
• • • • • • Makefile的规则 Makefile的内容 Makefile的文件名 Makefile的工作原理 Makefile的工作方式 Makefile的简单实例
Makefile的条件语法
• ifeq (<arg1>, <arg2> )
比较两个参数的值是否相同,相同为真
• ifneq (<arg1>, <arg2> )
比较两个参数的值是否相同,不同为真
• ifdef <variable-name>
变量的值非空,则表达式为真
• Ifndef
变量的值为空,则表达式为真
Makefile的字符含义
• 命令间的“;” 上条命令结果应用到下条命令 • 命令行前的字符“@‖ 不显示执行命令 • 命令行前的字符“-‖ 忽略执行该命令的错误 • 命令行前的字符“#‖ 用于注释,Makefile中只有行注释 • 命令中的波浪号“~‖ ―~/test‖,这就表示当前用户的$HOME目录下的test目录 “~hchen/test‖则表示用户hchen的宿主目录下的test目录 • 命令中的波浪号“\ ‖
Makefile的文件名
• 默认的三种文件名
GNUMakefile、Makefile、makefile 执行时直接使用make命令 make = make -f Makefile
• 自定义文件名
可使用自定义文件名,makelib 执行时使用make的“-f‖和“--file‖参数 make –f makelib
Makefile的编写
• • • • • • Makefile的书写规则 Makefile的引用文件 Makefile的引用变量 Makefile的条件语法 Makefile的引用函数 Makefile的字符含义
Makefile的书写规则
• 规则语法
target ... : prerequisites ... command
Makefile 的运行
• Makefile的运行参数 “—debug[=<options>]‖ 输出make的调试信息。它有几种不同的级别可供选择,如果没有参 数,那就是输出最简单的调试信息。下面是<options>的取值: a —— 也就是all,输出所有的调试信息。(会非常的多) b —— 也就是basic,只输出简单的调试信息。即输出不需要重编译 的目标。 v —— 也就是verbose,在b选项的级别之上。输出的信息包括哪个 Makefile被解析,不需要被重编译的依赖文件(或是依赖目标)等。 i —— 也就是implicit,输出所以的隐含规则。 j —— 也就是jobs,输出执行规则中命令的详细信息,如命令的PID、 返回码等。 m —— 也就是Makefile,输出make读取Makefile,更新Makefile,执 行Makefile的信息。 -d--默认等同于 –d文件和依赖文件的规则列表 测试是否所有的依赖文件都存在或是理当存在 如果存在或是理当存在,形成规则 执行规则其相当的命令,并加载自定义变量
相关文档
最新文档