跟我一起学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?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE 都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makefile还是要懂。

这就好像现在有这么多的HTML的编辑器,但如果你想成为一个专业人士,你还是要了解HTML 的标识的含义。

特别在Unix下的软件编译,你就不能不自己写makefile了,会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力。

因为,makefile关系到了整个工程的编译规则。

一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。

makefile带来的好处就是——―自动化编译‖,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。

make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。

可见,makefile都成为了一种在工程方面的编译方法。

现在讲述如何写makefile的文章比较少,这是我想写这篇文章的原因。

当然,不同产商的make 各不相同,也有不同的语法,但其本质都是在―文件依赖性‖上做文章,这里,我仅对GNU的make进行讲述,我的环境是RedHat Linux 8.0,make的版本是3.80。

必竟,这个make 是应用最为广泛的,也是用得最多的。

而且其还是最遵循于IEEE 1003.2-1992 标准的(POSIX.2)。

在这篇文档中,将以C/C++的源码作为我们基础,所以必然涉及一些关于C/C++的编译的知识,相关于这方面的内容,还请各位查看相关的编译器的文档。

手把手教你如何写Makefile

手把手教你如何写Makefile

手把手教你如何写Makefile陈皓 2005.04.01一、Makefile的规则在讲述这个Makefile之前,还是让我们先来粗略地看一看Makefile的规则。

target ... : prerequisites ...commandtarget也就是一个目标文件,可以是Object File,也可以是执行文件。

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

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

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

(任意的Shell命令)这是一个文件的依赖关系,也就是说,target这一个或多个的目标文件依赖于prerequisites 中的文件,其生成规则定义在command中。

说白一点就是说,prerequisites中如果有一个以上的文件比target文件要新的话,command所定义的命令就会被执行。

这就是Makefile的规则。

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

说到底,Makefile的东西就是这样一点,好像我的这篇文档也该结束了。

呵呵。

还不尽然,这是Makefile的主线和核心,但要写好一个Makefile还不够,我会以后面一点一点地结合我的工作经验给你慢慢到来。

内容还多着呢。

:)二、一个示例正如前面所说的,如果一个工程有3个头文件,和8个C文件,我们为了完成前面所述的那三个规则,我们的Makefile应该是下面的这个样子的。

edit : main.o kbd.o command.o display.o \insert.o search.o files.o utils.occ -o edit main.o kbd.o command.o display.o \insert.o search.o files.o utils.omain.o : main.c defs.hcc -c main.ckbd.o : kbd.c defs.h command.hcc -c kbd.ccommand.o : command.c defs.h command.hcc -c command.cdisplay.o : display.c defs.h buffer.hcc -c display.cinsert.o : insert.c defs.h buffer.hcc -c insert.csearch.o : search.c defs.h buffer.hcc -c search.cfiles.o : files.c defs.h buffer.h command.hcc -c files.cutils.o : utils.c defs.hcc -c utils.cclean :rm edit main.o kbd.o command.o display.o \insert.o search.o files.o utils.o反斜杠(\)是换行符的意思。

Makefile 语法学习

Makefile 语法学习

Makefile 语法学习有稍稍在Linux 下碰过程序设计的开发者应该会知道,make 是用来将程序代码、函式库、头文件及其它资源文件build 成最终成果(即:最终的应用程序)的超强力辅助工具。

当然了,并不是非得动用到make 才能build 程序,或许有什么程序设计魔人喜欢什么都自己手动进行;但利用make 及其参考档(输入档案)Makefile 将会让整个编译工作轻松许多。

若您曾经打包过Debian Package,那么应该会发现debuan/rule 这个档案的语法和Makefile 几乎是一模一样,所以学习Makefile 的语法对于Debian Package Maintainer 而言也是一门必要的功课。

Makefile语法:以下为Makefile 的基本语法,批注:以# 开头的即为批注。

变量宣告:(有人称之为宏)语法:MACRO = value注意到,在=前后必须加上空白,而变量名称为大小写相异。

利用MACRO = 来取消该变数。

在惯例上,Makefile 内部使用的变量名称使用小写;而使用者很可能从命令行自行另外指定数值的变量,像是CFLAGS,则是使用大写。

在Makefile 中,可利用$(MACRO) 或${MACRO} 来存取已定义的变量。

例:tragets = foo$(targets): common.hgcc -o $(targets) foo.c效果等同:foo: common.hgcc -o foo foo.c:=语法注意到,make 会将整个Makefile 展开后,再决定变数的值。

也就是说,变量的值将会是整个Mackfile 中最后被指定的值。

例:x = fooy = $(x) barx = xyz# y 的值为xyz bar在上例中,y 的值将会是xyz bar,而不是foo bar。

您可以利用:= 来避开这个问题。

