我的编程空间,编程开发者的网络收藏夹
学习永远不晚

浅析Linux中makefile和make规则

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

浅析Linux中makefile和make规则

  什么是makefile和make规则,估计大部分Linux初学者对此可能都不太清楚。为此在本文中编程学习网笔者就为各位Linux初学者简单介绍下其具体的语法含义组成和用法供大家参考学习,让大家对此有一个进一步的了解。

浅析Linux中makefile和make规则_考试认证_Linux认证_Linux_编程学习网

  ◎make命令

  语法:make [选项] [目标] [宏定义]

  说明:通过命令行参数中的target可以指定make要编译的目标,并且允许同时定义编译多个目标,在操作时我们按照从左向右的顺序依次编译target选项中指定的目标文件。如果命令行中没有指定目标则系统默认target指向描述文件中第一个目标文件。

  参数:

  -d    显示调试信息

  -n    不运行任何makefile文件只打印需要执行的命令

  -p    输出所有宏定义和目标文件描述

  -s    静止状态下运行不显示任何命令行信息

  -f file    通知make程序从file中读取内部依赖说明,缺省情况下会读取makefile或者Makefile文件处理,文件名“-表示读取标准输入,在Linux中GNU make工具在当前工作目录中按照GNUmakefile、makefile、Makefile的顺序搜索makefile文件。

  PS:在源文件没有被修改的情况下运行make命令会生成一条消息来说明源文件的可执行文件是最新的,不需要用make命令重新编译和链接。如果我们要强制再创建可执行代码则需要改变源文件的上次更新时间,我们可以使用touch命令再次运行make命令,下面是touch命令的语法和参数:

  语法:touch [选项] 文件或目录

  参数:

  -r 文件或目录  把指定文件或目录的日期时间设成和参考文件或目录的日期时间相同

  -d 日期时间  使用指定的日期时间而非现在的时间

  ◎makefile规则

  make程序基于文件之间的依赖性,需要建立的目标文件,以及建立目标文件时要执行的命令,以上所有被称为规则,存放在文件makefile中。定制规则的语法如下:

  目标列表 : 关联性列表

  <TAB>命令列表

  下面是三个值得大家注意的地方:

  ①我们可以在关联性列表和命令列表中使用shell文件名模式匹配字符,比如“?*[]”等等。

  ②如果目标的命令列表中某个命令前面带有@,那么当make程序执行时该命令是不会有反应的。在程序运行完毕之后,所有前面带@的命令按照反序执行。通常我们可以通过执行make -n命令显示这些命令以供查看。

  ③如果目标的命令列表中某个命令前面带有-,说明如果该命令执行有误,一般会跳过该命令并继续执行。

  make程序使用makefile中的规则决定程序中需要重新编译的文件并再次链接生成可执行代码。如果源文件上修改的时间戳比目标文件上的时间戳更新,那么make重新编译build中包含的源文件。比如如果修改了一个.h头文件,make程序就会重新编译所有包含该头文件的源文件,前提是头文件在这些源文件的目标文件的关联性列表中;再如某.c源文件被修改,那么该源文件被重新编译生成对应的新的目标文件。

  myprog : foo.o bar.o

  gcc –o myprog foo.o bar.o

  foo.o : foo.c foo.h bar.h

  gcc –o foo.o –c foo.c

  bar.o : bar.c bar.h

  gcc –o bar.o –c bar.c

  在上述规则中只要目标文件比冒号后面的文件任何一个旧就会执行下一行的命令。但是在检查foo.obar.o的时间之前会往下查找那些把foo.obar.o作为目标文件的规则,以此类推并最终回到myprog规则。或许有人会问如何得到每个C文件的输出规则呢?其实我们可以通过使用-M-MM编译选项来实现,具体的命令如下:

  gcc–M hello.c//输出hello.c和该文件中所有<>和””包含的头文件

  gcc–MM hello.c//仅输出hello.c和该文件中所有””包含的头文件

  PS:使用-M和-MM编译选项时仅在shell中输出规则信息,不能用于产生可执行文件也就是不能写成gcc -o hello -M hello.c这样的形式。

  ◎后缀(隐含)规则

  make -p命令显示了所有后缀规则列表。为了建立一个目标make使用程序会遍历一连串的依赖关系从而决定从何处开始建立。如果没有找到目标文件make程序按照优先顺序查找源文件,它会首先查找.c.f.s后缀的文件,然后再查找SCCS(带.c~后缀)文件,如果没有找到任何一个源文件,make程序就会报告一个异常。

  一般来说make程序知道调用gcc -c xxx.c -o xxx.o的预定义命令,而且还知道目标文件通常和源文件是相同的,这种功能称作标准依赖性,所以foo.o : foo.c foo.h bar.h这样的语句可以简写成foo.o : foo.h bar.h。同时,如果把生成foo.o和bar.o的命令从规则中删除,make将自动查找它的隐含规则(gcc -M/MM输出的代码),然后找到一个适当的命令,命令中会使用一些变量且按照一定步骤设定。因此上述makefile的内容可以根据后缀规则简写成:

  myprog : foo.o bar.o

  gcc –o myprog foo.o bar.o

  foo.o : foo.h bar.h

  bar.o : bar.h

  ◎宏定义(变量)

  makefile中的变量定义可以存储文件名列表、可执行文件名以及编译器标识等,一般主要通过使用如下方法来进行:

  VAR=name 变量定义

  define VAR

  name

  endef 同上

  $(VAR) 使用变量,如果变量名为单字符,可以不使用圆括号或花括号

  ${VAR} 同上

  $@  当前目标文件

  $* 删除了后缀的目标名

  $< 依赖列表中,比当前目标更新的当前依赖名称(即第一个依赖文件)

  $^  整个依赖列表

  $? 依赖列表中,比当前目标更新的当前依赖列表

  CFLAGS 通常默认值是-O,但是可以被修改

  未使用后缀规则的makefile文件变成如下:

  OBJS=foo.o bar.o

  SOURCES=foo.c bar.c

  HEADERS=foo.h bar.h

  CC=gcc

  CFLAGS=-Wall -O -g

  myprog : $(OBJS)

  $(CC) $^ -o $@

  foo.o : foo.c foo.h bar.h

  $(CC) $(CFLAGS) –c $< -o $@

  bar.o : bar.c bar.h

  $(CC) $(CFLAGS) –c $< -o $@

  使用了后缀规则的makefile文件变成如下:

  OBJS=foo.o bar.o

  SOURCES=foo.c bar.c

  HEADERS=foo.h bar.h

  CC=gcc

  myprog : $(OBJS)

  $(CC) S^ -o $@

  foo.o : foo.h bar.h

  bar.o : bar.h

  ◎虚目标

  所谓虚目标我们可以理解为假设一个项目最后需要产生两个可执行文件exec1和exec2,但两个文件是相互独立的,此时可使用假想目的all来达到效果,具体命令如下:

  all : exec1 exec2

  all文件其实并不存在,但是make总是会假设它需要被生成,因此会检查它的依靠文件exec1和exec2是否需要更新。当把它的依靠文件更新后就会执行它的规则里的命令行,但是在规则里没有哪个命令作用于名为all的实际文件,所以该规则并不真正改变all的状态。注意下面的语句用法,这些语句可以添加到makefile文件后:

  myprog.tar : makefile $(SOURCES) $(HEADERS)

  tar -cvf $@ S^

  clean :

  rm *.o

  当make命令不带参数执行时最后两个目标myprog.tar和clean的命令不会执行,因为这些文件没有依赖文件。我们将这两个目标作为参数传递给make命令就可以调用与目标关联的命令。比如我们执行make myprog.tar命令会执行tar -cvf myprog.tar makefile foo.c bar.c foo.h bar.h语句,而执行make clean命令会执行clean *.o语句。下面笔者给大家给出一个较完整的makefile文件:

  ---------------------------------------------------------

  #Updated makefile that uses some built-in macros and

  #@-preceded commands

  define CC

  gcc

  endef

  OPTIONS=-03

  OBJECTS=main.o input.o compute.o

  SOURCES=main.c input.c compute.c

  HEADERS=main.h input.h compute.h

  complete : power

  @echo "Build complete"

  power : $(OBJECTS)

  $(CC) $(OPTIONS) -o $@ $^ -lm

  @echo "The executable is in the 'power' file"

  main.o : main.h input.h compute.h

  compute.o : compute.h

  input.o : input.h

  power.tar : makefile $(HEADERS) $(SOURCES)

  tar -cvf $@ $^

  clean :

  rm -f *.o

  -----------------------------------------------------

  最终执行结果为:

  -----------------------------------------------------

  $ make

  gcc -c main.c -o main.o

  gcc -c input.c -o input.o

  gcc -c compute.c -o compute.o

  gcc -o3 -o power main.o input.o compute.o -lm

  The executable is in the 'power' file

  Build complete

  $ make power.tar

  tar -cvf power.tar makefile main.h input.h compute.h main.c input.c compute.c

  makefile

  main.h

  input.h

  compute.h

  main.c

  input.c

  compute.c

  $ make clean

  rm -f *.o

  以上就是Linux中makefile和make规则的简单介绍。

  本次的浅析Linux中makefile和make规则的讲解到此就暂告一段落,如果以后有什么相关的内容继续进行补充或者修改的话,笔者会在此继续进行相关的内容的补充或者修改的工作,同时也欢迎大家对本次的讲解提出自己的建议和补充。最后笔者希望本次的讲解对大家学习Linux和Linux认证能够起到一定的帮助作用!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

