【Linux】Linux项目自动化构建工具-make/makefile

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

🎉博客主页:小智_x0___0x_

🎉欢迎关注:👍点赞🙌收藏✍️留言

🎉系列专栏:Linux入门到精通

🎉代码仓库:小智的代码仓库

什么是make/makefile?

  • 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作。
  • makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编 译,极大的提高了软件开发的效率。
  • make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。
  • make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建

make/makefile的使用

我们之前编译程序要使用gcc/g++的各种指令来进行编译>
比如我们建立一个mycode.c:
【Linux】Linux项目自动化构建工具-make/makefile,Linux入门到精通,linux,自动化,运维
在没有学习make/makefile之前我们想要编译这段代码需要使用这行指令gcc -o mycode mycode.c我们编译来看:
【Linux】Linux项目自动化构建工具-make/makefile,Linux入门到精通,linux,自动化,运维
可以看到程序可以被编译执行。
我们再来使用make/makefile来进行操作:

  1. 首先创建一个空白文件makefile/Makefile(首字母大小写都可以):
    【Linux】Linux项目自动化构建工具-make/makefile,Linux入门到精通,linux,自动化,运维
  2. 使用vim编辑器打开文件:
    【Linux】Linux项目自动化构建工具-make/makefile,Linux入门到精通,linux,自动化,运维
    在文件中写入这些代码,保存并退出。
  3. 终端输入make进行代码编译:
    【Linux】Linux项目自动化构建工具-make/makefile,Linux入门到精通,linux,自动化,运维
    可以看到使用make指令,也可以对代码进行编译,也不用我们每次都去敲那么长的gcc指令,而且还很容易敲错。
  4. 使用make clean对项目进行清理。
    【Linux】Linux项目自动化构建工具-make/makefile,Linux入门到精通,linux,自动化,运维
    可以看到的确清理了我们生成的可执行程序。

依赖关系

我们来看makefile中的内容:
【Linux】Linux项目自动化构建工具-make/makefile,Linux入门到精通,linux,自动化,运维
第一行就代表依赖关系,意思就是mycode的生成要依赖于mycode.c
这里举个例子:

小李到了月末给他自己的父亲打了个电话要生活费。

小李为什么要给他父亲打电话而不是给他室友的父亲打电话要生活费呢,这是因为,小李和他父亲是依赖关系,小李依赖于他的父亲,而小李跟他室友的父亲没有任何关系。

依赖方法

【Linux】Linux项目自动化构建工具-make/makefile,Linux入门到精通,linux,自动化,运维
这一行缩进的就代表依赖方法,意思是要执行的指令。
再使用上面的例子进行解释就是:
小李打电话提到的要生活费就是打电话的主要目的,而实行要生活费的这个操作就是依赖方法。

makefile是如何工作的?

【Linux】Linux项目自动化构建工具-make/makefile,Linux入门到精通,linux,自动化,运维
我们把上篇学到的预处理编译链接的过程也加到makefile中,再来使用make指令>
【Linux】Linux项目自动化构建工具-make/makefile,Linux入门到精通,linux,自动化,运维
可以看到他也生成了对应的文件,而且我们上面也没有按照程序的执行顺序来写,makefile也可以帮我们完成,这可以说明make会自动推导makefile中的依赖关系
那如果我们再makefile中删去一行指令那么程序还可以继续正常执行吗?
我们来试试看>
【Linux】Linux项目自动化构建工具-make/makefile,Linux入门到精通,linux,自动化,运维
可以看到给我们报错说要产生mycode.o需要依赖mycode.s,而我们刚刚正好删除了生成mycode.s文件的那两行代码

为什么要使用makefile呢?

使用Makefile的主要目的是为了自动化构建和管理项目。Makefile是一个文本文件,其中包含了一系列规则和命令,用于告诉构建工具如何编译、链接和生成项目中的各个组件。

