当前位置: 首页 > news >正文

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

make/Makefile

  • 1.背景
  • 2.概念
  • 3.实例代码

1.背景

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

2.概念

makeMakefile 是在类 Unix 系统(包括 Linux 和 macOS)中广泛使用的构建工具和技术。

  • make 是一个命令行工具或者说是一个程序,它的主要作用是根据用户提供的规则去编译和链接程序源代码。当你运行 make 命令时,它会查找一个名为 Makefile 或者 GNUmakefile的特殊文件,并遵循其中的规则来确定应该执行哪些操作。这些规则通常指示了如何基于源代码文件构建可执行文件或其他输出文件,以及在什么条件下(例如某些源文件发生变化时)才需要重新编译。

  • Makefile 是一个文本文件,其中包含一系列构建项目的规则和命令。它定义了源文件、目标文件、依赖关系以及用于构建项目的命令。

3.实例代码

在这里插入图片描述
例如:
在这里插入图片描述
在这里插入图片描述

补充:

  1. .PHONY

上面提过.PHONY:XXX后面的XXX总会被执行
在这里插入图片描述
makefile怎么知道我的程序是否需要被编译?
答:通过对比可执行文件和源文件的最近修改时间,若源文件最近修改时间比可执行文件新,则需要重新被编译,make可以被执行,否则make不能被执行。

  1. makefile/make会自动根据文件中的依赖关系,进行自动推导,帮助我们执行所有相关的依赖方法。

在这里插入图片描述
会发现上面makefile中首先执行的时code.o被链接,源文件中没有code.o,但最后仍然能被执行,原因就是makefile/make会自动根据文件中的依赖关系,进行自动推导,帮助我们执行所有相关的依赖方法。,可将这个过程理解为通过栈实现的过程
在这里插入图片描述
所以即使我们打乱上面的makefile文件中的依赖方法顺序,源文件依然能正常编译执行。
注意:最终要形成的文件一定要放在第一个。

  1. 我们要用的makefile

在这里插入图片描述

bin=mycode               # 定义变量 bin,其值为 mycode,表示最终生成的可执行文件名  
scr=code.c               # 定义变量 scr,其值为 code.c,表示要编译的 C 源文件名  $(bin):$(scr)           # 定义了一个规则,目标(可执行文件)是 $(bin),依赖是 $(scr)  @gcc -o $@ $^        # 使用 gcc 编译器将源代码编译为可执行文件,“$@”代表目标文件名,“$^”代表所有依赖文件@echo "compiler $(scr) to $(bin)" # 执行完成后,输出编译信息  
.PHONY:clean            
clean:                   # 定义一个名为 clean 的目标,用于清理构建生成的文件  @rm -f $(bin)       # 删除 $(bin) 指定的文件  @echo "clean project..." # 执行完成后,输出清理信息

注意:
1.在 Makefile 中,命令前的 @ 符号是可选的,他的作用是阻止 make 工具在执行命令前输出该命令本身。这意味着当make 执行包含 @ 符号的命令时,终端只会显示命令的执行结果,而不会显示命令行命令。
2.要编译 code.c 文件,你可以在命令行中运行 make。要清理生成的文件,你可以运行 make clean
3.#makefile中的注释

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Go语言并发编程之Channels详解
  • 【Java】基础语法介绍
  • 力扣刷题之2398.预算内的最多机器人数目
  • 【Windows】使用 WMI 获取系统版本信息
  • Errorresponsefromdaemon:toomanyrequests:Youhavereachedyourpullratelimit.
  • JVM运行区域介绍
  • C#基于SkiaSharp实现印章管理(7)
  • 计算机网络 --- 初识协议
  • windows 使用wsl安装docker
  • POD内的容器之间的资源共享
  • CLUSTERDOWN Hash slot not served问题复现
  • 【隐私计算】Paillier半同态加密算法
  • node前端开发基本设置
  • rust GUI框架Tauri入门——基于vanilla.js
  • 【C语言】联合体枚举的讲解
  • es的写入过程
  • js继承的实现方法
  • k8s 面向应用开发者的基础命令
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • Node 版本管理
  • python docx文档转html页面
  • Quartz实现数据同步 | 从0开始构建SpringCloud微服务(3)
  • 阿里研究院入选中国企业智库系统影响力榜
  • 从零搭建Koa2 Server
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • 关于字符编码你应该知道的事情
  • 驱动程序原理
  • 使用agvtool更改app version/build
  • 延迟脚本的方式
  • 智能网联汽车信息安全
  • 《天龙八部3D》Unity技术方案揭秘
  • # Apache SeaTunnel 究竟是什么?
  • # SpringBoot 如何让指定的Bean先加载
  • #define用法
  • #pragma data_seg 共享数据区(转)
  • #Z2294. 打印树的直径
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • $(selector).each()和$.each()的区别
  • (13)Hive调优——动态分区导致的小文件问题
  • (javascript)再说document.body.scrollTop的使用问题
  • (算法)求1到1亿间的质数或素数
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • (转) ns2/nam与nam实现相关的文件
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • .Net Core 笔试1
  • .NET Core 成都线下面基会拉开序幕
  • .Net Core和.Net Standard直观理解
  • .NET MVC之AOP
  • .NET 实现 NTFS 文件系统的硬链接 mklink /J(Junction)
  • .NET国产化改造探索(一)、VMware安装银河麒麟
  • .NET框架设计—常被忽视的C#设计技巧
  • .NET是什么
  • .net中我喜欢的两种验证码
  • .sh文件怎么运行_创建优化的Go镜像文件以及踩过的坑