Linux -- 认识 make/makefile

目录

前言:

什么是 make/makefile?

怎么使用 make/makefile?

依赖关系和依赖方法: 

清理: 

怎么使用 make? 

如何编写多文件的 makefile? 

什么是PHNOY?

ACM时间

什么是ACM时间? 

Access 时间:

Change 时间:

Modify 时间:


前言:

想象一下,在一个大工程中,有大量的文件,每个文件中的代码都需要编译,我们每次编译都要写一大段的 gcc 命令,能不能简化这个重复的工作?答案是能。

什么是 make/makefile?

make 是命令,makefile/Makefile (首字母大小写皆可)是文件,makefile一旦写好了,只需要make 命令,整个工程完全自动编译,这两个搭配使用极大提高了软件开发的效率!

怎么使用 make/makefile?

假设我们现在写了一个代码,如下图所示,代码所在文件的文件名为 test.c :

在使用 make 命令之前,我们必须先写 makefile 文件,写通了 makefile 之后,make 命令才会顺利运行,否则会报错(如下图所示):

在代码所在的文件夹中 touch makefile 文件,创建 makefile 文件,之后 vim makefile,进入编辑模式: 

 

依赖关系和依赖方法: 

在 makefile 文件中,我们需要建立依赖方法和依赖关系

1、mybin:test.c 就是依赖关系,表示 mybin 文件依赖于 test.c,其中 mybin 是目标文件,test.c 是依赖文件列表;

2、gcc test.c -o mybin 就是依赖方法,此处 mybin 是 test.c 编译后生成的可执行程序。

注意依赖关系和依赖方法的格式,依赖方法前面必须空出 tab 键,这是语法要求! 

清理: 

除了创建可执行程序外,还可以提供清理可执行程序的方式:

clean:
    rm -f mybin

怎么使用 make? 

把 makefile 写完之后,输入 make 命令时,就会生成对应的目标文件: 

 

如果文件列表中的文件没有更新,此时 make 命令并不会生成对应的目标文件,会提示目标文件已经更新到最新版本了: 

 

如果我们想清理目标文件,输入 make clean 命令即可! 

 

如何编写多文件的 makefile? 

如果项目有很多文件需要编译,此时 makefile 要怎么写更便捷? 

首先假设我们此时有很多个文件(如下图所示),把这么多的文件一个个敲进 makefile 文件中是很麻烦的一件事,我们可能会忘记文件名,而导致反复退出 vim 模式去查看:

 

ls >makefile 可以把 ls 的输出结果重定向到 makefile 中: 

ls >makefile

  

此时打开 makefile 就会发现所有的文件都在 makefile 里面了,我们就不需要一个一个地把文件敲进去! 删除不需要的文件名后,就可以进行 makefile 的编写。 

 

 $@ 表示目标文件,$^ 表示依赖文件列表:

 

写完 makefile 后,此时输入 make 命令时,会自动把我们省略的部分替换成对应的文件: 

 

makefile 中还可以定义变量,make 时会自动替换,下图中若 src 需要定义多个文件,文件之间用空格隔开即可:

 

 

什么是PHNOY?

PHONY 可以修饰目标文件,让目标文件成为一个伪目标,使得 PHONY 后接的命令总是被执行! 我们一般会让 clean 命令总是被执行。 

.PHONY:clean

 

ACM时间

上面我们提到,如果目标文件已经是最新的了,那么 make 命令不会更新目标文件,那么 make 怎么知道目标文件已经是最新的呢?这就需要提到ACM时间。

什么是ACM时间? 

当我们输入命令 stat  filename  时,可以查看文件的状态信息,信息中包含文件的 Access、Modify、Change时间。

Access 时间:

上一次访问、读取文件的时间

当我们用 cat 查看代码时,实际上就是在访问文件了,Access 时间会随之更新! 

但不是每一次访问文件都会更新 Access 时间,如果短时间内频繁的访问同一个文件,Access 不会立即更新时间,而是累计到一定次数之后才会更新时间,因为频繁地更新时间,会增加系统的负担! 

Change 时间:

上一次修改文件属性的时间(修改文件的大小、权限等) 

