Linux项目自动化构建工具

一.背景

  • 会不会写makefile,从侧面说明了一个人是否具备完成大型工程的能力。

  • 一个工程中的源文件不计其数,按照类型,功能,模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作。

  • makefile带来的好处就是–“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。

  • make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。

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

二.实例

首先我们要使用makefile,我们就得创建一个makefile文件,makefile或者Makefile都可以,允许首字母大写或者小写。

使用touch makefile命令,创建出makefile文件,或者直接使用vim makefile也可以创建出makefile文件。

向下面这样的一个代码,我们不想使用gcc得到可执行程序,而直接使用make命令来得到可执行程序。

源文件:

 #include<stdio.h>
  2 int main()
  3 {
  4     printf("makefile自动化构建\n");                                                          
  5     return 0;
  6 }

makefile文件

mybin:test.c
    gcc test.c -o mybin 

image-20240607160140112

可以看出,使用了makefile文件,就不需要我们使用gcc生成可执行程序了,使用make命令就可以得到可执行程序。

1.依赖关系

image-20240607160825100

makefile文件的语法:首先写的是可执行程序的名字,然后接着:源文件。

2.依赖方法

image-20240607161300002

依赖方法就是我们要执行的操作,很明显,这里的依赖方法就是gcc编译可执行程序的命令。

注意:依赖方法是按键盘上的TAB键,然后再写后面的语句。

关于依赖关系和依赖方法的理解:

人在这世界上不是一座孤岛,你一定和某些人,某些事等存在着紧密的联系。这样才能很好的完成一件事。

比如说,你的老妈和你就是依赖关系,一定是你老妈叫你去打扫卫生(正确的依赖方法),而不是你去叫你老妈去打扫卫生(错误的依赖方法)。也不可能是别人的老妈叫你打扫卫生,你们都不认识,你当然不会做了(错误的依赖关系)。

所以说,做好一件事情,要有正确的【依赖关系】和【依赖方法】。

当然依赖方法也可以不这么写,我们可以把源文件生成可执行程序的过程写成预处理,编译,汇编,链接。

mybin:test.o
   	gcc test.o -o mybin    #链接 
test.o:test.s
  	gcc -c test.s -o test.o    #汇编 -c
test.s:test.i 
	gcc -S test.i -o test.s    #编译 -S
test.i:test.c
  	gcc -E test.c -o test.i    #预处理 -E                        

image-20240607164756029

三.实现的原理

make是如何工作的呢?(统一用上面的例子)

①make会在当前目录中查找makefile或者Makefile的文件。

②如果找到,它会找文件中第一个文件,也就是mybin文件,将这个文件作为最终的目标文件。

③mybin依赖的文件test.o是不存在的,那么make会去找test.o的文件,依次类推去找,最后再倒回来执行(像是调用堆栈的过程)

image-20240607165925395

④ 这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。

⑤make只管文件的依赖性,如果冒号后面没有文件的话,make就不工作了。

image-20240607170507233

四.项目清理

当一个目录中我们进行各种操作,出来很多文件,我们想要删除这些文件,每次需要我们手动删除这些文件吗?显得很麻烦,于是我们一样可以使用makefile文件自动化删除这些文件。

命令:make clean

语法:

.PHONY:clean  #这个待会说
clean:                                                                                
	rm -f test.o test.s test.i mybin

clean:是依赖关系,换行加上TAB键,这一行是依赖方法。

image-20240607172009458

这里make和makefile配合使用,就可以实现创建文件,然后删除文件。

五. .PHONY是什么?

.PHONY是一个伪目标,makefile中将.PHONY放在一个目标前,就表示这个目标是一个伪目标。

那.PHONY有什么作用呢?

1.PHONY的作用

防止在makefile中定义的执行命令的目标和工作目录下的实际文件出现名字冲突。

也就是clean前有.PHONY,那么clean操作就可以一直反复执行,一直可以执行它的依赖方法

image-20240607190534051

这里我们可以一直执行make clean操作,其实第一次make clean操作我们就已经完成文件的删除了,但是还是可以继续执行该命令。

2.PHONY的原理

.PHONY修饰的clean,clean后面的依赖关系为空,.PHONY修饰的目标clean并不是某个依赖项生成的实际文件,因此make不会在当前目录去搜索是否有clean文件。