浅析Linux中makefile和make规则

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

浅析Linux中makefile和make规则

  什么是makefile和make规则,估计大部分Linux初学者对此可能都不太清楚。为此在本文中编程学习网笔者就为各位Linux初学者简单介绍下其具体的语法含义组成和用法供大家参考学习,让大家对此有一个进一步的了解。  ◎make命令  语法:make [选项] [目标] [宏定义]  说明:通过命令行参数中的targ
浅析Linux中makefile和make规则
2024-04-17

深入浅析Spring MVC中的URL映射规则

今天就跟大家聊聊有关深入浅析Spring MVC中的URL映射规则,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。url-pattern
2023-05-31

如何浅析.NET中文变量及方法的命名规则

这期内容当中小编将会给大家带来有关如何浅析.NET中文变量及方法的命名规则,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。我们将介绍.NET中文变量及方法的命名规则,相信通过规范的.NET中文变量及方法的命
2023-06-17

PHP中单引号和双引号的使用规则解析

在PHP中,单引号和双引号是两种常见的字符串包裹方式,它们在使用时有着不同的特点和规则。本文将分别对单引号和双引号的使用规则进行解析,并提供具体的代码示例来帮助读者更好地理解它们的区别。一、单引号的使用规则:单引号内的内容会被原样输出,不
PHP中单引号和双引号的使用规则解析
2024-03-05