Modify 时间:

上一次修改文件内容的时间,由于修改文件的内容也会修改文件的属性,所以修改文件的内容时,Change 时间也会随之改变!

 当我修改了 test.c 的代码时,文件的 Change时间和 Modify 时间都更新了!

make 是通过对比时间来确定可执行程序是否更新了,那么 make 是根据哪个时间来确定可执行程序需要更新了呢?答案是 Modify 时间。

正常来说,源代码创建的时间比可执行程序早,源代码的 Modify 时间也会比可执行程序的 Modify时间早!

如果我们修改了源代码,那么源代码的 Modify 时间就比可执行程序的 Modify时间晚了, make 通过比较 Modify 时间,就知道源代码更新了,此时就会去更新可执行程序!

本文到这里就i结束了,欢迎各位大佬指正!

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

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

相关文章

苹果手机照片变jpg格式该怎么做?这三种不容错过

想知道苹果手机照片变JPG格式的方法吗?如果你的苹果手机系统属于IOS11,那么系统中保存的图片属于HEIC格式。HEIC格式是无法在IOS以外的windows、安卓系统中查看的。如果想要预览,我们需要借助HEIC图片格式转换工具将HEIC转换成兼容性更好的JP…

AI绘画 Stable Diffusion图像的脸部细节控制——采样器全解析

大家好,我是画画的小强 我们在运用AI绘画 Stable Diffusion 这一功能强大的AI绘图工具时,我们往往会发现自己对提示词的使用还不够充分。在这种情形下,我们应当如何调整自己的策略,以便更加精确、全面地塑造出理想的人物形象呢&a…

Python 神器:wxauto 库——解锁微信自动化的无限可能

📝个人主页🌹:誓则盟约 ⏩收录专栏⏪:机器学习 🤡往期回顾🤡:“探索机器学习的多面世界:从理论到应用与未来展望” 🌹🌹期待您的关注 🌹&#x1f…

Mac的系统数据怎么删除 cleanmymac会乱删东西吗 cleanmymac有用吗

作为一款专业级的苹果电脑清理软件,CleanMyMac可以精准识别系统垃圾,有效防止Mac系统数据被误删。软件可以深入系统底层,清理无用的系统数据,优化苹果电脑设置,提升Mac系统性能。有关Mac的系统数据可以删吗&#xff0c…

电脑数据恢复篇:如何从电脑中恢复已删除的照片

按下 Shift Delete 后后悔了?想要恢复已删除的照片?好吧,如果是这样的话,你来对地方了。在本文中,我们将讨论如何从 PC 中恢复已删除的文件。 自从摄影的概念被提出以来,人们就对它着迷。以前&#xff0c…

NFS服务器、autofs自动挂载综合实验

综合实验 现有主机 node01 和 node02,完成如下需求: 1、在 node01 主机上提供 DNS 和 WEB 服务 2、dns 服务提供本实验所有主机名解析 3、web服务提供 www.rhce.com 虚拟主机 4、该虚拟主机的documentroot目录在 /nfs/rhce 目录 5、该目录由 node02 主机…

敏捷专家CSM认证培训内容概述(附2024年开班时间表)

敏捷专家CSM认证培训是专为希望在Scrum项目中担任Scrum Master角色的个人而设计的专业培训。CSM认证,全称Certified Scrum Master,是敏捷开发领域中备受认可的证书,由Scrum Alliance颁发。以下是对敏捷专家CSM认证培训的详细介绍:…

HNU-2024操作系统实验-Lab9-Shell

一、 实验目的 理解Shell程序的原理、底层逻辑和Shell依赖的数据结构等 在操作系统内核MiniEuler上实现一个可用的Shell程序 能够根据相关原理编写一条可用的Shell指令 二、 实验过程 首先从底层出发,实现Shell程序 1.在src/include目录下新建prt_shell.h头文…

Vue3 + Echarts堆叠折线图的tooltip不显示问题

问题介绍 使用Echarts在Vue3Vite项目中绘制堆叠折线图的的时候,tooltip总是不显示,经过很长时间的排查和修改,最后发现是在使用上有错误导致的。 错误图片展示 问题原因 由于Vue3底层使用proxy代理创建示例,使用其创建出来的实…