下面是使用Makefile的几个重要原因:

  1. 自动化构建:Makefile可以定义一系列构建规则和依赖关系,使得整个项目的构建过程变得自动化。通过运行make命令,构建工具会根据Makefile中定义的规则判断需要重新编译哪些文件,并自动执行相应的编译、链接操作,从而减少手动操作和避免人为错误。

  2. 管理复杂的项目:在大型项目中,可能涉及多个源文件、库文件和配置文件之间的复杂依赖关系。Makefile可以让您清晰地定义这些依赖关系,确保正确的文件被编译和链接,以及正确的文件被重建。

  3. 跨平台使用:Makefile是跨平台的构建工具,可以在不同的操作系统上使用。它支持各种编程语言和开发环境,使得项目在不同平台上具有一致的构建方式。

  4. 增量编译:Makefile利用文件的时间戳来确定是否需要重新编译某个文件。只有当文件的依赖发生变化或文件本身被修改时,相关的规则才会重新执行。这种增量编译的机制可以大幅提升项目的构建效率,避免不必要的重复工作。

  5. 高度可定制:Makefile具有很高的灵活性和可定制性。您可以根据项目的需求定义自己的规则和命令,满足特定的构建和部署需求。您还可以轻松地扩展Makefile,添加新的目标、参数或规则,以适应项目的变化。

综上所述,使用Makefile可以提高项目的开发效率、降低出错的可能性,简化构建过程并实现自动化管理,特别适用于较大、复杂的软件项目。

makefile是怎么做到的呢?

我们再来使用make来编译源代码:
【Linux】Linux项目自动化构建工具-make/makefile,Linux入门到精通,linux,自动化,运维
我们再在已经编译的基础上再次使用make指令>
【Linux】Linux项目自动化构建工具-make/makefile,Linux入门到精通,linux,自动化,运维
可以看到make拒绝的我的操作。这是因为生成的可执行程序是最新的。
一定是源文件形成的可执行,先有源文件,才有可执行,一般而言,源文件的最近修改时间 比可执行修改时间要老的!
如果我更改了源文件,历史上曾经还有可执行程序,那么源文件的修改时间,一定是比可执行程序要新的,这是我们再使用make就可以完成代码的编译。
因此只需要比较可执行程序的修改时间 和 源文件的修改时间

  1. .exe 新于 .c 源文件是老的,不需要重新编译
  2. .exe 老于 .c 源文件是新的,需要重新编译

一般而言.exe!=.c
这里有一个stat指令可以查看文件所对应的时间
【Linux】Linux项目自动化构建工具-make/makefile,Linux入门到精通,linux,自动化,运维

  • Access(访问):表示获取或读取数据或文件的操作。当您执行访问操作时,您可以查看或检索数据的内容或状态,而不会改变其原始内容。例如,访问一个文件可以读取文件的内容或元数据,但不会对文件进行修改。

  • Modify(修改):表示对数据或文件进行更改的操作。当您执行修改操作时,您会对数据或文件进行更改,以更新其内容或状态。这可能涉及编辑、添加、删除等操作,以使数据或文件发生变化。例如,修改一个文本文件可以编辑文件的内容并保存修改后的版本。

  • Change(变更):是一个更广泛的术语,通常用于表示对数据或文件进行任何形式的更改。它可以包括访问和修改以及其他操作。"Change"一词没有具体指明执行了哪些操作,因此具体操作的含义可能需要根据上下文来确定。

make会根据源文件的新旧和目标文件的新旧(根据Modify时间进行比较),判定是否需要重新执行依赖关系进行编译。

make和make clean

【Linux】Linux项目自动化构建工具-make/makefile,Linux入门到精通,linux,自动化,运维
为什么使用make可以直接执行源文件编译操作,而项目清理需要使用makefile呢?
我们来吧两个顺序颠倒一下试试看:
【Linux】Linux项目自动化构建工具-make/makefile,Linux入门到精通,linux,自动化,运维
通过这个例子我们可以得出make指令的操作是执行makefile中的第一个依赖关系。

.PHONY:伪目标

通过上面我们可以了解到依赖关系不一定总是执行的,那如果我们想让依赖关系总是执行呢?
这里可以通过.PHONY:伪目标具体使用方法:
【Linux】Linux项目自动化构建工具-make/makefile,Linux入门到精通,linux,自动化,运维
这就好比我们告诉makefile以后遇到mycode就不要阻拦了,让他直接操作。
这个一般多用于修饰clean:

特殊符号

makefile中可以简写可以使用 $@ 代替要生成的目标文件,用 $^代表目标文件:
【Linux】Linux项目自动化构建工具-make/makefile,Linux入门到精通,linux,自动化,运维
如果执行make或者make clean之后不想看到指令回显可以在指令前面加上@修饰:
【Linux】Linux项目自动化构建工具-make/makefile,Linux入门到精通,linux,自动化,运维

🍀小结🍀

