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

【Linux】Make/Makefile

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

这个3/4行的语法和1/2行是一样的。也是依赖关系和依赖方法。

在这里插入图片描述

make命令扫描makefile文件时,从上向下扫描,默认形成一个目标文件。

指定make clean的时候才回去执行对应的清除。

为什么要给我们的clean.PHONY:clean声明它是伪目标呢?

PHONY类似一种建议性的关键字。

伪目标,表示对应的依赖方法和依赖关系总是被执行。

什么叫不被执行?

我们上面的这组可执行程序没有被修饰,所以我们如果make完又make,是不会执行的。但如果用为目标修饰了,就会发现也可以执行。

在这里插入图片描述

所以我们一般可执行程序不用伪目标修饰,因为如果代码没有更新,没有必要再次编译。

默认老代码不作重新编译。

make怎么知道bin和.c的新旧?

在这里插入图片描述

Linux下每一个文件有三个相关时间,分别是Access/Modify/Change

文件=内容+属性

cat打印内容,ls打印属性

如果我们只改文件内容,那么Modify时间被修改。

如果我们只改文件属性,那么Change时间被修改。

如果不修改,单纯查看,Access时间被更新。

在这里插入图片描述

可以看到,这样我们的Modfiy时间就被改了。

而且文件属性页同步变化了,所以时间也改了:

在这里插入图片描述

大小和时间本就是文件的属性,所以基本都会同时修改。

在这里插入图片描述

更改这个权限,我们就是只改属性。

如果过于高频因为查看就更新时间,会有很多隐性的成本。所以linux现在查看上若干次才会更新一次Access时间,具体多少次看具体系统。

我们知道,myproc.c的Modify时间应当是要比myroc早的。所以make可以以此为依据判断myproc.c是否被修改过了。

我们曾经说过,touch可以用来改文件时间:

在这里插入图片描述

比如带上-a,就可以只改Access时间。

如果什么选项都不带,就会把ACM三个时间全部更新。

所以通过touch更改时间,也能使我们重复使用make。

在这里插入图片描述

所以PHONY的作用就是修饰后总是被执行,如果我们用其修饰第一组的代码,我们就可以重复使用make。

在makefile中注释代码我们使用#来注释。

在这里插入图片描述

在这里插入图片描述

makefile会在自己内部维护一个类似栈结构的东西。

makefile推导规则

在这里插入图片描述

从上往下扫描,从下往上执行。

当我们从上往下扫描,一条找不到时就入栈。所以就保证了我们最后找到myproc.c时,从下往上的执行顺序。


当然我们一般不会这么去写整个过程,自己增加难度。

makefile也允许我们去定义变量。所以我们写makefile一般喜欢这样写:

在这里插入图片描述

在这里插入图片描述

如果改写成这样:

在这里插入图片描述

就不会回显命令。
在这里插入图片描述

在这里插入图片描述

这样,BIN是我们的目标文件,CC是编译器,SRC是源文件,FLAGS是方法。我们将这组变量打印。

在这里插入图片描述

$(BIN)就是取它的内容。

所以我们全以变量的形式呈现了。这就是一个基于变量版本的makefile了。

有点像宏。
在这里插入图片描述

所以我们也能猜出,这样做的好处也就是替换具体的文件时不用改后面的代码了,只要在变量处稍作修改。

在这里插入图片描述

其实,还可以写得更加优雅:

在这里插入图片描述

$@代表的是目标文件,$^代表的是依赖的众多文件列表。

我们的依赖方法来源不止一行。

我们可以把默认的显示信息用@关闭,然后写自己的信息:

在这里插入图片描述

在这里插入图片描述

但我们发现还是将echo回显了,于是我们继续优化:

在这里插入图片描述


多文件呢?

而且,我们并不喜欢直接从.c到可执行文件,而是喜欢先从.c到.o,原因以前说过,为了方便去链接C语言库等,所以我们要改写。

在这里插入图片描述

LFLAGS的L代表link。OBJ代表.o文件。

.o文件从哪来的?所以我们要再写一组依赖关系和方法。但是一般我们的.c文件和以此生成的.o文件不止一个,为了简写,我们使用%.o:%.c这样来写我们的依赖关系。%就像makefile模式下的通配符;在依赖关系中我们也简写为:$(CC) $(FLAGES) $<,也是gcc -c $<,这里<用来简写所有的.c文件。

在这里插入图片描述

我们知道,gcc -c myproc.c -o myproc.o可以帮我们从.c文件编译到.o文件。

然后,gcc -c myproc.c则可以帮我们直接编译出同名.o文件。

这也就是为什么上面我们写成$(CC) $(FLAGS) $<

在这里插入图片描述

优化:

在这里插入图片描述

这个地方,我们可以SRC=$(shell ls *.c)执行ls *.c的命令,然后把对应所有的源文件放在SRC中。就不用我们一个一个手写要的源文件了。