如何监控员工电脑行为?(其实不难,这种方法先码住!)

你的企业有没有面临以下几种问题: 这些问题,不仅影响企业员工的工作效率,更给企业数据带来不少的安全隐患。为了解决这些问题,很多企业采用监控员工电脑行为来解决当下的问题。 但我们需要注意的是,正确的监控不仅可以…

【Oracle】实验三 Oracle数据库的创建和管理

【实验目的】 掌握Oracle数据库的创建方法使用DBCA创建数据库在数据库中装入SCOTT用户及其表 【实验内容】 使用DBCA创建数据库,名为MYDB,找到其初始化文件(文本型和服务器型文件都要找到),查看各类默认位置并记录下来(包括物理文件所在目…

LabVIEW与ABB工业机器人据监控

​1. 前言 随着工业自动化的发展,工业机器人在制造业中的应用越来越广泛。为了实现对工业机器人的高效监控和控制,本文介绍了利用OPC(OLE for Process Control)服务器将ABB工业机器人与LabVIEW连接起来的解决方案。通过OPC服务器…

OpenCV和PIL进行前景提取

摘要 在图像处理和分析中,前景提取是一项关键技术,尤其是在计算机视觉和模式识别领域。本文介绍了一种结合OpenCV和PIL库的方法,实现在批量处理图像时有效提取前景并保留原始图像的EXIF数据。具体步骤包括从指定文件夹中读取图像&#xff0c…

TQZC706开发板教程:在ZC706+ADRV9009硬件平台运行ADI Linux

本教程使用2024-06-18的ADI镜像文件,创建ZC706ADRV9009的linux工程进行测试。 首先需要下载ADI的镜像文件下载地址如所示: https://wiki.analog.com/resources/tools-software/linux-software/adi-kuiper_images/release_notes#r2_patch_1 烧写完成后若…

JAVA毕业设计147—基于Java+Springboot的手机维修管理系统(源代码+数据库)

基于JavaSpringboot的手机维修管理系统(源代码数据库)147 一、系统介绍 本项目分为用户、管理员、维修员三种角色 1、用户: 注册、登录、新闻公告、售后申请、申请列表、意见反馈、个人信息、密码修改 2、管理员: 用户管理、用户管理、栏目管理、网…

SpringSecurity中文文档(Servlet Authorize HttpServletRequests)

Authorize HttpServletRequests SpringSecurity 允许您在请求级别对授权进行建模。例如,对于 Spring Security,可以说/admin 下的所有页面都需要一个权限,而其他所有页面只需要身份验证。 默认情况下,SpringSecurity 要求对每个…

6、Redis系统-数据结构-04-Hash

四、哈希表(Hashtable) 哈希表是一种高效的键值对数据结构,通过散列函数将键映射到表中的位置,实现快速的插入、删除和查找操作。Redis 广泛使用哈希表来实现 Hash 对象和数据库的键值存储。以下将从结构设计、哈希冲突与链式哈希…

快速测试electron环境是否安装成功

快速测试electron环境是否安装成功 测试代码正确运行的效果运行错误的效果v22.4.1 版本无法使用v20.15.1版本无法使用v18.20.4 版本无法使用 终极解决办法 测试代码 1.npx create-electron-app my-electron-app 2.cd my-electron-app 3.npm start 正确运行的效果 环境没问题…

Android系统设置kernel log level的方法

Android log相关文档索引: 使用ADB命令控制logcat日志本地存储功能-CSDN博客 Android系统通过属性设置来控制log输出的方案-CSDN博客 Android系统设置kernel log level的方法-CSDN博客 Android系统设置kernel log level的方法 背景 kernel log内容过多/过少会影…

oak相机使用oak官网方式标定

目录 一、depthai ROS驱动 一、depthai ROS驱动 (1)驱动下载地址:2. C 开发快速上手 — DepthAI Docs 0.3.0.0 documentation sudo apt install ./depthai_2.17.1_arm64.deb //运行 Python3 utilities/cam_test.py -mres 400 -cams rgb,m …