其实对于clean来说,不加.PHONY修饰也可以实现一直make clean操作,就是因为它依赖的对象为空,生成clean文件时,不需要某些文件必须存在。

没有伪目标:

image-20240607191625222

image-20240607190534051

得到的结果是一样的。

我们知道make操作一次了之后,就不能在继续操作了,这是因为该目录下已经存在该文件了,是最新的文件,除非文件的acm时间变了,我们是不是可以在make前加上.PHONY,也可以一直执行make命令。

image-20240607192347374

image-20240607192326878

当然,结果达到了我们的预期。

为什么make不加.PHONY伪目标,就无法连续多次的使用make呢?这里我们就要探讨一下make的判断机制了。

六.make的判断机制:文件的ACM时间

当我们使用ll命令,查看文件的信息时,会出现一个时间,该时间是最近文件修改的时间,这个时间也叫Modify time。

image-20240607194420155

文件其实还有两个时间Access time和Change time,使用命令【stat+文件名】查看。

image-20240607194723465

1.Access time

Access time简称atime,这是目录或文件最后一次访问的时间。

使用命令cat可以查看文件的内容,也就是访问了文件,那么atime时间就会改变。

image-20240608123453474

可以看出,使用了cat命令查看文件的内容后,文件的atime并没有修改,这是为什么呢?

一般而言,一个文件被访问的频率是很高的,我们看到的文件都是在磁盘存放着的,如果我们每次访问文件,都要修改atime,其实就是访问磁盘,如果linux中充斥着大量的访问磁盘的IO操作,变相的减慢系统的效率。

故而修改文件的atime,添加了【次数限制】。

2.Modify time

Modify time简称mtime,这是目录或文件最后一次被修改的时间。

修改文件的内容,mtime的时间自然会改变,但是这里的修改不是指只有文件的内容修改了才是修改,不是说文件的内容不改变它就不会变,而是文件是否进行了写操作

比如,我们使用vim打开一个文件,然后我们不修改文件的内容,而使用wq来退出文件。

image-20240608125212433

可以看出确实如此。mtime和文件是否进行了写操作相关。

回到之前,make是如何知道这是一个最新的文件,从而不能多次使用make命令,其实就是比较文件的mtime来看的。

解释:刚开始一定是先有的源文件,使用make命令创建除了可执行程序,源文件时间<可执行程序时间,再次使用make命令就无法实现,因为可执行程序此时就是最新的文件。

​ 但是,当我们对文件执行了写操作的话,源文件的时间就变成了:源文件时间>可执行程序时间,于是此时的源文件就变成了最新的文件,于是就可以继续执行make命令来生成可执行程序。

3.Change time

Change time简称ctime,这是对文件Inode信息最后修改时间。

I 什么是Inode?

理解inode,要从文件储存说起。
文件储存在硬盘上,硬盘的最小存储单位叫做“扇区”(Sector)。每个扇区储存512字节(相当于0.5KB)。
操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个“块”(block)。这种由多个扇区组成的“块”,是文件存取的最小单位。“块”的大小,最常见的是4KB,即连续八个 sector组成一个 block。
  文件数据都储存在“块”中,那么很显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,中文译名为“索引节点”。

II Inode中的内容?

  • 文件的字节数
  • 文件拥有者的User ID
  • 文件的Group ID
  • 文件的读、写、执行权限
  • 文件的时间戳,共有三个:ctime指inode上一次变动的时间,mtime指文件内容上一次变动的时间,atime指文件上一次打开的时间。
  • 链接数,即有多少文件名指向这个inode
  • 文件数据block的位置

总之,除了文件名以外的所有文件信息,都在存在Inode中。

七.makefile的小招

1.简化makefile写法

正常的写法:

mybin:test.c
	gcc test.c -o mybin 
.PHONY:clean
clean:
	rm -f mybin 

简化的写法①:

mybin:test
	gcc $^ -o $@
.PHONY:clean
clean:
	rm -f mybin 

这里使用$^来代替源文件,也就是依赖文件;$@来代替可执行程序,也就是目标文件。

简化的写法②:

mybin:test
	gcc -o $@ $^
.PHONY:clean
clean:
	rm -f mybin 

只需要保证-o的后面保证是$@即可。

简化的写法③:

cc=gcc
src=test.c
target=mybin
$(target):$(src)
	cc -o $@ $^
.PHONY:clean
clean:
 	rm -f $(target)

2.不显示makefile代码

