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

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

🔥 个人主页:大耳朵土土垚
🔥 所属专栏:Linux系统编程

这里将会不定期更新有关Linux的内容,欢迎大家点赞,收藏,评论🥳🥳🎉🎉🎉

文章目录

  • 前言
  • 1. 什么是make和Makefile?
  • 2. Makefile的基本结构
  • 3. Makefile的高级特性
  • 4. 使用make的优势
  • 5. 总结

前言

  在Linux及类Unix系统中,自动化构建项目是提高开发效率、减少重复劳动的关键环节。make工具及其配置文件Makefile是实现这一目标的重要工具组合。它们通过定义一系列规则和依赖关系,自动执行编译、链接等构建过程,确保软件项目能够高效、准确地构建。

1. 什么是make和Makefile?

  make 是一种控制程序生成的工具,它读取一个名为Makefile(或makefile,不区分大小写)的文件,并根据文件中的指令执行相应的命令。这些命令通常包括编译、链接等,用于生成最终的可执行文件或库文件。一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。

  Makefile 是一个文本文件,其中包含了一系列的规则(rules)、目标(targets)、依赖(dependencies)和命令(commands)。每个规则定义了一个目标文件(通常是编译或链接的结果),以及生成该目标文件所需的依赖文件和要执行的命令。

  一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作。makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。

  make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。

2. Makefile的基本结构

  Makefile的基本结构由规则组成,每个规则通常包含以下部分:

  • 目标(target):通常是要生成的文件名,如可执行文件或对象文件。
  • 依赖(dependencies):生成目标所依赖的文件列表。
  • 命令(commands):生成目标需要执行的Shell命令,前面通常需要一个制表符(Tab)开头。

示例:

首先,这里有一个hello.c源文件:

hello.c的内容如下:

然后我们就可以通过创建一个Makefile文件来控制该代码生成程序(当然我们也可以直接使用gcc命令来生成可执行程序,但是随着源文件个数的增加,我们每次重新生成可执行程序时,所需输入的gcc指令的长度与个数也会随之增加,所以这时我们就需要使用make和Makefile了,这将大大减少我们的工作量),Makefile内容如下:

✨✨这里hello和clean就是我们的目标,hello.c就是要生成hello目标文件的依赖,而clean由.PHONY修饰,是一个伪目标,所以不需要依赖,伪目标的特性是,总是被执行的;gcc -o hello hello.crm -f hello 就是生成目标需要执行的Shell命令

然后我们就可以使用make来创建可执行程序hello:

在这个例子中,hello是最终的目标,它依赖于hello.c。为了生成hello,需要执行gcc -o hello hello.c命令,如上图绿色划线部分,这样我们直接使用make命令,它就可以帮我们在Makefile文件中找到生成hello的命令,自动执行。

此外在Makefile中clean是一个用.PHONY声明伪目标(不生成文件),用于清理构建过程中产生的文件,我们直接使用make clean指令即可删除对应的文件:

.PHONY:clean
clean:  
    rm -f hello 

可以看到之前make指令生成的可执行程序hello被删除了,其原因也是因为make clean命令使得它去Makefile文件中找到相关的指令rm -f hello进行删除

如果你想要删除多个文件,直接在rm -f 后面加文件名即可,例如我们可以将hello.c文件也删除:

结果如下:

可以看到已经没有hello和hello.c文件了

  • 我们发现使用clean命令时需要写make clean但是创建hello文件时只需要写make即可,这是因为如果只输入make命令,make会在当前目录下找名字叫“Makefile”或“makefile”的文件,如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“hello”这个文件,然后执行生成它的Shell命令,所以make后面的hello可以省略,只写一个make命令即可;
  • 如果找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错。

3. Makefile的高级特性

变量:Makefile中可以使用变量来存储文件名、编译器选项等,以提高灵活性和可维护性。
示例:

CC=gcc  
CFLAGS=-Wall -g  
hello: hello.o  
    $(CC) $(CFLAGS) -o hello hello.o

上述例子使用变量CC和CFLAGS来代替gcc和-Wall -g ,使用时需要使用括号并在前面加上$

自动变量:在规则中的命令里,可以使用一些特殊变量来表示依赖文件和目标文件等,如:

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

模式规则:允许为符合特定模式的文件指定构建规则,从而减少重复代码。
示例:

%.o: %.c  
    $(CC) $(CFLAGS) -c $< -o $@

条件判断:基于不同的条件执行不同的命令。
示例:

ifeq ($(OS),Windows_NT)  
CFLAGS += -DWIN32  
endif

函数:Makefile支持多种内置函数,用于处理文件名、字符串等。

4. 使用make的优势

  • 自动化:自动根据依赖关系执行必要的命令,减少手动操作。
  • 可维护性:通过清晰的规则和依赖关系,提高项目的可维护性。
  • 灵活性:支持变量、条件判断等高级特性,满足不同项目的构建需求。
  • 高效性:只重新构建已更改的部分,避免不必要的编译和链接。

5. 总结

  make和Makefile是Linux及类Unix系统中不可或缺的自动化构建工具。它们通过定义清晰的规则和依赖关系,极大地提高了软件项目的构建效率和可维护性。掌握make和Makefile的使用,对于开发者来说,是提升开发效率、保证项目质量的重要一步。


http://www.kler.cn/news/321258.html

相关文章:

  • Linux系统之部署web-resume静态个人简历网页
  • 时序,这很Transformer!颠覆传统,实现了性能的全面超越!
  • Vue3+Element-UI Plus登录静态页
  • vite ts vue中配置@路径别名报错标红
  • 机械设备产品资料方案介绍小程序系统开发制作
  • 【数据结构】排序算法---桶排序
  • SVM原理
  • docker-compose.yml entrypoint 和command 关系
  • 利用 Flink CDC 实现实时数据同步与分析
  • 使用vite+react+ts+Ant Design开发后台管理项目(一)
  • 以数赋能实景三维创新“科技+文旅”
  • 数据结构-3.1.栈的基本概念
  • Redis常用命令笔记
  • Leetcode - 139双周赛
  • Snap 发布新一代 AR 眼镜,有什么特别之处?
  • sentinel-dashboard数据 redis 持久化
  • 甘蔗茎节检测系统源码分享
  • Elasticsearch——介绍、安装与初步使用
  • C语言指针系列1——初识指针
  • CSDN文章导出md并迁移至博客园
  • 数据结构——初始树和二叉树
  • Spring AOP - 配置文件方式实现
  • 【IEEE 独立出版,快速EI检索】第四届人工智能、虚拟现实与可视化国际学术会议(AIVRV 2024)
  • 【编程基础知识】Cookie、Session和JWT(JSON Web Token)
  • Linux 学习 awk 和sed 命令使用
  • 欧洲欧盟药品数据库:EMA、HMA、EDQM-一键查询
  • WEB 编程:富文本编辑器 Quill 配合 Pico.css 样式被影响的问题之Shadow DOM
  • PostgreSQL 向量数据存储指南
  • 即梦PixelDance:从追赶到领跑,一跃成为全球AI竞赛的领航者!
  • 付费计量系统的标准化框架(下)