:= 表示变量的值决定于它在Makefile 中的位置,而不是整个Makefile 展开后最终的值。

makefile 语法

makefile 语法

makefile 语法makefile是一种常用的自动化构建工具,它可以帮助我们将源代码编译、链接、打包等一系列操作自动化完成。

在软件开发中,makefile 已经成为了不可或缺的工具之一。

本文将介绍 makefile的语法及其用法,希望能够帮助读者更好地理解和使用 makefile。

一、makefile 的基本语法makefile 的基本语法包括目标、依赖、命令三个要素。

下面我们来逐一介绍。

1. 目标目标是指要生成的文件,也就是 makefile 的最终输出。

目标通常是一个可执行文件、一个库文件或者一个归档文件。

在 makefile 中,目标通常以文件名的形式出现。

例如:```app: main.c func.c```这里的“app”就是目标。

2. 依赖依赖是指生成目标所需要的文件或者其他目标。

在 makefile 中,依赖通常以文件名的形式出现。

例如:```app: main.c func.c```这里的“main.c”和“func.c”就是依赖。

3. 命令命令是指生成目标所需要执行的命令。

在 makefile 中,命令通常以“TAB”键开头,并且必须与目标或者依赖之间有一个空格。

例如:```app: main.c func.cgcc main.c func.c -o app```这里的命令是“gcc main.c func.c -o app”。

二、makefile 的实例了解了 makefile 的基本语法后,我们来看一个简单的makefile 实例:```app: main.c func.cgcc main.c func.c -o app```这个 makefile 的作用是将“main.c”和“func.c”编译成一个可执行文件“app”。

如果我们在命令行中执行“make”命令,make 就会自动根据 makefile 中的规则来生成目标文件“app”。

三、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 速成

分享一篇前短时间总结的makefile速成,教你一天搞定makefile,略加实践掌握其最核心部分。

可以从下面的几个维度来学习和理解makefile:∙规则∙变量∙函数∙命令∙make的命令选项∙一个大型项目的makefile例子∙make –p的输出概览在正式介绍makefile的以上四个方面之前,首先一句话概括一下makefile 是什么:makefile是用来描述文件依赖关系,并告诉make命令如何根据这种依赖关系,调用shell完成目标文件建立的文件。

makefile的执行时通过两步来完成的,第一步是扫描文件中的依赖关系,并藉此建立依赖关系树,然后从最底层想上来执行。

1.规则(rule)Makefile从本质上说就是描述项目中文件依赖关系的文件。

这种依赖关系的描述就是规则。

Makefile的编写中的一切都是围绕规则来展开的,上面提到的四个方面:规则、变量、函数、命令都是为了规则能够方便快捷的发挥作用才引入的。

一个简单规则可以表述为:目标文件:依赖文件(不同文件以空格分隔)<tab>得到目标文件需要的命令规则的常见种类有:●∙Explicit Rule最简单的rule,明确指出了目标和依赖,以及如何有依赖得到目标。

举例:Hello.o:hello.cppg++ -c hello.cpp●∙Pattern Rule使用了wildcard(通配符)的规则。

makefile中的通配符是百分号%,相当于bash中的*,在描述规则的时候使用的都是%。

makefile中也可以看到通配符*,这个一般是出现在命令之中,命令是要放到shell中运行的,所以要使用*作为通配符。

举例:prog:*.cg++ -o prog $^●∙Suffix Rule顾名思义,是只使用后缀来描述的rule,描述的时候不使用pattern,举例:.c.o:$(COMPILE.C) $(OUTPUT_OPTION) $<这个suffix rule的作用和下面这个pattern rule的作用是完全一样的。

命令行Makefile和make命令讲解教程

命令行Makefile和make命令讲解教程

命令行Makefile和make命令讲解教程.命令行Makefile和make命令讲解教程我们知道make是Linux下的一款程序自动维护工具,配合makefile的使用,就能够根据程序中模块的修改情况,自动判断应该对那些模块重新编译,从而保证软件是由最新的模块构成。

本文分为上下两部分,我们将紧紧围绕make在软件开发中的应用展开详细的介绍。

一、都是源文件太多惹得祸当我们在开发的程序中涉及众多源文件时,常常会引起一些问题。

首先,如果程序只有两三个源文件,那么修改代码后直接重新编译全部源文件就行了,但是如果程序的源文件较多,这种简单的处理方式就有问题了。

设想一下,如果我们只修改了一个源文件,却要重新编译所有源文件,那么这显然是在浪费时间。

其次,要是只重新编译那些受影响的文件的话,我们又该如何确定这些文件呢?比如我们使用了多个头文件,那么它们会被包含在各个源文件中,修改了某些头文件后,那些源文件受影响,哪些与此无关呢?如果采取拉网式大检查的话,可就费劲了。

