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

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

什么是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:

在没有学习make/makefile之前我们想要编译这段代码需要使用这行指令gcc -o mycode mycode.c我们编译来看:

可以看到程序可以被编译执行。

我们再来使用make/makefile来进行操作:

  1. 1.首先创建一个空白文件makefile/Makefile(首字母大小写都可以):
  2. 2.使用vim编辑器打开文件:

    在文件中写入这些代码,保存并退出。
  3. 3.终端输入make进行代码编译:
  4. 可以看到使用make指令,也可以对代码进行编译,也不用我们每次都去敲那么长的gcc指令,而且还很容易敲错。
  5. 4.使用make clean对项目进行清理。
  6. 可以看到的确清理了我们生成的可执行程序。

依赖关系

我们来看makefile中的内容:

第一行就代表依赖关系,意思就是mycode的生成要依赖于mycode.c。

这里举个例子:


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


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

依赖方法

这一行缩进的就代表依赖方法,意思是要执行的指令。

再使用上面的例子进行解释就是:

小李打电话提到的要生活费就是打电话的主要目的,而实行要生活费的这个操作就是依赖方法。

makefile是如何工作的?

我们把上篇学到的预处理编译链接的过程也加到makefile中,再来使用make指令>

可以看到他也生成了对应的文件,而且我们上面也没有按照程序的执行顺序来写,makefile也可以帮我们完成,这可以说明make会自动推导makefile中的依赖关系

那如果我们再makefile中删去一行指令那么程序还可以继续正常执行吗?

我们来试试看>

可以看到给我们报错说要产生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来编译源代码:

我们再在已经编译的基础上再次使用make指令>

可以看到make拒绝的我的操作。这是因为生成的可执行程序是最新的。

一定是源文件形成的可执行,先有源文件,才有可执行,一般而言,源文件的最近修改时间 比可执行修改时间要老的!

如果我更改了源文件,历史上曾经还有可执行程序,那么源文件的修改时间,一定是比可执行程序要新的,这是我们再使用make就可以完成代码的编译。

因此只需要比较可执行程序的修改时间 和 源文件的修改时间

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

一般而言.exe!=.c

这里有一个stat指令可以查看文件所对应的时间

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


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


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

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

make和make clean

为什么使用make可以直接执行源文件编译操作,而项目清理需要使用makefile呢?

我们来吧两个顺序颠倒一下试试看:


通过这个例子我们可以得出make指令的操作是执行makefile中的第一个依赖关系。

.PHONY:伪目标

通过上面我们可以了解到依赖关系不一定总是执行的,那如果我们想让依赖关系总是执行呢?

这里可以通过.PHONY:伪目标具体使用方法:

这就好比我们告诉makefile以后遇到mycode就不要阻拦了,让他直接操作。

这个一般多用于修饰clean:

特殊符号

makefile中可以简写可以使用 $@ 代替要生成的目标文件,用 $^代表目标文件:

如果执行make或者make clean之后不想看到指令回显可以在指令前面加上@修饰:


相关文章
|
26天前
|
人工智能 监控 Kubernetes
77_自动化脚本:Makefile与Airflow
在当今AI大模型时代,高效的工作流管理对于模型训练、推理和部署至关重要。随着大模型规模的不断增长和复杂度的提升,传统的手动脚本管理方式已无法满足需求。自动化脚本和工作流调度系统成为构建健壮、可重复、可扩展的LLM Pipeline的关键工具。其中,Makefile作为经典的自动化构建工具,与Airflow作为现代工作流调度平台的结合,为LLM开发团队提供了强大的工作流管理能力。
|
5月前
|
Java 关系型数据库 MySQL
在Linux平台上进行JDK、Tomcat、MySQL的安装并部署后端项目
现在,你可以通过访问http://Your_IP:Tomcat_Port/Your_Project访问你的项目了。如果一切顺利,你将看到那绚烂的胜利之光照耀在你的项目之上!
346 41
|
9月前
|
消息中间件 Linux
Linux:进程间通信(共享内存详细讲解以及小项目使用和相关指令、消息队列、信号量)
通过上述讲解和代码示例,您可以理解和实现Linux系统中的进程间通信机制,包括共享内存、消息队列和信号量。这些机制在实际开发中非常重要,能够提高系统的并发处理能力和数据通信效率。希望本文能为您的学习和开发提供实用的指导和帮助。
648 20
|
关系型数据库 MySQL Linux
基于阿里云服务器Linux系统安装Docker完整图文教程(附部署开源项目)
基于阿里云服务器Linux系统安装Docker完整图文教程(附部署开源项目)
2231 3
|
Ubuntu Linux 编译器
Linux/Ubuntu下使用VS Code配置C/C++项目环境调用OpenCV
通过以上步骤,您已经成功在Ubuntu系统下的VS Code中配置了C/C++项目环境,并能够调用OpenCV库进行开发。请确保每一步都按照您的系统实际情况进行适当调整。
2192 3
|
1月前
|
Linux 应用服务中间件 Shell
二、Linux文本处理与文件操作核心命令
熟悉了Linux的基本“行走”后,就该拿起真正的“工具”干活了。用grep这个“放大镜”在文件里搜索内容,用find这个“探测器”在系统中寻找文件,再用tar把东西打包带走。最关键的是要学会使用管道符|,它像一条流水线,能把这些命令串联起来,让简单工具组合出强大的功能,比如 ps -ef | grep 'nginx' 就能快速找出nginx进程。
304 1
二、Linux文本处理与文件操作核心命令
|
1月前
|
安全 Ubuntu Unix
一、初识 Linux 与基本命令
玩转Linux命令行,就像探索一座新城市。首先要熟悉它的“地图”,也就是/根目录下/etc(放配置)、/home(住家)这些核心区域。然后掌握几个“生存口令”:用ls看周围,cd去别处,mkdir建新房,cp/mv搬东西,再用cat或tail看文件内容。最后,别忘了随时按Tab键,它能帮你自动补全命令和路径,是提高效率的第一神器。
558 56
|
20天前
|
存储 安全 Linux
Linux卡在emergency mode怎么办?xfs_repair 命令轻松解决
Linux虚拟机遇紧急模式?别慌!多因磁盘挂载失败。本文教你通过日志定位问题,用`xfs_repair`等工具修复文件系统,三步快速恢复。掌握查日志、修磁盘、验重启,轻松应对紧急模式,保障系统稳定运行。
176 2
|
1月前
|
缓存 监控 Linux
Linux内存问题排查命令详解
Linux服务器卡顿?可能是内存问题。掌握free、vmstat、sar三大命令,快速排查内存使用情况。free查看实时内存,vmstat诊断系统整体性能瓶颈,sar实现长期监控,三者结合,高效定位并解决内存问题。
83 0
Linux内存问题排查命令详解
|
1月前
|
Unix Linux 程序员
Linux文本搜索工具grep命令使用指南
以上就是对Linux环境下强大工具 `grep` 的基础到进阶功能介绍。它不仅能够执行简单文字查询任务还能够处理复杂文字处理任务,并且支持强大而灵活地正则表达规范来增加查询精度与效率。无论您是程序员、数据分析师还是系统管理员,在日常工作中熟练运用该命令都将极大提升您处理和分析数据效率。
150 16

热门文章

最新文章