Linux中makefile

这篇具有很好参考价值的文章主要介绍了Linux中makefile。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 文章来源地址https://www.toymoban.com/news/detail-584110.html

第一个版本的makefile

Makefile的依赖是从上至下的,换句话说就是目标文件是第一句里的目标如果不满足执行依赖,就会继续向下执行如果满足了生成目标的依赖,就不会再继续向下执行了

Make会自动寻找依赖条件所用到的文件,

 其中,我们可以在中makefile文件中一次执行多个文件,执行命令是make,文件名可以是makefile或是Makefile,必须是这个名字,因为make与之匹配,

在其中我们可以

Makefile是一个脚本文件,该文件存放的是shell命令,既然是脚本文件,就要遵守makefile制定的规则(显示规则)。所以最开始的makefile可以是这样的

Linux中makefile,linux,运维,服务器

前面的hello是所需生成的目标文件,后面的hello.c是生成目标文件所需的依赖文件, 

 

为了将编译的整个过程体现出来,Makefile中的内容可以如下

Linux中makefile,linux,运维,服务器

执行Make指令之后的文件如下 

 Linux中makefile,linux,运维,服务器

但是hello.i hello.s这些文件都是我们不需要的,所以不需要这么多步骤,hello依赖于hello.o,hello.o依赖于hello.c。所以改写makefile的内容

Linux中makefile,linux,运维,服务器 

执行Make指令之后的文件如下所示

Linux中makefile,linux,运维,服务器 

 以上是对单个文件进行编写的makefile,如果是多文件编程的话,应该怎么编写makefile文件?假设文件有add.c mul.c div.c main.c四个文件

Linux中makefile,linux,运维,服务器

Main.c 

Linux中makefile,linux,运维,服务器

 Add.c

Linux中makefile,linux,运维,服务器

Mul.c 

Linux中makefile,linux,运维,服务器

div.c

Linux中makefile,linux,运维,服务器 对于这四个文件,makefile文件中可以这样写

 Linux中makefile,linux,运维,服务器

 执行make指令后是这样的

Linux中makefile,linux,运维,服务器

但是这样的makefile是存在问题的,当我修改其中的一个文件后,其他三个文件就必须跟着一起重新编译,效率太低。比如改写add.c文件

Linux中makefile,linux,运维,服务器 

Linux中makefile,linux,运维,服务器 

其他三个文件也一起被编译了一遍。

总共有四个文件,需要生成main可执行文件,main依赖于add.o、mul.o、div.o,这三个文件又分别依赖于各自的.c文件,所以makefile可以改写成这样

Linux中makefile,linux,运维,服务器

执行make指令后

Linux中makefile,linux,运维,服务器 

 此时去修改其中任一个文件,其他文件不会被重新编译,比如修改add.c

Linux中makefile,linux,运维,服务器

修改完之后再重新make一下,发现其他文件并没有被重新编译,只执行了 编译add.c和链接.o文件这两个动作Linux中makefile,linux,运维,服务器 

为什么会仅执行这两个动作呢?

Makefile的检测原理:

文件有一个属性叫做“修改时间”,当文件被修改后,这个属性就会发生改变。Make就是通过检测这个属性判断哪些文件有没有被修改过。

如果出现目标文件的“修改时间”比依赖文件的“修改时间“更早的话,比如 16:40 早于 16:41。这样的话,make就会重新执行这条规则(重新编译);

Add.o依赖于add.c。add.c 是依赖文件,add.o是目标文件,add.c一被修改,时间就比add.o更晚。所以gcc -c add.c -o add.o 这条规则会重新被执行。一执行后,add.o的时间就比main的时间更晚,所以gcc main.o add.o mul.o div.o 这条规则也会被执行。

关于makefile中的变量

变量的定义:

变量名 = 目标名 等价于 替换功能

变量的使用:

$(变量名)

关于makefile指定最终生成目标问题

Makefile默认将第一条目标视作最终目标,一旦最终目标生成后,其他指令不会继续执行,当将main: add.o mul.o div.o 移到最后时

Linux中makefile,linux,运维,服务器

再去执行make指令,仅仅会生成一个main.o文件,其他文件不会被生成。Linux中makefile,linux,运维,服务器 