由此可以看出,源文件多了可真是件让人头疼的事。

幸运的是,实用程序make可以帮我们解决这两个问题——当程序的源文件改变后,它能保证所有受影响的文件都将重新编译,而不受影响的文件则不予编译,这真是太好了。

二、Make程序的命令行选项和参数我们知道,make程序能够根据程序中各模块的修改情况,自动判断应对哪些模块重新编译,保证软件是由最新的模块构建的。

至于检查哪些模块,以及如何构建软件由makefile文件来决定。

虽然make可以在makefile中进行配置,除此之外我们还可以利用make程序的命令行选项对它进行即时配置。

Make命令参数的典型序列如下所示:make [-f makefile文件名][选项][宏定义][目标]Make命令本身的命令行选项较多,这里只介绍在开发程序时最为常用的三个,它们是:–k:如果使用该选项,即使make程序遇到错误也会继续向下运行;如果没有该选项,在遇到第一个错误时make程序马上就会停止,那么后面的错误情况就不得而知了。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

跟我一起写 Makefile作者:陈皓整理:祝冬华第一部分、概述 (6)第二部分、关于程序的编译和链接 (6)第三部分、Makefile 介绍 (7)一、Makefile的规则 (7)二、一个示例 (8)三、make是如何工作的 (9)四、makefile中使用变量 (10)五、让make自动推导 (11)六、另类风格的makefile (12)七、清空目标文件的规则 (13)第四部分、Makefile 总述 (13)一、Makefile里有什么? (13)1、显式规则。

(14)2、隐晦规则。

(14)3、变量的定义。

(14)4、文件指示。

(14)5、注释。

(14)二、Makefile的文件名 (15)三、引用其它的Makefile (15)四、环境变量 MAKEFILES (16)五、make的工作方式 (16)第五部分、书写规则 (17)一、规则举例 (17)二、规则的语法 (17)三、在规则中使用通配符 (18)四、文件搜寻 (19)五、伪目标 (20)六、多目标 (22)七、静态模式 (22)八、自动生成依赖性 (24)第六部分书写命令 (25)一、显示命令 (26)二、命令执行 (26)三、命令出错 (27)四、嵌套执行make (28)五、定义命令包 (30)第七部分使用变量 (30)一、变量的基础 (31)二、变量中的变量 (32)三、变量高级用法 (34)四、追加变量值 (37)五、override 指示符 (37)六、多行变量 (38)八、目标变量 (39)九、模式变量 (40)第八部分使用条件判断 (40)一、示例 (40)二、语法 (42)第九部分使用函数 (43)一、函数的调用语法 (44)二、字符串处理函数 (44)1、subst (44)2、patsubst (45)3、strip (45)4、findstring (46)5、filter (46)6、filter-out (46)7、sort (47)8、word (47)9、wordlist (47)10、words (47)11、firstword (48)12、字符串函数实例 (48)三、文件名操作函数 (48)1、dir (48)2、notdir (48)3、suffix (49)4、basename (49)5、addsuffix (49)6、addprefix (49)7、join (50)四、foreach 函数 (50)五、if 函数 (50)六、call函数 (51)七、origin函数 (51)“undefined” (52)“default” (52)“file” (52)“command line” (52)“override” (52)“automatic” (52)八、shell函数 (53)九、控制make的函数 (53)1、error (53)2、warning (54)第十部分 make 的运行 (54)二、指定Makefile (54)三、指定目标 (55)“all” (56)“clean” (56)“install” (56)“print” (56)“tar” (56)“dist” (56)“TAGS” (56)“check”和“test” (56)四、检查规则 (57)五、make的参数 (57)第十一部分隐含规则 (61)一、使用隐含规则 (61)二、隐含规则一览 (62)1、编译C程序的隐含规则 (63)2、编译C++程序的隐含规则 (63)3、编译Pascal程序的隐含规则 (63)4、编译Fortran/Ratfor程序的隐含规则 (63)5、预处理Fortran/Ratfor程序的隐含规则 (63)6、编译Modula-2程序的隐含规则 (63)7、汇编和汇编预处理的隐含规则 (64)8、链接Object文件的隐含规则 (64)9、Yacc C程序时的隐含规则 (64)10、Lex C程序时的隐含规则 (64)11、Lex Ratfor程序时的隐含规则 (65)12、从C程序、Yacc文件或Lex文件创建Lint库的隐含规则 (65)三、隐含规则使用的变量 (65)1、关于命令的变量。

