【Linux系统编程】项目自动化构建工具make/Makefile

介绍:

        make和Makefile是用于编译和构建C/C++程序的工具和文件。Makefile是一个文本文件,其中包含了编译和构建程序所需的规则和指令。它告诉make工具如何根据源代码文件生成可执行文件,里面保存的是依赖关系依赖方法。make是一个命令行工具,用于根据Makefile文件中定义的依赖关系依赖方法来生成程序。

make/Makefile的使用:

        在使用此构建工具时,首先,我们要建立一个名称为 Makefilemakefile 文件,这里要注意 的是名称是固定的,不可更改。建立之后就要进入vim编辑步骤,输入依赖关系依赖方法来对指定程序进行指令控制。

        下面,我们使用最简单的gcc编译操作来对C语言源文件程序进行控制。

[zhu@zhujunhao ~]$ vim Makefile
[zhu@zhujunhao ~]$ cat Makefile
code.exe:code.c       #第一行叫做依赖关系,即对文件code.c进行操作
    gcc code.c -o code.exe   #第二行叫做依赖方法,该方法对code.c文件进行编译
[zhu@zhujunhao ~]$ make  #直接make,开始执行Makefile文件中指令
gcc code.c -o code.exe   #Makefile 的依赖方法操作
[zhu@zhujunhao ~]$ ll
total 24
-rw-rw-r-- 1 zhu zhu  181 Dec  7 09:15 code.c
-rwxrwxr-x 1 zhu zhu 8360 Dec  7 17:02 code.exe   #make形成可执行文件code.exe
-rw-rw-r-- 1 zhu zhu  827 Dec  5 14:52 install.sh
-rw-rw-r-- 1 zhu zhu   40 Dec  7 17:01 Makefile

      其中,依赖关系是所要针对的文件,上面依赖关系 code.exe:code.c 中的 mybin 叫做目标文件,make 操作的就是此文件,code.c 叫做依赖文件列表,两者之间用 “ : ” 分割。依赖方法是要对此文件进行指令操作,上面的依赖方法 gcc code.c -o code.exe 是对code.c文件进行编译处理。

        这里要注意的是,当我们使用make后,就不能再次使用make对其进行编辑。这时我们需在Makefile文件中对相关东西进行清理工作。如下:

[zhu@zhujunhao ~]$ vim Makefile
[zhu@zhujunhao ~]$ cat Makefile
clear:                           #定义clear的依赖关系
    rm -f code.exe        #clear对应的依赖方法
code.exe:code.c        #定义目标文件code.exe依赖关系
    gcc code.c -o code.exe       #code.exe的依赖方法
[zhu@zhujunhao ~]$ make     #默认执行第一个依赖关系所对应的依赖方法
rm -f code.exe
[zhu@zhujunhao ~]$ ll
total 12
-rw-rw-r-- 1 zhu zhu 181 Dec  7 09:15 code.c
-rw-rw-r-- 1 zhu zhu 827 Dec  5 14:52 install.sh
-rw-rw-r-- 1 zhu zhu  65 Dec  7 18:04 Makefile

[zhu@zhujunhao ~]$ make code.exe     #进行说明执行第二个依赖关系所对应的依赖方法
gcc code.c -o code.exe
[zhu@zhujunhao ~]$ ll
total 24
-rw-rw-r-- 1 zhu zhu  181 Dec  7 09:15 code.c
-rwxrwxr-x 1 zhu zhu 8360 Dec  7 18:05 code.exe
-rw-rw-r-- 1 zhu zhu  827 Dec  5 14:52 install.sh
-rw-rw-r-- 1 zhu zhu   65 Dec  7 18:04 Makefile

        这里需注意,Makefile 定义的依赖关系中的 “目标文件” 不一定非要是文件,主要作用在于依赖方法,比如上面的 clear 功能就是删除文件操作。这里的 “目标文件” 是一个抽象的概念。

        Makefile和make 形成目标文件的时候,默认是从上到下扫描Makefile文件的,若不加以说明,默认形成的是第一个目标文件。

        上面说到 make 只能编译一次。但是我们发现,当修改源文件时,可再次进行 make 编辑,这是因为make会根据文件所对应时间的修改而再次进行编辑。使用 stat [文件或目录] 可查看【文件或目录i】所对应的详细时间记录。

[zhu@zhujunhao ~]$ stat code.c         #查看code.c文件所对应的时间记录
  File: ‘code.c’
  Size: 181           Blocks: 8          IO Block: 4096   regular file