再将mul.o:mul.c放在第一条目标验证一下Linux中makefile,linux,运维,服务器 

执行make指令后,只生成了mul.o

Linux中makefile,linux,运维,服务器

 

所以可以通过ALL:(最终目标)去指定一个最终目标,ALL需要放在第一条语句

Linux中makefile,linux,运维,服务器

执行完make指令后Linux中makefile,linux,运维,服务器 

Makefile的两个函数和伪目标

src = $(wildcard *.c)

函数名:wildcard

函数功能:找到当前目录下所有后缀为.c的文件,将文件名组成列表,赋值给src

结果: src = add.c div.c mul.c main.c

obj = $(patsubst %.c,%.o, $(src))

函数名:patsubset

函数功能:将参数3($(src))中,包含参数1(%.c)的部分,替换成参数2

$(src)是一个列表,%会依次顺序遍历列表中的.c文件

结果:obj = add.o div.o mul.o main.o

根据这两个函数,所以makefile可以改写成这样Linux中makefile,linux,运维,服务器

执行make指令后Linux中makefile,linux,运维,服务器 

关于伪目标的问题

在上面的makefile文件中,每次都需要删除.o文件,很繁琐,所以在makefile文件中加了删除部分Linux中makefile,linux,运维,服务器

 通过执行make clean指令可以删除多余的.o文件Linux中makefile,linux,运维,服务器

rm前面的-,代表出错依然执行。

Make clean -n 是模拟删除动作,并未真正删除,看到模拟执行后,确定没有问题,执行删除动作Linux中makefile,linux,运维,服务器

但是如果你在当前目录下去创建一个clean文件,当你执行make clean的时候系统就会认为你要执行clean文件,从而干扰原本的执行命令。Linux中makefile,linux,运维,服务器 

此时可以在makefile文件中的伪目标clean前加上.PHONY:来指定伪目标从而去除干扰:Linux中makefile,linux,运维,服务器 

此时再次执行make clean看一下效果:Linux中makefile,linux,运维,服务器 

这时候就算在本文件下有clean文件也不会造成干扰。

在上面的makefile中,各个生成.o的指令还是很繁琐,应该怎么办?

关于makefile3个自动变量和模式规则的问题

3个自动变量

$@ :在规则命令中,表示规则中的目标

$^ :在规则命令中,表示所有的依赖条件 

$<:这个只能使用在规则命令中,表示规则中的第一个依赖条件。如果将该变量使用在模式规则中,它可以将依赖条件列表中的依赖依次取出,套用模式规则。

所以可以将makefile改写成这个样子,sub,add这些指令中使用$<和$^都能达到效果,但是为了模式规则,所以使用的$<Linux中makefile,linux,运维,服务器

执行make指令后Linux中makefile,linux,运维,服务器 

 

上面的makefile不能进行扩展,可扩展性不行。比如,要添加一个乘法函数,就需要在makefile里面增加乘法函数的部分。不科学,所以,模式规则就来了

%.o:%.c

gcc -c $< -o $@

修改makefile,如下Linux中makefile,linux,运维,服务器

 

 执行make指令Linux中makefile,linux,运维,服务器

 

 

此时再添加一个乘法函数,无须更改makefile。

扩展:

当文件中存在clean文件时,make失灵Linux中makefile,linux,运维,服务器

添加一个伪代码Linux中makefile,linux,运维,服务器 

再使用变量完善一下Linux中makefile,linux,运维,服务器 

 

 

 

 

Linux中makefile,linux,运维,服务器

 