image-20240608133708214

每次我们使用make或者make clean命令时,它都会把该命令打印出来,可以在makefile中的代码前加上一个@即可,这样每次就不回显了。

mybin:test.c
	@gcc  -o $@ $^ 
.PHONY:clean
clean:
	@rm -f mybin

image-20240608134011937

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

django学生信息管理系统-计算机毕业设计源码95780

摘要 从20年代开始&#xff0c;计算机疯狂的出现在人们的生活以及工作当中&#xff0c;成为人们生活、工作的好帮手&#xff0c;计算机深入到每家每户当中&#xff0c;网络办公&#xff0c;网络教学更是替换了传统手工记录管理的方式&#xff0c;使用计算机办公可以不必局限于固…

【SSM】医疗健康平台-项目开发准备

知识目标 了解架构&#xff0c;能够说出常用的架构及其优缺点 熟悉项目的技术栈&#xff0c;能够说出每个技术栈的用途 了解项目的功能结构&#xff0c;能够说出医疗健康项目的功能组成 掌握医疗健康项目的环境搭建&#xff0c;能够根据系统模块的划分搭建医疗健康项目中的父…

五、LVS原理

目录 5.1 LVS 相关原理 5.1.1 LVS集群的体系结构以及特点 5.1.1.1 LVS简介 5.1.1.2 LVS体系结构 5.1.1.3 LVS相关术语 5.1.1.4 LVS工作模式 5.1.1.5 LVS调度算法 5.1.2 LVS-DR集群介绍 5.1.2.1 LVS-DR模式工作原理 5.1.2.2 LVS-DR模式应用特点 5.1.2.3 LVS-DR模式ARP抑制 5.1…

解决layui框架自带的excel导出长数据变科学计数法(使用\t和不使用\t的方法)

前言:项目中需要导出excel时,如果是大项目、要求高,当然使用第三方插件,或者后台导出是必要的,但是如果是一些小型项目,并且对导出excel样式要求不是很严格的,而且前端框架用的是layui的,layui框架自带的excel导出就成了我们最方便快捷的选择,但是在导出数据时会遇到一…

[CUDA编程] cuda graph优化心得

CUDA Graph 1. cuda graph的使用场景 cuda graph在一个kernel要多次执行&#xff0c;且每次只更改kernel 参数或者不更改参数时使用效果更加&#xff1b;但是如果将graph替换已有的kernel组合&#xff0c;且没有重复执行&#xff0c;感觉效率不是很高反而低于原始的kernel调用…

2024年6月份实时获取地图边界数据方法,省市区县街道多级联动【附实时geoJson数据下载】

首先&#xff0c;来看下效果图 在线体验地址&#xff1a;https://geojson.hxkj.vip&#xff0c;并提供实时geoJson数据文件下载 可下载的数据包含省级geojson行政边界数据、市级geojson行政边界数据、区/县级geojson行政边界数据、省市区县街道行政编码四级联动数据&#xff0…

根据mooc 数据库旧代码 实现剥离数据库链接单独成类,并进行测试

数据源详情链接&#xff0c;SQLserver 2019 代码复制粘贴可产生数据 数据库JDBC 查询sqlserver 2019 利用模板实现输入查询-CSDN博客 效果如下 剥离的链接模块 Slinkv2.java package SQLadd;import java.sql.Connection; import java.sql.DriverManager; import java.sql.Re…

在ensp上配置动态路由协议实验设计

动态路由协议是用来在网络中自动更新路由信息的一种技术&#xff0c;它可以让网络设备&#xff08;如路由器&#xff09;根据当前网络的状态调整数据的传输路径。这种协议特别适用于大型复杂的网络环境&#xff0c;可以有效地处理网络配置的变化&#xff0c;如链接的添加、删除…

flutter报错You are currently using Java 1.8

flutter报错Could not run phased build action using connection to Gradle distribution ‘https://services.gradle.org/distributions/gradle-7.6.3-all.zip’.\r\norg.gradle.api.ProjectConfigurationException: A problem occurred configuring root project ‘android’…

Android RelativeLayout Rtl布局下的bug:paddingStart会同时作用于左右内边距

问题现象 如上图&#xff0c;只是设置了paddingStart&#xff0c;在RTL布局下&#xff0c;左右都产生了10dp的间距。其他布局如LinearLayout&#xff0c;FrameLayout则没有这个问题。 private void positionAtEdge(View child, LayoutParams params, int myWidth) {if (isLayou…