(65)2、关于命令参数的变量 (66)四、隐含规则链 (67)五、定义模式规则 (68)1、模式规则介绍 (68)2、模式规则示例 (69)3、自动化变量 (70)4、模式的匹配 (72)5、重载内建隐含规则 (72)六、老式风格的"后缀规则" (73)七、隐含规则搜索算法 (74)第十二部分使用make更新函数库文件 (75)一、函数库文件的成员 (75)二、函数库成员的隐含规则 (75)三、函数库文件的后缀规则 (76)第十三部分后序 (77)第一部分、概述什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows 的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makefile 还是要懂。

这就好像现在有这么多的HTML的编辑器,但如果你想成为一个专业人士,你还是要了解HTML的标识的含义。

特别在Unix下的软件编译,你就不能不自己写makefile了,会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力。

因为,makefile关系到了整个工程的编译规则。

一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。

makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。

make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。

可见,makefile都成为了一种在工程方面的编译方法。

现在讲述如何写makefile的文章比较少,这是我想写这篇文章的原因。

当然,不同产商的make各不相同,也有不同的语法,但其本质都是在“文件依赖性”上做文章,这里,我仅对GNU的make进行讲述,我的环境是RedHat Linux 8.0,make的版本是3.80。

必竟,这个make是应用最为广泛的,也是用得最多的。

而且其还是最遵循于IEEE 1003.2-1992 标准的(POSIX.2)。

在这篇文档中,将以C/C++的源码作为我们基础,所以必然涉及一些关于C/C++的编译的知识,相关于这方面的内容,还请各位查看相关的编译器的文档。

这里所默认的编译器是UNIX下的GCC和CC。

第二部分、关于程序的编译和链接在此,我想多说关于程序编译的一些规范和方法,一般来说,无论是C、C++、还是pas,首先要把源文件编译成中间代码文件,在Windows下也就是 .obj 文件,UNIX下是 .o 文件,即 Object File,这个动作叫做编译(compile)。

然后再把大量的Object File合成执行文件,这个动作叫作链接(link)。

编译时,编译器需要的是语法的正确,函数与变量的声明的正确。

对于后者,通常是你需要告诉编译器头文件的所在位置(头文件中应该只是声明,而定义应该放在C/C++文件中),只要所有的语法正确,编译器就可以编译出中间目标文件。

一般来说,每个源文件都应该对应于一个中间目标文件(O文件或是OBJ文件)。

链接时,主要是链接函数和全局变量,所以,我们可以使用这些中间目标文件(O文件或是OBJ 文件)来链接我们的应用程序。

链接器并不管函数所在的源文件,只管函数的中间目标文件(Object File),在大多数时候,由于源文件太多,编译生成的中间目标文件太多,而在链接时需要明显地指出中间目标文件名,这对于编译很不方便,所以,我们要给中间目标文件打个包,在Windows下这种包叫“库文件”(Library File),也就是 .lib 文件,在UNIX 下,是Archive File,也就是 .a 文件。

总结一下,源文件首先会生成中间目标文件,再由中间目标文件生成执行文件。

在编译时,编译器只检测程序语法,和函数、变量是否被声明。

如果函数未被声明,编译器会给出一个警告,但可以生成Object File。

而在链接程序时,链接器会在所有的Object File中找寻函数的实现,如果找不到,那到就会报链接错误码(Linker Error),在VC下,这种错误一般是:Link 2001错误,意思说是说,链接器未能找到函数的实现。

你需要指定函数的Object File.好,言归正传,GNU的make有许多的内容,闲言少叙,还是让我们开始吧。

第三部分、Makefile 介绍make命令执行时,需要一个 Makefile 文件,以告诉make命令需要怎么样的去编译和链接程序。

首先,我们用一个示例来说明Makefile的书写规则。

以便给大家一个感兴认识。

这个示例来源于GNU的make使用手册,在这个示例中,我们的工程有8个C文件,和3个头文件,我们要写一个Makefile来告诉make命令如何编译和链接这几个文件。

我们的规则是:1)如果这个工程没有编译过,那么我们的所有C文件都要编译并被链接。

2)如果这个工程的某几个C文件被修改,那么我们只编译被修改的C文件,并链接目标程。

3)如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的C文件,并链接目标程序。

只要我们的Makefile写得够好,所有的这一切,我们只用一个make命令就可以完成,make命令会自动智能地根据当前的文件修改的情况来确定哪些文件需要重编译,从而自己编译所需要的文件和链接目标程序。

一、Makefile的规则在讲述这个Makefile之前,还是让我们先来粗略地看一看Makefile的规则。

target ... : prerequisites ...command......target也就是一个目标文件,可以是Object File,也可以是执行文件。

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

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

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

(任意的Shell命令)这是一个文件的依赖关系,也就是说,target这一个或多个的目标文件依赖于prerequisites中的文件,其生成规则定义在command中。

相关文档
最新文档