浅析Linux中使用nohup及screen运行后台任务的示例和区别

使用SSH终端(比如putty,xshell)连接linux服务器上运行比较耗时任务,可能需要几个小时甚至几天才能完成,这时候终端被占据,我们还要做其他的任务呢,所以需要将这一类耗时任务放到后台来跑,只需要记录好日志就行了,有下面这些常用方
2022-06-04

编程热搜

  • 华为高级工程师认证费用
      华为高级工程师认证费用是多少?华为高级工程师认证要多少钱?华为高级工程师认证是华为认证体系中用于标识个人能力在某一技术领域达到高级工程师级别的证明,认证费用为200美金,通过考试取得的证书3年有效。  华为高级工程师认证费用是必修方向和选修方向的总和,其中必修方向认证费用为300美金,选修方向认证费用为180美金。
    华为高级工程师认证费用
  • 2024年初级软考上半年考试时间安排
    初级软考每年安排两次考试,2024年初级软考上半年考试时间已公布,2024年初级软考上半年考试时间为5月25-28日。2024年初级软考上半年报名时间及入口:根据往年各省初级软考报名时间来看,2024年上半年初级软考报名时间3月份开始,具体请考生关注全国各省2024上半年软考报名时间及入口汇总表,希赛小编将及时为大家更
    2024年初级软考上半年考试时间安排
  • HCIA证书和HCIE哪个比较好?
      HCIA证书和HCIE哪个比较好?华为认证包含三个等级,分别是HCIA(华为认证网络工程师)、HCIP(华为认证网络资深工程师)、HCIE(华为认证互联网专家)认证。  HCIA(Huawei Certified ICT Associate )即华为认证ICT工程师,是华为职业认证中用于标识个人能力在某一技术领域达
    HCIA证书和HCIE哪个比较好?
  • 教你在PPT中创建好看的镜像效果
      当我们在阅读杂志书刊,或者看电影的时候常常都会看到像下图一样的原图片与图片镜像的组合效果的图片,在很多的摄影作品中也会有,我们其实也可以在PPT中轻松实现这种应用于各大媒介的图文特效技巧,不信的话我们一起来学习一下,操作过程其实并不复杂!  下面我们就开始我们的具体操作步骤了,首先第一步,我们需要先打开PowerP
    教你在PPT中创建好看的镜像效果
  • 多媒体应用设计师可以提前交卷吗
      可以。但是多媒体应用设计师提前交卷有时间限制,根据软考的考场规则,按照人力资源和社会保障部文件规定,开考5分钟后应试人员一律禁止入场。专业技术人员资格考试原则上封闭2个小时,不足2小时的全程封闭。  软考多媒体应用设计师属于专业技术人员资格考试,专业技术人员资格考试原则上封闭2个小时,不足2小时的全程封闭。  根据
    多媒体应用设计师可以提前交卷吗
  • 全国计算机二级C语言程序设计章节练习题及答案(1)
      对于备考计算机二级C语言考试的考生可以多做试题,一方面了解往年考试题型,一方面熟悉往年考点。今天编程学习网小编给大家准备了全国计算机二级C语言程序设计章节练习题及答案(1),供考生们练习。  点击查看:全国计算机二级C语言程序设计章节练习题及答案汇总  判断题  ×1.C++语言和C语言都是面向对象的程序设
    全国计算机二级C语言程序设计章节练习题及答案(1)
  • 广西2024上半年计算机软考什么时候报名?
    广西2024上半年计算机软考3月25日开始报名,具体报名时间见全国各省2024上半年软考报名时间及入口汇总表。2024上半年广西软考考试采用网络报名的方式,考生在规定的报名时间内进入中国计算机技术职业资格网,点击页面右下方的报名入口,进入全国计算机技术与软件专业技术资格(水平)考试网上报名平台,选择“广西”入口后点击进
    广西2024上半年计算机软考什么时候报名?
  • 软考可以申请退税吗
      可以。软考证书是可以抵扣个税的,按照个税6项专项附加扣除标准,在取得软考证书的当年,可以按照3600元定额扣除。  软考证书可以抵扣个税,根据国务院印发的《个人所得税专项附加扣除暂行办法》,第三章继续教育包含三条,具体内容如下:  第八条 纳税人在中国境内接受学历(学位)继续教育的支出,在学历(学位)教育期间按照每
    软考可以申请退税吗
  • win10如何正确禁用IPv6网络协议
       在Windows Vista和Server 2008开始,微软包括本地支持的IPv6(互联网协议第6版),并默认启用。IPv6是新的计算机的地址协议,最终将取代IPv4这是目前最流行的标准。win10中默认开启了对IPv6协议的支持,但是会影响到系统运行速度和磁盘占有率等。除非你的网络有IPv
    win10如何正确禁用IPv6网络协议
  • 2020年数据库系统工程师上午真题及答案解析
      2019上半年数据库系统工程师考试已结束,今天编程学习网小编为大家整理了2020年数据库系统工程师上午真题及答案解析,以便大家了解2020下半年数据库系统工程师基础知识考试真题。  软考数据库系统工程师上午考试为基础知识,编程学习网小编为大家整理了2020年数据库系统工程师上午真题,想知道答案和解析的考生可以直接进入在线题
    2020年数据库系统工程师上午真题及答案解析

目录