第二种做法:

makefile天生自带类似函数的东西,可以支持我们这样写:SRC=$(wildcard *.c)

也是类似通配符。

在这里插入图片描述

所以我们的OBJ同样也需要这样能够使用类似通配符的效果,来避免一个一个手写。

OBJ=$(SRC:.c=.o)

这就是最终的makefile。

我们这样来创建100个文件:

在这里插入图片描述

不用改刚才的makefile文件了,可以直接这样使用make和make clean:

在这里插入图片描述

在这里插入图片描述

Makefile还有其他语法,日后可以再学。

相关文章:

【Linux】Make/Makefile

这个3/4行的语法和1/2行是一样的。也是依赖关系和依赖方法。 make命令扫描makefile文件时&#xff0c;从上向下扫描&#xff0c;默认形成一个目标文件。 指定make clean的时候才回去执行对应的清除。 为什么要给我们的clean.PHONY:clean声明它是伪目标呢&#xff1f; PHONY类…...

C++练级计划->《多态》虚函数表,菱形继承多态

目录 什么是多态&#xff1f; 多态的条件 虚函数&#xff1a; 虚函数的重写&#xff1a; 协变 析构函数的重写 C11 final 和 override final&#xff1a; override&#xff1a; 总结&#xff1a; 三重对比&#xff1a;重载重写重定义对比 抽象类 多态的原理 虚函数…...

OkHttp3 - 2. OkHttp的核心组件与架构

1 OkHttp的工作原理 OkHttp3 的核心设计遵循以下原则&#xff1a; 请求与响应的分离&#xff1a;通过 Request 和 Response 对象解耦请求构建与结果处理。异步与同步支持&#xff1a;使用 Call 对象管理请求&#xff0c;可以同步或异步执行。高效连接复用&#xff1a;通过连接…...

异或操作解决一些问题

前提&#xff1a; 异或操作符合交换律&#xff0c;结合律&#xff08;因为其根本上来抽象理解&#xff0c;就是查看所有项二进制数相同位是否有奇数个1&#xff0c;对运算结果二进制数而言&#xff0c;没有该位为0&#xff0c;有该位为1&#xff0c;与顺序无关&#xff09;。 …...

操作系统之输入输出

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…...

Centos 安装 Node.js 和 npm

方法2&#xff1a;使用 NVM&#xff08;Node Version Manager&#xff09;安装 安装 NVM curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash 重新加载配置 source ~/.bashrc 安装最新的 LTS 版本的 Node.js nvm install --lts 验证安装…...

C语言——指针初阶(一)

目录 一.什么是指针&#xff1f;&#xff1f;&#xff1f; 指针是什么&#xff1f; 指针变量&#xff1a; 总结&#xff1a; 总结&#xff1a; 二.指针和指针类型 指针-整数&#xff1a; 总结&#xff1a; 指针的解引用 总结&#xff1a; 三.野指针 如何规避野指针 往期…...

React Native 原生开发指南

写在前面 React Native (RN) 是一个用于构建跨平台移动应用的框架。它允许开发者使用 JavaScript 和 React 来编写应用程序&#xff0c;并将其转换为原生代码。虽然 RN 提供了许多内置的组件和 API&#xff0c;但有时候你可能需要访问原生平台的特定功能或性能优化。为此&…...

【前端】JavaScript中的柯里化(Currying)详解及实现

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: 前端 文章目录 &#x1f4af;前言&#x1f4af;什么是柯里化&#xff1f;&#x1f4af;柯里化的特点&#x1f4af;柯里化的简单示例&#x1f4af;通用的柯里化实现&#x1f4af;柯里化让代码更易读的原因&#x1f4af…...

解决 docker 部署 vsftpd 速度慢问题

解决 docker 部署 vsftpd 速度慢问题 Docker 部署 ftp version: 3.8services:ftps:image: fauria/vsftpdcontainer_name: my-ftpsenvironment:- FTP_USERyourusername- FTP_PASSyourpassword- PASV_ADDRESS192.168.0.123 # 使用环境变量或直接指定IP地址- PASV_MIN_PORT4900…...

Java基础夯实——2.9 多线程如何共享数据

在 Java 多线程编程中&#xff0c;共享数据通过以下几种方式实现&#xff1a; 1. 使用共享对象 多个线程可以通过引用同一个对象来实现数据共享。例如&#xff1a; class SharedData {private int count;public synchronized void increment() {count;}public synchronized …...

【Leetcode Top 100】234. 回文链表

问题背景 给你一个单链表的头节点 h e a d head head&#xff0c;请你判断该链表是否为 回文链表&#xff08;回文 序列是向前和向后读都相同的序列&#xff09;。如果是&#xff0c;返回 t r u e true true&#xff1b;否则&#xff0c;返回 f a l s e false false。 数据…...

GitLab指定用户分配合并权限

