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

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


1.make/Makefile的重要性

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

2.规则及使用

使用

我们先来看一下make/Makefile在Linux中的简单使用(先看看猪跑,接着会解析规则):

第一步:我们先创建一个myfile.c文件,写入简单的内容
【Linux】项目自动化构建工具-make/Makefile
【Linux】项目自动化构建工具-make/Makefile

第二步:创建一个Makefile文件,写入符合Makefile规则的内容
【Linux】项目自动化构建工具-make/Makefile
【Linux】项目自动化构建工具-make/Makefile

第三步:使用make命令,生成可执行程序,使用make clean删除可执行程序
【Linux】项目自动化构建工具-make/Makefile

规则

Makefile是一个围绕依赖关系和依赖方法构建的一个自动化编译的工具。

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

1.依赖关系:在这个程序中,myfile可执行程序和myfile.c文件构成依赖关系,myfile.c的改变会影响myfile,所以myfile依赖于myfile.c。所以第一行就表示myfile可执行程序的生成依赖于myfile.c文件。

2.依赖方法:myfile可执行程序的生成依赖于myfile.c,gcc myfile.c -o myfile就是myfile文件依赖myfile.c的依赖方法。
(注意:完成一件事必须要有正确的依赖关系+正确的依赖方法。)

3.PHONY:被该关键字修饰的对象是一个伪目标,即该目标可以总是被执行(不需要进行时间新旧的比较),即如果我们希望多次生成一样的可执行程序,就可以用这个关键字修饰对象,不过我们一般不这样操作。大家肯定会有疑问:“啊?总是被执行是什么意思?”

我们接下来以这个Makefile文件为例,myfile.c文件的内容还是不变的。
【Linux】项目自动化构建工具-make/Makefile
make原理:这段代码,充分体现了依赖关系与依赖方法:make会在当前目录下找名字为“Makefile”或“makefile”的文件,然后找到第一个依赖关系,myfile的生成依赖于myfile.o,myfile.o的生成依赖于myfile.s,myfile.s的生成依赖于myfile.i,myfile.i的生成依赖于myfile.c,然后gcc的内容分别是它们的依赖方法。然后clean就是清理,当我们在命令行输入make clean,就会执行rm -f myfile myfile.i myfile.o myfile.s这句指令,就可以直接删除这些文件了。这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make根本不理。make只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在,那么对不起,我就不工作啦。

项目清理:工程是需要被清理的。像clean这种,没有被第一个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动执行,不过,我们可以显示要make执行。即命令——“make clean”,以此来清除所有的目标文件,以便重编译。但是一般我们这种clean的目标文件,我们将它设置为伪目标,用 .PHONY 修饰,伪目标的特性是,总是被执行的。

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

这段代码第一次执行make,可以正常执行,然鹅,我们第二次在命令行输入make,就无法再次被执行了。然鹅,大家看上图make clean被执行一次生效之后,我们再执行一次,还是可以生效。那么这就是.PHONY的作用,也就是“总是被执行”的意思。如果大家希望make指令可以总是被执行,那么就在开头加上.PHONY。那么在不加.PHONY,gcc是怎么知道我们不需要再编译了呢?

方法:如果我们make之后,又对源文件进行修改,则我们还可以再执行make指令(即编译器会判断myfile.c的modify时间是否早于myfile可执行程序,如果晚于myfile,则说明myfile.c文件发生修改,make可以继续执行,生成新的程序,覆盖旧的程序)。

注意make是一条命令,makefile是一个文件(在当前源代码的路径下),两个搭配使用,完成项目自动化构建。make指令默认执行Makefile文件中第一个依赖方法。如果你想运行指定的程序,就要显示定义,例如上述的make clean。

例如我们将Makefile文件改成如下代码并wq退出,在命令行输入make指令,就会先执行rm指令。
【Linux】项目自动化构建工具-make/Makefile
【Linux】项目自动化构建工具-make/Makefile

3.Makefile编译多文件

当我们的工程中有多个源文件的时候,我们要如何进行编译?
【Linux】项目自动化构建工具-make/Makefile

【Linux】项目自动化构建工具-make/Makefile
首先,我们可以直接使用gcc指令对多个源文件进行编译,进而生成可执行程序。注意用这种方式编译文件,不需要加上头文件,因为编译器通过源文件的内容可以直接知道所需头文件的名字。
【Linux】项目自动化构建工具-make/Makefile
但进行多文件编译的时候,一般不直接用gcc生成可执行程序,而是先用每个源文件生成各自的二进制文件,即.o文件,然后再将这些二进制文件通过链接生成可执行程序。但是随着源文件个数的增加,指令长度也会增长,所以我们就需要用到项目自动化构建工具make/Makefile,这样可以大大提高编译运行的效率。

原因

  1. 如果直接使用源文件生成可执行程序,那么若有一个.c文件发生了修改,我们再生成可执行文件就需要将之前的所有源文件重新进行编译链接。
  2. 如果每个源文件先生成自己的.o目标文件,那么一个源文件被修改,我们就只需要重新编译该源文件的二进制文件,然后将所有二进制文件进行链接。这样大大提高了程序编译运行的效率。

步骤一: 在源文件所在目录下创建一个名为Makefile/makefile的文件。
步骤二: 编写Makefile文件。
【Linux】项目自动化构建工具-make/Makefile
执行结果
【Linux】项目自动化构建工具-make/Makefile

补充:Makefile文件的快捷书写方式

  1. $@:表示依赖关系中的目标文件(冒号左侧)。
  2. $^:表示依赖关系中的依赖文件列表(冒号右侧)。
  3. $<:表示依赖关系中的第一个依赖文件(冒号右侧第一个)。

所以上述文件,还可以写成:
【Linux】项目自动化构建工具-make/Makefile文章来源地址https://www.toymoban.com/news/detail-407748.html

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

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

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

相关文章

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

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

    2024年02月12日
    浏览(63)
  • 【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日
    浏览(51)
  • Linux项目自动化构建工具-make/Makefile以及git三板斧

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

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

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

    2024年02月20日
    浏览(49)
  • 【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日
    浏览(38)
  • 【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日
    浏览(103)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包