makefile是什么 -凯发真人平台

makefile是和make命令一起配合使用的,makefile定义了一系列的规则来指定哪些文件需要先编译、后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,makefile就像一个shell脚本一样,也可以执行操作系统命令。

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

makefile是什么

定义概述

linux 环境下的程序员如果不会使用 gnu make 来构建和管理自己的工程,应该不能算是一个合格的专业程序员,至少不能称得上是 unix 程序员。在 linux(unix )环境下使用 gnu 的 make 工具能够比较容易的构建一个属于你自己的工程,整个工程的编译只需要一个命令就可以完成编译、连接以至于最后的执行。不过这需要我们投入一些时间去完成一个或者多个称之为 makefile 文件的编写。

所要完成的 makefile 文件描述了整个工程的编译、连接等规则。其中包括:工程中的哪些源文件需要编译以及如何编译、需要创建哪些库文件以及如何创建这些库文件、如何最后产生我们想要的可执行文件。尽管看起来可能是很复杂的事情,但是为工程编写 makefile 的好处是能够使用一行命令来完成“自动化编译”,一旦提供一个(通常对于一个工程来说会是多个)正确的 makefile。编译整个工程你所要做的事就是在 shell 提示符下输入 make 命令。整个工程完全自动编译,极大提高了效率。

make 是一个命令工具,它解释 makefile 中的指令。在 makefile 文件中描述了整个工程所有文件的编译顺序、编译规则。makefile 有自己的书写格式、关键字、函数。像 c 语言有自己的格式、关键字和函数一样。而且在 makefile 中可以使用系统 shell 所提供的任何命令来完成想要的工作。makefile 在绝大多数的 ide 开发环境中都在使用,已经成为一种工程的编译方法。

示例

上述 makefile 中的“$@”, “$^”, “$<” 称为自动变量。

自动化编译主要功能

make 工具最主要也是最基本的功能就是通过 makefile 文件来描述源程序之间的相互关系并自动维护编译工作。而 makefile 文件需要按照某种语法进行编写,文件中需要说明如何编译各个源文件并连接生成可执行文件,并要求定义源文件之间的依赖关系。makefile 文件是许多编译器–包括 windows nt 下的编译器–维护编译信息的常用方法,只是在集成开发环境中,用户通过友好的界面修改 makefile 文件而已。

在 unix 系统中,习惯使用 makefile 作为 makefile 文件。如果要使用其他文件作为 makefile,则可利用类似下面的 make 命令选项指定 makefile 文件:

make 命令

$ make -f makefile.debug

例如,一个名为 prog 的程序由三个 c 源文件 filea.c、fileb.c 和 filec

makefile 文件工程样例

#include “defs”

那么下面的文档就描述了这些文件之间的相互联系:

0 #it is a example for describing makefile 注释行

1 prog : filea.o fileb.o filec.o #指定 prog 由三个目标文件 filea.o、fileb.o 和 filec.o 链接生成

2 cc filea.o fileb.o filec.o -ls -o prog #如何从 prog 所依赖的文件建立可执行文件

3 filea.o : filea.c a.h defs #指定 filea.o 目标文件,以及它们所依赖的.c 和.h 文件以及 defs 文件

4 cc -c filea.c #如何从目标所依赖的文件建立目标,即如何从 filea.c 建立 filea.o

5 fileb.o : fileb.c b.h defs #指定 fileb.o 目标文件,以及它们所依赖的.c 和.h 文件以及 defs 文件

6 cc -c fileb.c #如何从目标所依赖的文件建立目标,即如何从 fileb.c 建立 fileb.o

7 filec.o : filec.c c.h #指定 filec.o 目标文件,以及它们所依赖的.c 和.h 文件

8 cc -c filec.c #如何从目标所依赖的文件建立目标,即如何从 filec.c 建立 filec.o

这个描述文档就是一个简单的 makefile 文件。我们针对上例的代码方面进行一些基础性说明:cc 是一个全局变量,它指定你的 makefile 所用的编译器,一般默认是 gcc;.o 文件是 unix 下的中间代码目标文件,就如同在 windows 下的.obj 文件一样,在 unix 下生成.o 文件的过程叫编译(compile),将无数.o 文件集合生成可执行文件的过程叫链接(link);有时会在 unix 界面下看到.a 文件,那是 archive file,相当于 windows 下的库文件 library file,.a 文件作用是:由于源文件太多(上例是指.c 和.h 文件过多),编译生成的中间目标文件(.o 文件)太多,而在链接时需要明显地指出中间目标文件名,这对于编译很不方便,所以,我们要给中间目标文件打个包,这个包就是.a 文件。