到了这里,关于Linux中makefile的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux本地部署1Panel服务器运维管理面板并实现公网访问

    1Panel 是一个现代化、开源的 Linux 服务器运维管理面板。高效管理,通过 Web 端轻松管理 Linux 服务器,包括主机监控、文件管理、数据库管理、容器管理等 下面我们介绍在Linux 本地安装1Panel 并结合cpolar 内网穿透工具实现远程访问1Panel 管理界面 执行如下命令一键安装 1Panel: 安

    2024年02月04日
    浏览(92)
  • Linux服务器常见运维性能测试(1)综合跑分unixbench、superbench

    最近需要测试一批服务器的相关硬件性能,以及在常规环境下的硬件运行稳定情况,需要持续拷机测试稳定性。所以找了一些测试用例。本次测试包括在服务器的高低温下性能记录及压力测试,高低电压下性能记录及压力测试,常规环境下CPU满载稳定运行的功率记录。 这个系

    2024年02月04日
    浏览(75)
  • [1Panel]开源,现代化,新一代的 Linux 服务器运维管理面板

    本期测评试用一下1Panel这款面板。1Panel是国内飞致云旗下开源产品。整个界面简洁清爽,后端使用GO开发,前端使用VUE的Element-Plus作为UI框架,整个面板的管理都是基于docker的,想法很先进。官方还提供了视频的使用教程,本期为大家按照本专栏的基本内容进行多方面的测评。

    2024年02月07日
    浏览(89)
  • 华为云云耀云服务器L实例评测 | Linux系统宝塔运维部署H5游戏

    本章节内容,我们主要介绍华为云耀服务器L实例,从云服务的优势讲起,然后讲解华为云耀服务器L实例资源面板如何操作,如何使用宝塔运维服务,如何使用运维工具可视化安装nginx,最后部署一个自研的H5的小游戏(6岁的小朋友玩的很开心😁)。 前端的同学如果想把自己

    2024年02月07日
    浏览(56)
  • Linux服务器常见运维性能测试(3)CPU测试super_pi、sysbench

    最近需要测试一批服务器的相关硬件性能,以及在常规环境下的硬件运行稳定情况,需要持续拷机测试稳定性。所以找了一些测试用例。本次测试包括在服务器的高低温下性能记录及压力测试,高低电压下性能记录及压力测试,常规环境下CPU满载稳定运行的功率记录。 这个系

    2024年02月02日
    浏览(52)
  • Linux运维:makefile

    Makefile 是一种用于自动化构建的文件,它描述了一个软件项目的编译规则和依赖关系,并提供了一些工具来自动执行这些规则。 Makefile 的主要作用如下: 自动化编译:通过 Makefile,可以定义项目中的编译规则和依赖关系。这样,当源代码发生变化时,只需要执行 make 命令,

    2024年02月06日
    浏览(30)
  • 迁移Linux服务器用户数据(将一个服务器的Linux用户数据迁移到另一个Linux服务器用户的流程)

    先来到根目录,再使用tar命令打包数据: tar czvf root.zip.gz ./* 在根目录使用指令: scp 打包好的数据 用户@ip:目的用户下的某个目录 源Linux服务器用户 : 查看压缩包是否到达: 对收到的数据进行解压,使用指令 tar xzvf root.zip.gz 解压到当前目录下。 目的Linux服务器用户 : 看到

    2024年02月08日
    浏览(48)
  • 【Linux学习笔记】Linux服务器:配置与管理samba服务器

    一、【linux学习笔记】红帽Linux 7.8系统在虚拟机上的安装 二、【Linux学习笔记】Linux系统的基本操作  三、【Linux学习笔记】管理Linux操作系统:用户管理  四、【Linux学习笔记】管理Linux操作系统:磁盘管理 五、【Linux学习笔记】管理Linux操作系统:软件安装  六、 【Linux学习

    2024年02月02日
    浏览(45)
  • linux服务器禁止ping命令,linux服务器禁ping如何解除

      我是艾西,在我们搭建网站或做某些程序时,不少人会问禁ping是什么意思,怎么操作的对于业务有哪些好处等,今天艾西一次给你们说清楚。 禁PING的意思是:不允许电脑、设备或服务器使用PING功能。一般情况下电脑、防火墙、服务器都是允许PING功能的,不需要特别设置

    2023年04月20日
    浏览(48)
  • 【Linux】云服务器搭建Linux环境

    目录 🍊一.环境选择🍊 🍎二.购买云服务器🍎 🍏三.使用XShell远程登录云服务器🍏 1.下载XShell 2.进入授权界面,填写姓名和邮件,选择只需Xshell   3.填写信息后,会将下载链接发到邮件,点击链接下载安装即可 4.进入XShell ,使用命令行方式远程登录云服务器          

    2024年02月04日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包