进入项目 -》 Project Settings Repository -》展开 Protected branches -》 添加要保护的分支&#xff0c;设置角色 管理用户角色权限 查看到不同用户的角色&#xff0c;一般设置Developer只有Merger Request权限&#xff0c;Maintainer还有Merge审批权限 GitLab 中的权限…...

五,[GXYCTF2019]Ping Ping Ping1

进入靶场&#xff0c;有提示 我们在url试着输入本地IP&#xff0c;返回了ping命令 既然要在url处传参&#xff0c;那就用postman&#xff0c;再输入ip127.0.0.1 & ls&#xff0c;试着列出目录内容 ok&#xff0c;好像是个脏话,它过滤了空格 试着穿越又看到了脏话&#xff0…...

基于STM32的智能无人机自主飞行与目标识别系统设计

目录 引言系统需求分析 2.1 功能需求 2.2 硬件需求 2.3 软件需求系统设计 3.1 总体架构 3.2 各模块设计系统实现 4.1 硬件实现 4.2 软件实现系统调试与优化总结与展望 1. 引言 随着无人机技术的快速发展&#xff0c;无人机在军事侦察、环境监测、物流配送等领域的应用逐渐增多…...

C 语言数组与函数:核心要点深度剖析与高效编程秘籍

我的个人主页 我的专栏&#xff1a;C语言&#xff0c;希望能帮助到大家&#xff01;&#xff01;&#xff01;点赞❤ 收藏❤ 目录 引言数组基础 2.1 数组的定义与初始化 2.2 一维数组的基本操作 2.3 二维数组及其应用 2.4 数组与指针的关系函数基础 3.1 函数的定义与调用 3.2…...

汽车轮毂结构分析有哪些?国产3D仿真分析实现静力学+模态分析

本文为CAD芯智库原创&#xff0c;未经允许请勿复制、转载&#xff01; 之前分享了如何通过国产三维CAD软件如何实现「汽车/汽配行业产品设计」&#xff0c;兼容NX&#xff08;UG&#xff09;、Creo&#xff08;Proe&#xff09;&#xff0c;轻松降低企业上下游图纸交互成本等。…...

解决jupyter notebook 新建或打开.ipynb 报500 : Internal Server Error(涉及jinja2兼容性问题)

报错&#xff1a; [E 10:09:52.362 NotebookApp] 500 GET /notebooks/Untitled16.ipynb?kernel_namepyt hon3 (::1) 93.000000ms refererhttp://localhost:8888/tree ...... 重点是&#xff1a; from .exporters import * File "C:\ProgramData\Anaconda3\lib\site-p…...

【若依ruoyi Vue前端线上个人服务器部署】以及常见报错问题解决

提示&#xff1a;【若依ruoyi Vue前端线上个人服务器部署】以及常见报错问题解决 文章目录 前言一、若依ruoyi Vue前端部署常见两种错误1、404问题2、找不到….模块 二、使用步骤&#xff08;正式开始&#xff09;1.修改vue.config.js中的publicPath属性。2.修改router/index.j…...

Python学习第十天--处理CSV文件和JSON数据

CSV&#xff1a;简化的电子表格&#xff0c;被保存为纯文本文件 JSON&#xff1a;是一种数据交换格式&#xff0c;易于人阅读和编写&#xff0c;同时也易于机器解析和生成&#xff0c;以JavaScript源代码的形式将信息保存在纯文本文件中 一、csv模块 CSV文件中的每行代表电…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

三维GIS开发cesium智慧地铁教程(5)Cesium相机控制

一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点&#xff1a; 路径验证&#xff1a;确保相对路径.…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

HTML 列表、表格、表单

1 列表标签 作用&#xff1a;布局内容排列整齐的区域 列表分类&#xff1a;无序列表、有序列表、定义列表。 例如&#xff1a; 1.1 无序列表 标签&#xff1a;ul 嵌套 li&#xff0c;ul是无序列表&#xff0c;li是列表条目。 注意事项&#xff1a; ul 标签里面只能包裹 li…...

React19源码系列之 事件插件系统

事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

leetcodeSQL解题:3564. 季节性销售分析

leetcodeSQL解题&#xff1a;3564. 季节性销售分析 题目&#xff1a; 表&#xff1a;sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

ios苹果系统,js 滑动屏幕、锚定无效

现象&#xff1a;window.addEventListener监听touch无效&#xff0c;划不动屏幕&#xff0c;但是代码逻辑都有执行到。 scrollIntoView也无效。 原因&#xff1a;这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作&#xff0c;从而会影响…...

算法笔记2

1.字符串拼接最好用StringBuilder&#xff0c;不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

【7色560页】职场可视化逻辑图高级数据分析PPT模版

7种色调职场工作汇报PPT&#xff0c;橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版&#xff1a;职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

视觉slam十四讲实践部分记录——ch2、ch3

ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...