Device: fd01h/64769d    Inode: 1052177     Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1001/     zhu)   Gid: ( 1001/     zhu)
Access: 2023-12-07 09:15:21.064989027 +0800
Modify: 2023-12-07 09:15:21.060988852 +0800
Change: 2023-12-07 09:15:21.060988852 +0800
 Birth: -

        这里,所对应的时间为Access、Modify、Change三个记录。其中,Access是最近一次对文件进行访问(即读文件)的时间,Modify是最近一次对文件内容进行修改的时间,Change是最近一次对文件属性进行修改的时间。要注意的是Access所对应的文件访问的时间不是每次访问都会更新,在短时间内频繁的访问系统不会更新。这样保证了不会对系统带来太大的负担。

文件时间:

        make编辑文件时查看文件所对应的时间查看的是Modify所对应的时间,也就是说只要Modify所对应的时间被修改,make即可再次进行编辑。这里,我们可使用 touch [文件] 指令,当不存在【文件】时将会创建文件,当存在【文件】时将会全部更新文件所对应的时间。

Makefile/makefile语法使用:       

1,.PHONY的使用

        当我们不想改变文件所对应的时间时进行连续编译,这时需要在Makefile/makefile文件中进行.PHONY修饰伪目标。

[zhu@zhujunhao ~]$ vim Makefile
[zhu@zhujunhao ~]$ cat Makefile
.PHONY:code.exe    #修饰code.exe目标文件,成为一个伪目标,使其总是可以被执行
clean:                      #我们也可用.PHONY修饰clean目标,即.PHONY:clean,使其总是执行
    rm -f code.exe
code.exe:code.c  
    gcc code.c -o code.exe
[zhu@zhujunhao ~]$ make code.exe
gcc code.c -o code.exe
[zhu@zhujunhao ~]$ make code.exe
gcc code.c -o code.exe
[zhu@zhujunhao ~]$ make code.exe
gcc code.c -o code.exe

2,名称的替换

        在Makefile/makefile文件中可用 “ = ” 进行名称替换工作,使用别名时只需用 $(别名) 进行替换即可,如下:

#使用 = 进行名称的替换
   g=gcc
   o=-o
   c=code.c
   exe=code.exe

#使用别名替换,即:$(别名)
   .PHONY:$(exe)    #修饰code.exe目标文件,成为一个伪目标,使其总是可以被执行
   clean:
       rm -f $(exe)
   $(exe):$(c)  
       gcc $^ $(o) $@   # $@代表目标文件,$^代表依赖文件列表     

3,语法推导

        在Makefile/makefile中,若存在多个依赖关系,当make运行其中一个依赖关系的依赖方法时,系统会先判断依赖关系中对应的依赖文件列表,并且对应的依赖文件不存在时,将会自动往下继续寻找,直到找到指定的命令来生成这个目标文件,若找不到,系统将会报出异常;若找到了,系统将会往上不断返回执行对应的指令,以便生成这个目标文件。如下:

[zhu@zhujunhao ~]$ vim makefile
[zhu@zhujunhao ~]$ cat makefile
code.exe:code.o
    gcc $^ -o $@
code.o:code.s
    gcc -c $^ -o $@
code.s:code.i
    gcc -S $^ -o $@
code.i:code.c
    gcc -E $^ -o $@

以上的makefile的工作流程是这样的:

  1. 首先,当你运行 make code.exe时,make会检查 code.exe是否已经存在。如果存在,make就不会重新编译。如果不存在,make会找到它的依赖文件code.o,若依赖文件code.o 不存在,系统将往下查找,运行指定的命令来生成这个目标文件。这个过程会一直继续,直到所有的目标文件都被生成。
  2. 然后,对于每个目标文件,makefile都会检查是否所有的依赖文件都已经被更新。如果是,那么目标文件就会被重新编译。这个过程会一直继续,直到所有的目标文件都被更新。 如果命令失败了或全部指令运行完之后目标文件还没有被更新,make会停止并显示错误信息。

       总的来说,makefile定义了如何将C语言源代码code.c编译成可执行文件code.exe的过程。在编译过程中,它首先将C语言源代码预处理为中间文件code.i,然后将中间文件编译为汇编文件code.s,接着将汇编文件code.s编译成二进制文件code.o,最后将二进制文件链接为可执行文件code.exe。