当 filea.c 或 a.h 文件在编译之后又被修改,则 make 工具可自动重新编译 filea.o,如果在前后两次编译之间,filea.c 和 a.h 均没有被修改,而且 filea.o 还存在的话,就没有必要重新编译。这种依赖关系在多源文件的程序编译中尤其重要。通过这种依赖关系的定义,make 工具可避免许多不必要的编译工作。当然,利用 shell 脚本也可以达到自动编译的效果,但是,shell 脚本将全部编译任何源文件,包括哪些不必要重新编译的源文件,而 make 工具则可根据目标上一次编译的时间和目标所依赖的源文件的更新时间而自动判断应当编译哪个源文件。

makefile 文件准备好之后,接着在 makefile 文件所在的目录下敲入 make 这个命令就可以了,根据 makefile 文件,以告诉 make 命令需要怎么样的去编译和链接目标程序。

规则

让我们先来粗略地看一看 makefile 的规则。

target … : prerequisites …

command

目标:依赖

执行指令 …

target 也就是一个目标文件,可以是 object file,也可以是执行文件。还可以是一个标签(label)。

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

② command 也就是 make 需要执行的命令。(任意的 shell 命令)

这是一个文件的依赖关系,也就是说,target 这一个或多个的目标文件依赖于 prerequisites 中的文件,其生成规则定义在 command 中。说白一点就是说,prerequisites 中如果有一个以上的文件比 target 文件要新的话,command 所定义的命令就会被执行(command 一定要以 tab 键开始,否则编译器无法识别 command),减少重复编译,提高了其软件工程管理效率。

文件定义与命令

makefile 文件作为一种描述文档一般需要包含以下

命令行中执行 makefile

◆宏定义◆ 源文件之间的相互依赖关系

◆ 可执行的命令

makefile 中允许使用简单的宏指代源文件及其相关编译信息,在 linux 中也称宏为变量。在引用宏时只需在变量前加$符号,但值得注意的是,如果变量名的长度超过一个字符,在引用时就必须加圆括号()。

有效的宏引用

$(cflags)

$z

$(z)

其中最后两个引用是完全一致的。

需要注意的是一些宏的预定义变量,在 unix 系统中,$*、$@、$?和$<四个特殊宏的值在执行命令的过程中会发生相应的变化,而在 gnu make 中则定义了更多的预定义变量。关于预定义变量的详细内容,宏定义的使用可以使我们脱离那些冗长乏味的编译选项,为编写 makefile 文件带来很大的方便。

# define a macro for the object files

objects= filea.o fileb.o filec.o

# define a macro for the library file

libes= -ls

# use macros rewrite makefile

prog: $(objects)

cc $(objects) $(libes) -o prog

此时如果执行不带参数的 make 命令,将连接三个目标文件和库文件 ls;但是如果在 make 命令后带有新的宏定义:

make “libes= -ll -ls” #如何实现?

则命令行后面的宏定义将覆盖 makefile 文件中的宏定义。若 ll 也是库文件,此时 make 命令将连接三个目标文件以及两个库文件 ls 和 ll。

在 unix 系统中没有对常量 null 作出明确的定义,因此我们要定义 null 字符串时要使用下述宏定义:

stringname= //这里有待考证

makefile 中的变量(宏)

gnu 的 make 工具除提供有建立目标的基本功能之外,还有许多便于表达依赖性关系

以及建立目标的命令的特色。其中之一就是变量或宏的定义能力。如果你要以相同的编译

选项同时编译十几个 c 源文件,而为每个目标的编译指定冗长的编译选项的话,将是非

常乏味的。但利用简单的变量定义,可避免这种乏味的工作:

# define macros for name of compiler

cc = gcc

# define a macr o for the cc flags

ccflags = -d_debug -g -m486

# a rule for building a object file

test.o: test.c test.h

$(cc) -c $(ccflags) test.c

在上面的例子中,cc 和 ccflags 就是 make 的变量。gnu make 通常称之为变量,

而其他 unix 的 make 工具称之为宏,实际是同一个东西。在 makefile 中引用变量的值

时,只需变量名之前添加 $ 符号,如上面的 $(cc) 和 $(ccflags)。

gnu make 有许多预定义的变量,这些变量具有特殊的含义,可在规则中使用。表 13-2

给出了一些主要的预定义变量,除这些变量外,gnu make 还将所有的环境变量作为自己

的预定义变量。

预定义变量

含义

$*

不包含扩展名的目标文件名称。

$

所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件。

$<

第一个依赖文件的名称。

$?