问题:一般在管理工作复杂、面广且管理分工比较细致的单位,常采用()组织形式。 #媒体#媒体

问题&#xff1a;一般在管理工作复杂、面广且管理分工比较细致的单位&#xff0c;常采用()组织形式。 A&#xff0e;直线式 B&#xff0e;职能式 C&#xff0e;矩阵式 D&#xff0e;团队式 参考答案如图所示

使用易备数据备份软件,简单快速地备份 Oracle 数据库

易备数据备份软件能够以简单高效的方式&#xff0c;实现对 Oracle 数据库的保护。 易备数据备份软件数据库备份功能的关键特性 自动保护网站数据库及应用程序实时备份&#xff0c;不需要任何中断或数据库锁定基于日期和时间的备份任务计划可恢复到一个已存在的数据库或创建一…

Web前端大作业:基于html+css+js的仿淘宝首页前端项目(内附源码)

文章目录 一、项目介绍二、项目展示三、源码展示四、源码获取 一、项目介绍 这个项目是一个Web前端大作业,目的是让学生们通过实践仿设计淘宝官网的前端页面,来全面锻炼他们的HTML、CSS和JavaScript编程能力,以及产品需求分析、界面设计、交互设计等软实力。 淘宝作为国内最大…

TMCM-BB1是单轴板驱动器

TMCM-BB4 简介 TMCM-BB1和TMCM-BB4是Trinamic插槽式模块的基板。TMCM-BB1是单轴板&#xff0c;提供对一个MCU模块和一个驱动器模块的访问。TMCM-BB4是一个4轴板&#xff0c;提供对41模块插槽的访问。TMCM-0930模块采用单36针PCI插座&#xff0c;整个系统采用主MCU&#xff08;…

【精品方案推荐】大数据治理平台建设解决方案(66页PPT)

随着企业数据量的迅速增长和复杂化&#xff0c;如何有效管理、分析和利用这些数据成为企业面临的重要挑战。大数据治理平台作为解决这一问题的关键工具&#xff0c;旨在为企业提供全面、高效的数据管理、安全保障和业务支持。 问题1&#xff1a;上大数据平台要废弃已上线的传统…

BitMEX 联合创始人 Arthur Hayes 加入 Covalent 担任战略顾问

Arthur Hayes 加入 Covalent Network&#xff08;CQT&#xff09;&#xff0c;成为其战略顾问。 Hayes 认为 Covalent 与其竞争对手如 The Graph 相比&#xff0c;Covalent Network 的 CQT 代币一直被相对低估&#xff0c;他希望帮助 Covalent Network&#xff08;CQT&#x…

【深度学习】数竹签演示软件系统

往期文章列表&#xff1a; 【YOLO深度学习系列】图像分类、物体检测、实例分割、物体追踪、姿态估计、定向边框检测演示系统【含源码】 【深度学习】物体检测/实例分割/物体追踪/姿态估计/定向边框/图像分类检测演示系统【含源码】 【深度学习】YOLOV8数据标注及模型训练方法整…

Playwright+Python+Pytest:基础方法二次封装简化及链式调用

引言 随着Web应用的日益复杂化&#xff0c;自动化测试成为了确保软件质量的关键环节。Playwright 是一个强大的自动化库&#xff0c;它支持在 Chromium、Firefox 和 WebKit 中运行自动化脚本。本文将介绍如何使用 Playwright 的 Python 同步 API 来简化点击和填充操作&#xf…

UnityAPI学习之Animator的基本使用

动画与动画控制器 示例1&#xff1a; 创建Animator对动画控制器进行统一管理&#xff0c;在Gris中创建Animator组件&#xff0c;并对其中的Controller属性进行赋值 在进行动画创作前&#xff0c;需先将图片的Texture Type属性改为Sprite(2D and UI) 再将一系列图片拖入Gris物…

【java计算机毕设】图书商城管理系统MySQL springboot vue html maven送文档

1项目功能介绍 【java计算机毕设】图书商城管理系统 Java Spring Boot vue HTML MySQL 赠送文档 PPT 2项目简介 系统功能&#xff1a; 图书商城管理系统包括管理员和用户两种角色。 管理员的功能包括在个人中心修改个人信息&#xff0c;以及在基础数据管理中管理会员等级类型和…