今天我们学习了Linux项目自动化构建工具-make/makefile相信大家看完有一定的收获。
种一棵树的最好时间是十年前,其次是现在! 把握好当下,合理利用时间努力奋斗,相信大家一定会实现自己的目标!加油!创作不易,辛苦各位小伙伴们动动小手,三连一波💕💕~~~,本文中也有不足之处,欢迎各位随时私信点评指正!文章来源地址https://www.toymoban.com/news/detail-524427.html

到了这里,关于【Linux】Linux项目自动化构建工具-make/makefile的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【Linux】Linux项目自动化构建工具-make/makefile

    🎉博客主页:小智_x0___0x_ 🎉欢迎关注:👍点赞🙌收藏✍️留言 🎉系列专栏:Linux入门到精通 🎉代码仓库:小智的代码仓库 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需

    2024年02月12日
    浏览(62)
  • 【Linux】项目自动化构建工具——make/Makefile及拓展

    1、背景知识 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作 makefile带来的好处就是——“自动化编译”,一旦

    2023年04月27日
    浏览(48)
  • 【Linux】Linux下的项目自动化构建工具——make和makefile

            大家好,好久不见!今天小狮子为大家带来的文章是一篇关于Linux下的项目自动化构建工具——make和makefile的博客,希望能帮助到大家。         当我们进行涉及多文件的工程开发时,我们需要对很多不同类型、不同功能,存在于不同目录下的源文件进行编译操作,

    2024年02月13日
    浏览(49)
  • Linux工具【2】(调试器gdb、项目自动化构建工具make/Makefile)

    在上一篇文章中介绍了Linux中的编辑器vim与编译器gcc与g++: 戳我看vim与gcc详解哦 在本篇文章中将继续来介绍Linux中的工具: 调试器gdb与项目自动化构建工具make/Makefile 在Windows环境中,我们使用vs时,常常会逐过程与逐语句地调试代码以更高效地寻找到错误的位置。在Linux中也

    2024年02月12日
    浏览(50)
  • Linux项目自动化构建工具-make/Makefile以及git三板斧

    是否会写make/makefile,从侧面反映了一个程序员是否具备完成大型工程的能力。一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更

    2024年02月16日
    浏览(47)
  • 【Linux】Linux编译器-gcc/g++ && Linux项目自动化构建工具-make/Makefile

    目录 Linux编译器-gcc/g++使用 1.背景知识  Linux中头文件的目录在 Linux 库 条件编译的典型应用 2.gcc如何完成 动态库 vs 静态库 debug release Linux项目自动化构建工具-make/Makefile 背景 用法 特殊符号  预处理(去注释,头文件展开,条件编译,宏替换) 编译(生成汇编) 汇编(生成

    2024年02月20日
    浏览(48)
  • 【Linux】项目自动化构建工具-make和Makefile 的使用和进度条的实现

    什么是makefile 在我们以后的工作环境中,一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作 Linux中提供了自动化

    2024年02月07日
    浏览(67)
  • 【Linux】:Linux项目自动化构建工具——make/Makefile || Linux第一个小程序——进度条(简单版本)

    在本章开始给大家分享一个图片 希望对你有帮助 在这里插入图片描述 在开始本章之前 我们需要回顾一下上节课的函数的动静态库的优缺点 动态库的优点: 比较节省资源(这里说的资源不仅仅是磁盘资源 也包括网络资源 内存资源等等),不会出现太多的重复代码 缺点:对

    2024年02月05日
    浏览(43)
  • 【探索Linux】—— 强大的命令行工具 P.6(调试器-gdb、项目自动化构建工具-make/Makefile)

    前面我们讲了C语言的基础知识,也了解了一些数据结构,并且讲了有关C++的一些知识,也学习了一些Linux的基本操作,也了解并学习了有关Linux开发工具vim 、gcc/g++ 使用、yum工具以及git 命令行提交代码也相信大家都掌握的不错,今天博主带大家了解一下 —— Linux系统下的调试

    2024年02月12日
    浏览(37)
  • 【Linux】--- Linux编译器-gcc/g++、调试器-gdb、项目自动化构建工具-make/Makefile 使用

    格式: gcc [选项] 要编译的文件 [选项] [目标文件] , gcc / g++ 安装: sudo yum install -y gcc-c++ 。安装后的编译器默认的版本是较低的,我们可以 使用选项 -std=c99 (即使用c99标准), -std=c++11 (即使用c++11的标准)来进行版本提升 。使用 -o 选项,可以将编译生成的可执行重命名

    2024年03月10日
    浏览(102)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包