所有的依赖文件,以空格分开,这些依赖文件的修改日期比目标的创建日期晚。

$@

目标的完整名称。

$^

所有的依赖文件,以空格分开,不包含重复的依赖文件。

$%

如果目标是归档成员,则该变量表示目标的归档成员名称。例如,如果目标名称为

(image.o),则 $@ 为 ,而 $% 为 image.o。

ar

归档维护程序的名称,默认值为 ar。

arflags

归档维护程序的选项。

as

汇编程序的名称,默认值为 as。

asflags

汇编程序的选项。

cc

c 编译器的名称,默认值为 cc。

cflags

c 编译器的选项。

cpp

c 预编译器的名称,默认值为 $(cc) -e。

cppflags

c 预编译的选项。

cxx

c 编译器的名称,默认值为 g 。

cxxflags

c 编译器的选项。

fc

fortran 编译器的名称,默认值为 f77。

fflags

fortran 编译器的选项。

makefile 以文件名:文件名的形式比较冒号右边的文件是不是较左边的文件有更新,如果有更新则执行下一行的程序代码。因此 makefile 可以把文件关联起来。

(0)

相关推荐

  • centos中查看目录下文件的方法:1、打开终centos端;2、在命令行中输入“ls | wc -w ”命令查看当前目录下有多少个文件及文件夹即可。 centos 中查看目录下文…

  • 首先打开手机里的微信app,然后点击右下角进入我的个人界面,接着点击下方设置,点击聊天选项并选择聊天记录备份与迁移即可。 手机微信聊天记录同步到电脑上后,就可以在电脑上查看手机上曾…

  • 可以在运营商凯发k8官方网站官网查询,以移动为例,进入移动凯发k8官方网站官网,点击查询服务——详单查询——通话详单,之后输入对方手机号,选择短信密码,输入密码即可查看。 通话记录查询通常有三种方式,即网上营业厅…

  • 得益于全新的amd ryzen处理器,联想的ideapad flex 5 14提供了性能与物超所值的非凡融合,使其成为我们觉得非常有性价比的二合一笔记本电脑。 联想 ideapad…

  • 京东便利店是可以用京东白条支付的,但是需要注意,在用白条支付交易的时候,该用户白条账户状态必须是正常的;并且消费金额不能超过白条可用额度。 大家在京东便利店消费的时候,是可以用白条…

  • iphone 13 已经上市接近三周的时间,目前苹果凯发k8官方网站官网的 iphone 13 / 13 mini 供货情况有所缓解,而 iphone 13 pro 系列依然严重缺货。

    2021年11月9日 科技
  • 花呗的钱是不可以借出到微信的,除此之外,花呗的金额也不是不可以提现的。花呗只能是在使用支付宝进行消费、淘宝购物时使用,其额度的使用场景是非常有限的。 花呗的钱是不可以借出到微信的,…

  • razer 构建了一个新的生产力套件,其中包括 pro type 键盘(140 美元),pro click 鼠标(100 美元)和 pro glide 鼠标垫(10 美元)。该鼠标…

  • tcl 首次推出了一种新型的薄纸显示器,称为 nxtpaper,旨在在使用设备时提供更好的护眼功能。 作为 tcl 在 ifa 2020 上发布的一系列公告的一部分,该公司于周四推…

  • updraftplus 中的一个漏洞允许用户下载完整的站点备份。 过去几天,数以百万计的 wordpress 网站收到了强制补丁。原因是 updraftplus 中的一个漏洞,这是…

  • x5.tbs.org是qq浏览器的内核文件,其作用为支持手机调用x5内核浏览网页。用户可以选择删除该文件。不过,当你再次使用腾讯系app,它又会重新生成。 x5.tbs.org 是…

  • 信用卡降额后一次性还不上,如果银行要求用户一次性还上,那么可以先向身边的亲朋好友借钱来归还信用卡的欠款。而银行没有要求用户一次性还上,信用卡被降额后,用户仍然可以最低还款、分期还款…

  • 如果公司没有固定电话,可以跟业务员说明该情况,看看是否能提交申请,不同银行有不同的要求。之所以要求有单位固话,是因为银行审核过程中会进行电话回访。 用户在申请信用卡时没有单位电话,…

  • numpy 是 python 语言的一个扩展程序库。支持高阶大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。 numpy 是 python 语言的一个扩展程序库。…

  • 可以通过关联他的手机来对微信进行内容的同步,关联手机最简单的一个方法就是通过验证码来进行关联,比如说华为,就有一个华为的账号。对他的手机进行账号的绑定,然后通过登录手机的账号进入里…

发表回复

登录后才能评论
网站地图