[zhu@zhujunhao ~]$ make
gcc -E code.c -o code.i
gcc -S code.i -o code.s
gcc -c code.s -o code.o
gcc code.o -o code.exe

        可看出,Makefile/makefile的程序指令运行中,依赖关系如同栈结构中不断推导进栈,当查找到最终所以属的目标文件时,依赖关系中对应的依赖方法将会不断的出栈运行。这种形式就叫做makefile/Makefile的语法推到过程。

总:使用make和Makefile/makefile可以简化编译和构建程序的过程,只需要编写一个简单的Makefile/makefile文件,就可以自动化地编译和链接程序。同时,Makefile/makefile还可以在不同的平台上使用,使得程序的构建更加灵活和可移植。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/258415.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【EMNLP 2023】基于知识迁移的跨语言机器阅读理解算法

近日,阿里云人工智能平台PAI与华南理工大学朱金辉教授团队、达摩院自然语言处理团队合作在自然语言处理顶级会议EMNLP2023上发表基于机器翻译增加的跨语言机器阅读理解算法X-STA。通过利用一个注意力机制的教师来将源语言的答案转移到目标语言的答案输出空间&#x…

关于linux开机自启动

1、系统启动流程 2、 init、 inittab、 init.d、 rcx.d /etc/inittab是Linux系统中的一个配置文件,用于定义系统的运行级别和相应的操作。其语法格式如下: 标签:运行级别:操作:进程 label:runlevel:action:process下面…

【无线网络技术】——无线局域网(学习笔记)

📖 前言:本章首先介绍无线局域网的基本概念,然后详细介绍IEEE 802.11的基本工作原理,侧重于媒体访问控制和一跳范围内的通信技术。 目录 🕒 1. 概述🕘 1.1 覆盖范围🕘 1.2 特点🕘 1.…

3D Web轻量引擎HOOPS Communicator如何实现对大模型的渲染支持?

除了读取轻松外,HOOPS Communicator对超大模型的支持效果也非常好,它可以支持30GB的包含70万个零件和3.5亿个三角面的Catia装配模型! 那么它是如何来实现对大模型的支持呢? 我们将从以下几个方面与大家分享:最低帧率…

os.walk()遍历文件夹/文件

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

Backend - Dbeaver

目录 一、说明 二、下载并安装 (一)官网下载 (二)安装 三、使用 (一)操作步骤 (二)相关问题:无法加载驱动类oracle.jdbc.oracledriver 1. 新建驱动 2. 再重新连接数据库 …

VR全景对旅游业有什么帮助,如何助力旅游业实现新的旅游形式

引言: 旅游业是一个充满机遇的行业,而虚拟现实(VR)全景技术正逐渐改变着旅游业的面貌,通过提供身临其境的体验,VR全景成为了旅游业的新宠,将旅游带入了一个全新的数字化时代。 一、打破地域限制…

AI智能降重软件大全,免费最新AI智能降重软件

在当今信息爆炸的时代,内容创作者们面临着巨大的写作压力,如何在保持高质量的前提下提高效率成为摆在许多人面前的难题。AI智能降重软件因其独特的算法和功能逐渐成为提升文案质量的得力助手。本文将专心分享一些优秀的AI智能降重软件。 147SEO改写软件 …

Vue3+ts----根据配置项,动态生成表单

这里使用的UI框架是ElementPlus,更换其他组件直接更换constant.ts中的type配置和对应的Form组件即可. 大家可以npm install elementplus_dy_form来体验。 思路: 1.这里需要使用h函数方便控制要渲染的表单 2.传递type作为组件或html元素进行渲染&#xff…

NestJs的基础使用

初始化项目 创建项目 // 安装脚手架(只需要安装一次,因为这个是全局的) npm i -g nestjs/cli // 创建项目 nest new project-name // (该过程有个选择包管理工具的,我选的yarn)启动项目 yarn run start:dev // 可以在浏览器访问localhost:3000 输出helloWorld控制器和路由 …

MDK官网如何下载stm32支持包

网站:https://www.keil.com/demo/eval/arm.htm 1 2 3点这个下载

4.Java程序设计-基于springboot得在线考试系统

编程技术交流、源码分享、模板分享、网课分享 企鹅🐧裙:772162324 摘要: 本文设计并实现了一款基于Spring Boot框架的在线考试系统小程序。随着远程学习和在线教育的普及,对于灵活、便捷的在线考试系统的需求逐渐增加。该小程序…