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

【Linux我做主】make和makefile自动化构建

make和makefile自动化构建

  • make和makefile自动化构建
  • github地址
  • 前言
  • 背景介绍
    • 为什么需要make和makefile?
  • make和makefile解析
    • 什么是make和makefile
    • 依赖关系和依赖方法
      • 核心语法结构
      • 简单演示
        • 编译
        • 清理
      • 多阶段编译示例
    • make时执行的顺序
      • 场景1:clean目标在前(特殊情况)
      • 场景2:总构建目标在前(一般情况)
    • make如何实现不编译未被修改的文件
      • 场景引入
      • make实现原理
        • stat命令查看文件的属性
        • 三种时间:
          • 1. Access Time (atime)
          • 2. Modify Time (mtime)
          • 3. Change Time (ctime)
          • **对比总结**
          • **实际应用场景**
          • 文件 = 文件属性 + 文件内容
        • touch命令会修改相关的时间
      • **操作时间戳的命令**
    • 项目清理
      • 编写清理规则
      • makefile中的特殊符号
    • 总结make的构建原理
  • 结语

make和makefile自动化构建

github地址

有梦想的电信狗

前言

在Linux环境下开发中,makemakefile是构建复杂项目的核心工具。本文将深入解析其工作原理,并通过实例演示如何编写高效的自动化构建规则。


背景介绍

为什么需要make和makefile?

回顾我们编译单个文件时,例如main.c,使用如下命令:

gcc main.c -o main

单个文件,我们如此编译尚且可以。

但是,当一个项目中有成百上千个源文件时,这样子手动编译难免有些不够优雅。

手动输入命令容易显得有些繁琐,且容易出错

makemakefile就是为了解决这样的问题的。

makemakefile的功能和优势:

  • 大型项目管理:当工程包含数百个源文件时,手动编译和链接效率极低。
  • 自动化编译:通过定义规则明确编译顺序和依赖关系,make命令可一键完成全量构建。
  • 跨平台协作makefileUnix/Linux世界的通用构建语言,被所有主流IDE支持。

make和makefile解析

什么是make和makefile

  • make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:DelphimakeVisual C++nmakeLinuxGNUmake。可见,makefile都成为了一种在工程方面的自动化构建方法。

  • makefile是一个文件,是一个按照特定规则编写的文件,当makefile编写完成后,make可以识别文件中的内容进行相应的操作。

  • make是一条命令,是一个可执行程序。

  • makefile是一个当前目录下的文件,和make搭配使用,完成项目自动化构建。其中makefile命名为makefileMakefile均可,首字母M/m不区分大小写。

依赖关系和依赖方法

核心语法结构

target1: prerequisitesrecipe
target1: prerequisitesrecipe
target1: prerequisitesrecipe
# ......
targetn: prerequisitesrecipe
  1. 目标(Target):要构建的目标

    • 最终产物(可执行文件)或中间产物(.o文件)
    • 支持伪目标(.PHONY target)用于执行操作
    • 示例:.PHONY修饰clean, install等非文件目标
  2. 依赖项(Prerequisites):构建目标所需的依赖文件项

    • 构建目标所需的文件(如.c.o文件)
    • 显式声明:直接列出的依赖文件,支持使用通配符*
    • 隐式依赖:通过变量或通配符自动推导
    • 顺序敏感:依赖列表的顺序影响构建优先级
  3. 配方(Recipe):生成目标所用到的shell命令。

    • 必须以Tab开头(4空格会导致语法错误)
    • 每条命令在独立shell中执行,每条当前形成当前target所需要的方法,称为依赖方法。该方法一般是Linux下的命令。
    • 使用@前缀抑制命令回显

简单演示

编译

有以下源程序mycode.c
在这里插入图片描述
在这里插入图片描述
输入以下指令:我们的单个源程序就跑起来了。

make
./mycode

在这里插入图片描述

可以看到:

  • 我们不需要输入繁琐的gcc编译指令,只需要输入make就自动可以帮助我们编译完成。
  • 输入make的本质还是执行了gcc编译指令。
清理
  • makefile文件中定义了clean目标的依赖方法时,输入make clean即可完成程序文件的清理。
    在这里插入图片描述

多阶段编译示例

有如下makefile
在这里插入图片描述

  • 依赖链mycode.c → mycode.i → mycode.s → mycode.o → mycode
  • 编译流程:预处理→编译→汇编→链接
    在这里插入图片描述

make时执行的顺序

找到
未找到
make命令
查找Makefile
解析第一个规则
报错退出
构建依赖树
执行拓扑排序
遍历所有节点
需要构建?
执行配方
跳过
更新时间戳
$ make
  1. 从终极目标mycode开始逆向解析
  2. 检查mycode是否存在或需要更新
  3. 递归检查mycode.smycode.imycode.c的依赖关系
  4. 按依赖链顺序执行编译命令

场景1:clean目标在前(特殊情况)

在这里插入图片描述

场景2:总构建目标在前(一般情况)

在这里插入图片描述

观察以上结果,可以看到,只执行make时,却执行了clean
执行make mycode,又得到了正确的编译结果。这是为什么呢?

由上我们可以总结归纳出:

  • make后面要跟上构建的target名。
  • make后面什么都不跟时,默认寻找Makefile中第一个target的依赖关系,执行其依赖方法。
  • make targetNamemake后面跟上target的名字时,该命令可以无视makefile中的出现次序,构建指定为targeName的目标文件
  • 建议
    • 建议将要生成的可执行程序作为第一个依赖关系,这样只输入make即可完成构建
    • 建议将clean放在最后,防止他人的误操作。

make如何实现不编译未被修改的文件

场景引入

观察一下场景:

  • 我们在make一次之后,如果没有对源文件进行修改,就无法再次make了。
    在这里插入图片描述
    在这里插入图片描述
    这是因为没有必要
  • 如果源文件没有被修改,再次编译得到的结果还是一样的。
  • make设计出这样的功能,是为了提高编译效率节省编译的时间开销

那么,以上功能是如何实现的呢?

make实现原理

可以思考下,如果让我们自己实现这样的功能,我们的思路会是怎么样的?

思路大致如下:

  • 通常情况下,我们一定是由源文件编译形成可执行文件。先有源文件,才会有可执行文件

  • 因此,一般而言(不通过命令改变文件的修改时间),源文件的最近修改时间,一定比可执行文件的最近修改时间要更老!!!

  • 因此,只需要比较可执行程序的最近修改时间和源文件的最近修改时间即可。

    • (此处用.exe代替可执行程序,Linux下是编译形成的有可执行权限的文件)

    • 最近修改时间,.exe新于.c,说明源文件时老的,不需要重新编译

    • 最近修改时间,.exe老于.c,说明源文件时新的,需要重新编译

    • 而一般而言,.exe.c的最近修改时间是不会一样的,除非通过命令来统一修改。

  • 因此,如果我们更改了源文件,历史上曾经还有可执行文件,那么源文件的最近修改时间,一定比可执行程序要新!

而文件的最近修改时间属于文件属性的一部分。

stat命令查看文件的属性

在这里插入图片描述

**我们今天先只关注文件属性中的时间,其他的属性暂不展开叙述。**以下是简介:

Linux/Unix 文件系统中,每个文件都有三个与时间相关的重要属性,可以通过 stat 命令查看。以下是它们的详细解释:


三种时间:
1. Access Time (atime)

定义:文件最后一次被 访问(读取)的时间
触发场景
• 用 catless 查看文件内容
• 用 grep 搜索文件内容
• 程序读取文件(如脚本执行、软件加载配置文件)
例外:如果使用 mount -o noatime 挂载文件系统,访问时间不会更新(提高性能)


2. Modify Time (mtime)

定义文件内容最后一次被 修改 的时间
触发场景
• 用编辑器修改文件内容
• 重定向输出到文件(如 echo "text" > file
• 文件被程序写入新数据
注意:修改文件内容会同时更新 change time(见下文)

示例

echo "new content" > myfile.txt  # 修改时间和change time均更新

3. Change Time (ctime)

定义:文件 元数据(metadata)(属性)最后一次被修改的时间
触发场景
• 修改文件权限(chmod
• 修改文件所有者(chown
• 创建硬链接
• 重命名文件
修改文件内容(因为文件大小等元数据变化)
注意ctime 不可通过 touch 直接修改,只能通过元数据操作间接更新

示例

chmod 644 myfile.txt  # change time更新

对比总结
时间类型简称触发操作查看命令
Accessatime读取文件内容stat -c %x filename
Modifymtime修改文件内容stat -c %y filename
Changectime修改文件属性stat -c %z filename

实际应用场景
  1. 备份系统:通过 mtime 判断文件内容是否变化,决定是否需要备份。
  2. 日志分析:通过 atime 追踪可疑的文件访问记录。
  3. 调试问题:用 ctime 确认文件权限或所有权是否被意外修改。
  4. 恢复文件:结合三个时间戳分析文件历史操作。

文件 = 文件属性 + 文件内容

我们之前提到过,文件 = 文件属性 + 文件内容,由上可以总结为:

  • 修改文件内容后,Modify时间会改变
  • 修改文件属性后,Change时间会改变
  • 一项操作可能同时改变三种时间中的多个

三种时间,可以用acm来简化记忆。

touch命令会修改相关的时间

在这里插入图片描述


  • touch会修改文件属性,修改后make便可再次编译
  • make通过比较源文件和可执行文件最近修改时间的新旧来判定要不要进行编译
  • 比较时将属性中的时间转化为Linux时间戳进行比较

在这里插入图片描述


操作时间戳的命令

查看时间戳

stat filename	# 查看文件的属性,属性中包含有时间,filename代表系统中文件的名字

修改时间戳

touch -a filename  # 仅修改atime  即为Access时间
touch -m filename  # 仅修改mtime  即为Modify时间
touch -t 202301010000 filename  # 指定时间(格式:[[CC]YY]MMDDhhmm[.ss])

  • 高级知识

relatime:现代 Linux 默认使用 relatime(仅当 atimemtimectime 旧时才更新,平衡性能与准确性)
ext4 的纳秒精度ext4 文件系统支持时间戳的纳秒级记录

  • 注意:touch命令可通过-a ``-m选项单独修改一个文件的Access时间和Modify,但无法单独修改文件的change时间
  • touch filename指令:无参数的 touch 命令会修改文件的三个时间。

项目清理

编写清理规则

  • 实际上makefile的清理命令make clean我们已经一直在使用了。
    在这里插入图片描述
.PHONY: clean
clean:rm -f mycode
  • clean是我们的targetrm -f mycode是目标的依赖方法,clean的依赖方法也可以是其他的命令。

前文我们提到,make通过比较源文件和可执行文件最近修改时间的新旧来判定要不要进行编译,但如果我就是想让一个target在每次make时都重新进行编译,该怎么办呢?这便是.PHONY的作用。

  • .PHONY声明伪目标,避免与同名文件冲突
  • 强制执行:无论是否存在clean文件,make clean都会执行
  • .PHONY修饰的目标文件,只要输入make,总是会被执行
    在这里插入图片描述
  • 实际上不建议用.PHONY修饰总的目标文件,简直用.PHONY修饰clean

makefile中的特殊符号

makefile中有很多特殊符号,本文只介绍三种特殊符号:@ $^ $@

  • @:@用于修饰依赖方法,使make之后,执行的命令不在终端中回显。
  • $^ $@ 常用在依赖方法中:
    • $@用来表示依赖关系冒号左边的内容。
    • $^用来表示依赖关系冒号右边边的内容。

在这里插入图片描述


总结make的构建原理

  1. 查找Makefile:优先读取Makefilemakefile
  2. 确定终极目标:解析第一个目标(示例中的hello
  3. 依赖树分析:递归检查所有依赖项是否存在
  4. 时间戳比对:若依赖文件比目标文件新,则触发重新编译
  5. 增量构建:仅重新编译修改过的文件及其依赖链

结语

通过合理设计makefile,开发者可以:

  1. 实现一键式编译,提升开发效率
  2. 利用增量编译节省构建时间
  3. 规范项目的构建和清理流程

如果本文对你有帮助,欢迎点赞收藏,技术问题欢迎在评论区交流!
一键三连,好运连连!

相关文章:

【Linux我做主】make和makefile自动化构建

make和makefile自动化构建 make和makefile自动化构建github地址前言背景介绍为什么需要make和makefile? make和makefile解析什么是make和makefile依赖关系和依赖方法核心语法结构简单演示编译清理 多阶段编译示例 make时执行的顺序场景1:clean目标在前(特…...

spring boot应用部署IIS

Windows IIS 部署 Spring Boot 应用详细指南 本文档提供了在 Windows Server 上使用 IIS 部署 Spring Boot 应用的完整步骤和最佳实践。 目录 概述前期准备Spring Boot 应用准备安装配置必要组件配置 IIS 站点配置反向代理配置 Windows 服务配置应用自启动HTTPS 配置日志配置…...

Linux系统之部署TestNet资产管理系统

Linux系统之部署TestNet资产管理系统 一、TestNet 介绍1.1 TestNet简介1.2 主要特点1.3 主要使用场景 二、本次实践规划2.1 本地环境规划2.2 本次实践介绍 三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本 四、部署TestNet系统4.1 下载T…...

@EnableAsync+@Async源码学习笔记之六

接上文,我们本文分析 AsyncExecutionAspectSupport 的源码: package org.springframework.aop.interceptor;import java.lang.reflect.Method; import java.util.Map; import java.util.concurrent.Callable; import java.util.concurrent.CompletableFu…...

SQL系列:常用函数

1、【MySQL】合并字段函数(列转行) 它可以将两个字段中的数据合并到一个字段中。 1)CONCAT函数 CONCAT函数可以将多个字段中的数据合并到一个字段中。它的语法格式如下: SELECT CONCAT(字段1,字段2,...字段N) FROM 表名;SELEC…...

Git 中修改某个特定的commit提交内容

在 Git 中修改某个特定的提交(commit)通常需要使用 交互式变基(Interactive Rebase) 或 修改提交(Commit Amend)。以下是不同场景下的具体操作步骤: 一、修改最近的提交(最新提交&am…...

FHS --- linux目录结构(部分目录解释)

根目录(/) 的意义和内容 : 根目录是整个系统最重要的一个目录,因为不但所有的目录都是由根目录衍生出来的,同时根目录也与开机/还原/系统修复等动作有关 。 由于系统开机时需要特定的开机软件、核心档案、开机所需程序…...

不带无线网卡的Linux开发板上网方法

I.MX6ULL通过网线上网 设置WLAN共享修改开发板的IP 在使用I.MX6ULL-MINI开发板学习Linux的时候,有时需要更新或者下载一些资源包,但是开发板本身是不带无线网卡或者WIFI芯片的,尝试使用网口连接笔记本,笔记本通过无线网卡连接WIFI…...

图书管理系统C语言

图书管理系统C语言代码示例。 该系统可以实现图书信息&#xff08;包含图书编号、书名、作者、出版社、价格、库存数量&#xff09;的录入、显示、查询、修改、删除等功能&#xff0c;还具备一定的错误处理和输入验证。 #include <stdio.h> #include <stdlib.h> …...

关于大型语言模型的“生物学”

我知道我们已经聊过很多次&#xff0c;关于LLM是怎么运作的&#xff0c;它们的影响力&#xff0c;还有它们的使用场景。但尽管现在有那么多讲LLM的文章&#xff0c;它们本质上还是个黑箱。 但我们真正要问自己的问题是&#xff0c;为什么理解这些系统的内部结构很重要&#xf…...

图像预处理-图像边缘检测(流程)

一.高斯滤波 因为图像边缘检测就是把像素值有差异的地方提取出来&#xff0c;所以噪声会有很大影响&#xff0c;因此需要对图像进行平滑处理&#xff0c;高斯滤波是流程中常用的方法。 二.计算图像的梯度与方向 过程中通常使用sobel算子进行梯度计算&#xff0c;在OpenCV中&am…...

解锁思想道德修养的奥秘:用思维导图开启智慧之旅

在我们的成长过程中&#xff0c;思想道德修养如同基石&#xff0c;奠定了我们为人处世、面对生活挑战的基本态度和准则。而如何高效地梳理和掌握思想道德修养的丰富内容呢&#xff1f;思维导图这一强大工具为我们提供了独特视角和便捷途径。 思想道德修养的关键板块 道德理论…...

swagger的简介及使用方法

Swagger 是一个用于描述、生成、文档化和测试 RESTful API 的开源工具集。它可以自动生成 API 文档&#xff0c;帮助开发者理解和使用 API。Swagger 由 Swagger.io 提供&#xff0c;并已经发展成了一套广泛应用于 API 设计和文档的标准。 Swagger 项目的历史可以追溯到 2010 年…...

解决Ubuntu图形化界面操作适配问题

1 缘起 使用Ubuntu GNOME图形化系统作为开发机&#xff0c; 遇到与Windows操作不一致的地方&#xff0c;比如PyCharm、IntelliJ时无法正确代码跳转&#xff0c; 如CtrlAltLeft&#xff0c;CtrlAltRight无法正常在代码级别跳转&#xff0c;只能在文件级别跳转。 基于这个开端&a…...

End-to-End从混沌到秩序:基于LLM的Pipeline将非结构化数据转化为知识图谱

摘要:本文介绍了一种将非结构化数据转换为知识图谱的端到端方法。通过使用大型语言模型(LLM)和一系列数据处理技术,我们能够从原始文本中自动提取结构化的知识。这一过程包括文本分块、LLM 提示设计、三元组提取、归一化与去重,最终利用 NetworkX 和 ipycytoscape 构建并可…...

使用Ingress发布应用程序

使用Ingress发布应用程序 文章目录 使用Ingress发布应用程序[toc]一、什么是Ingress二、定义Ingress三、什么是Ingress控制器四、部署nginx Ingress控制器1.了解nginx Ingress控制器的部署方式2.安装nginx Ingress控制器3.本地实际测试 五、使用Ingress对外发布应用程序1.使用D…...

llama-factory微调报错:

报错信息 [INFO] [utils.py:789:see_memory_usage] CPU Virtual Memory: used 81.51 GB, percent 64.9% W0419 10:14:27.573000 108354 site-packages/torch/distributed/elastic/multiprocessing/api.py:897] Sending process 108373 closing signal SIGTERM W0419 10:14:27…...

【LLaMAFactory】LoRa + 魔搭 微调大模型实战

前言 环境准备 之前是在colab上玩&#xff0c;这次在国内的环境上玩玩。 魔搭&#xff1a;https://www.modelscope.cn/ 现在注册&#xff0c;有100小时的GPU算力使用。注册好了之后&#xff1a; 魔搭社区 这里使用qwen2.5-7B-Instruct模型&#xff0c;这里后缀Instruct是指…...

【愚公系列】《Python网络爬虫从入门到精通》054-Scrapy 文件下载

&#x1f31f;【技术大咖愚公搬代码&#xff1a;全栈专家的成长之路&#xff0c;你关注的宝藏博主在这里&#xff01;】&#x1f31f; &#x1f4e3;开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主&#xff01; &#x1f…...

db中查询关于null的sql该怎么写

正确示例 # 等于null select * from 表名 where 字段名 is NULL; # 不等于null select * from 表名 where 字段名 is not NULL;若需要同时判断字段不等于某个值且不为null select * from users where age ! 30 and age is not null; select * from users where age ! 30 or a…...

React 文章列表

自定义hook 在src/hooks文件夹下封装 useChannel.js // 获取频道列表的逻辑 import { useEffect , useState } from "react" import { getChannelAPI } from "/apis/article"function useChannel(){// 获取频道的逻辑 const [channelList,setChannelList…...

中间件--ClickHouse-12--案例-1-日志分析和监控

1、案例背景 一家互联网公司需要实时分析其服务器日志、应用日志和用户行为日志&#xff0c;以快速发现潜在问题并优化系统性能。 2、需求分析 目标&#xff1a;实时分析日志数据&#xff0c;快速发现问题并优化系统性能。数据来源&#xff1a; 服务器日志&#xff1a;如 Ng…...

QML中的3D功能--自定义着色器开发

在 Qt 3D 中使用自定义着色器可以实现高度定制化的渲染效果。以下是完整的自定义着色器开发方案。 一、基础着色器创建 1. 创建自定义材质 qml import Qt3D.Core 2.15 import Qt3D.Render 2.15 import Qt3D.Extras 2.15Entity {components: [Transform { translation: Qt.v…...

如何防止接口被刷

目录 &#x1f6e1;️ 一、常见的防刷策略分类 &#x1f527; 二、技术实现细节 ✅ 1. 基于 IP 限流 ✅ 2. 给接口加验证码 ✅ 3. 使用 Token 限制接口访问权限 ✅ 4. 给接口加冷却时间&#xff08;验证码类经典&#xff09; ✅ 5. 使用滑动窗口限流算法&#xff08;更精…...

18、TimeDiff论文笔记

TimeDiff **1. 背景与动机****2. 扩散模型基础****3. TimeDiff 模型****3.1 前向扩散过程****3.2 后向去噪过程** 4、TimeDiff&#xff08;架构&#xff09;原理训练推理其他关键点解释 DDPM&#xff08;相关数学&#xff09;1、正态分布2、条件概率1. **与多个条件相关**&…...

docker底层原理

一句话&#xff0c;dockerfile里面的一行指令&#xff0c;就是一个layer层 docker底层原理 在机器上安装docker服务器端的程序&#xff0c;就会在机器上自动创建以下目录&#xff0c;默认安装路径是/var/lib/ docker服务器端的工作目录的作用如下&#xff0c;镜像的每一层的元数…...

YOLO拓展-NMS算法

1.概述 NMS&#xff08;non maximum suppression&#xff09;即非极大值抑制&#xff0c;其本质就是搜索局部极大值&#xff0c;抑制非极大值元素&#xff0c;可以理解为局部最大搜索。 这里不讨论通用的NMS算法(参考论文《Efficient Non-Maximum Suppression》对1维和2维数据…...

Docker Swarm 容器与普通 Docker 容器的网卡差异

问题背景 在 Docker Swarm 网络空间启动的容器有两张网卡&#xff08;eth0 和 eth1&#xff09;&#xff0c;而普通 Docker 容器只有一张网卡&#xff08;eth0&#xff09;。以下通过分析 ip addr show 和 ip link show 的输出&#xff0c;解释原因。 命令输出解析 Docker S…...

【Linux】线程ID、线程管理、与线程互斥

&#x1f4da; 博主的专栏 &#x1f427; Linux | &#x1f5a5;️ C | &#x1f4ca; 数据结构 | &#x1f4a1;C 算法 | &#x1f310; C 语言 上篇文章&#xff1a; 【Linux】线程&#xff1a;从原理到实战&#xff0c;全面掌握多线程编程&#xff01;-CSDN博客 下…...

服务器简介(含硬件外观接口介绍)

服务器&#xff08;Server&#xff09;是指提供资源、服务、数据或应用程序的计算机系统或设备。它通常比普通的个人计算机更强大、更可靠&#xff0c;能够长时间无间断运行&#xff0c;支持多个用户或客户端的请求。简单来说&#xff0c;服务器就是专门用来存储、管理和提供数…...

自动驾驶---决策规划之导航增强端到端

1 背景 自动驾驶算法通常包括几个子任务&#xff0c;包括3D物体检测、地图分割、运动预测、3D占用预测和规划。近年来&#xff0c;端到端方法将多个独立任务整合到多任务学习中&#xff0c;优化整个系统&#xff0c;包括中间表示&#xff0c;以实现最终的规划任务。随着端到端技…...

Datawhale AI春训营 世界科学智能大赛--合成生物赛道:蛋白质固有无序区域预测 小白经验总结

一、报名大赛 二、跑通baseline 在魔塔社区创建实例&#xff0c;根据教程完成速通第一个分数~ Datawhale-学用 AI,从此开始 三、优化实例&#xff08;这里是我的学习优化过程&#xff09; 1.先将官方给的的模型训练实例了解一遍&#xff08;敲一敲代码&#xff09; 训练模…...

基于Java(Struts2 + Hibernate + Spring)+MySQL实现的(Web)在线预约系统

基于Struts2 Hibernate Spring的在线预约系统 1.引言 1.1编写目的 针对医院在线预约挂号系统&#xff0c;提供详细的设计说明&#xff0c;包括系统的需求、功能模块、界面设计、设计方案等&#xff0c;以辅助开发人员顺利进行系统的开发并让项目相关者可以对这个系统进行分…...

PHP获取大文件行数

在PHP中获取大文件的行数时&#xff0c;直接读取整个文件到内存中可能会导致内存溢出&#xff0c;特别是对于非常大的文件。因此&#xff0c;最有效的方法是逐行读取文件并计数。以下是一些实现方法&#xff1a; 方法一&#xff1a;使用 fgets() fgets() 函数逐行读取文件&am…...

2024年网站开发语言选择指南:PHP/Java/Node.js/Python如何选型?

2024年网站开发语言选择指南&#xff1a;PHP/Java/Node.js/Python如何选型&#xff1f; 一、8大主流Web开发语言技术对比 1. PHP开发&#xff1a;中小型网站的首选方案 最新版本&#xff1a;PHP 8.3&#xff08;2023年11月发布&#xff09;核心优势&#xff1a; 全球78%的网站…...

Win7模拟器2025中文版:重温经典,掌上电脑体验

随着科技的快速发展&#xff0c;现代操作系统变得越来越高级&#xff0c;但许多用户仍然怀念经典的Windows 7系统。如果你也想重温那种熟悉的操作体验&#xff0c;Win7模拟器2025中文版 是一个不错的选择。这款软件能够让你在手机上轻松实现Windows 7系统的模拟&#xff0c;带来…...

HTML5+CSS3小实例:CSS立方体

实例:CSS立方体 技术栈:HTML+CSS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0&q…...

使用 Vite 快速搭建现代化 React 开发环境

1.检查环境 说明&#xff1a;检测环境&#xff0c;node版本为18.20.6。 2.创建命令 说明&#xff1a;创建命令&#xff0c;选择对应的选项。 npm create vitelatest 3.安装依赖 说明&#xff1a;安装相关依赖。 npm i...

Linux网络编程——基于ET模式下的Reactor

一、前言 上篇文章中我们已经讲解了多路转接剩下的两个接口&#xff1a;poll和epoll&#xff0c;并且知道了epoll的两种工作模式分别是 LT模式和ET模式&#xff0c;下来我们就实现的是一个简洁版的 Reactor&#xff0c;即半同步半异步I/O&#xff0c;在linux网络中&#xff0c…...

【现代深度学习技术】循环神经网络04:循环神经网络

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈PyTorch深度学习 ⌋ ⌋ ⌋ 深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上&#xff0c;结合当代大数据和大算力的发展而发展出来的。深度学习最重…...

1. 认识DartGoogle为Flutter选择了Dart语言已经是既

1. 认识Dart Google为Flutter选择了Dart语言已经是既定的事实&#xff0c;无论你多么想用你熟悉的语言&#xff0c;比如JavaScript、TypeScript、ArkTS等来开发Flutter&#xff0c;至少目前都是不可以的。 Dart 是由谷歌开发的计算机编程语言&#xff0c;它可以被应用于 Web/…...

学习设计模式《三》——适配器模式

一、基础概念 适配器模式的本质是【转换匹配&#xff0c;复用功能】&#xff1b; 适配器模式定义&#xff1a;将一个类的接口转换为客户希望的另外一个接口&#xff1b;适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 适配器模式的目的&#xff1a;复用…...

【Java面试系列】Spring Boot微服务架构下的分布式事务处理与性能优化 - 2025-04-19详解 - 3-5年Java开发必备知识

【Java面试系列】Spring Boot微服务架构下的分布式事务处理与性能优化 - 2025-04-19详解 - 3-5年Java开发必备知识 引言 在微服务架构中&#xff0c;分布式事务处理和性能优化是面试中高频出现的主题。随着系统规模的扩大&#xff0c;如何保证数据一致性和系统性能成为开发者…...

Elasticsearch只返回指定的字段(用_source)

在Elasticsearch中&#xff0c;当你想要查询文档但不返回所有字段&#xff0c;只返回指定的字段&#xff08;比如这里的id字段&#xff09;&#xff0c;你可以使用_source参数来实现这一点。但是&#xff0c;有一点需要注意&#xff1a;Elasticsearch的_source字段默认是返回的…...

【Linux “sed“ 命令详解】

本章目录: 1. 命令简介sed 的优势&#xff1a; 2. 命令的基本语法和用法基本语法&#xff1a;参数说明&#xff1a;常见用法场景&#xff1a;示例1&#xff1a;替换文本示例2&#xff1a;删除空行示例3&#xff1a;从命令输出中处理内容 3. 命令的常用选项及参数常用命令动作&a…...

JMETER使用

接口测试流程: 1.获取接口文档&#xff0c;熟悉接口业务 2.编写接口测试用例以及评审 正例:输入正常的参数&#xff0c;验证接口能否正常返回 反例:权限异常(为空、错误、过期)、参数异常(为空、长度异常、类型异常)、其他异常(黑名单、调用次数限制)、兼容异常(一个接口被多种…...

JavaWeb 课堂笔记 —— 13 MySQL 事务

本系列为笔者学习JavaWeb的课堂笔记&#xff0c;视频资源为B站黑马程序员出品的《黑马程序员JavaWeb开发教程&#xff0c;实现javaweb企业开发全流程&#xff08;涵盖SpringMyBatisSpringMVCSpringBoot等&#xff09;》&#xff0c;章节分布参考视频教程&#xff0c;为同样学习…...

离线安装elasticdump并导入和导出数据

离线安装elasticdump 在 CentOS 或 RHEL 系统上安装 elasticdump&#xff0c;你可以使用 npm&#xff08;Node.js 的包管理器&#xff09;来安装&#xff0c;因为 elasticdump 是一个基于 Node.js 的工具。以下是步骤 先在外网环境下安装 下载nodejs和npm&#xff08;注意x8…...

WhatTheDuck:一个基于浏览器的CSV查询工具

今天给大家介绍一个不错的小工具&#xff1a;WhatTheDuck。它是一个免费开源的 Web 应用程序&#xff0c;允许用户上传 CSV 文件并针对其内容执行 SQL 查询分析。 WhatTheDuck 支持 SQL 代码自动完成以及语法高亮。 WhatTheDuck 将上传的数据存储为 DuckDB 内存表&#xff0c;继…...

关于数字信号与图像处理——基于Matlab的图像增强技术

本篇博客是在做数字信号与图像处理实验中的收获。 具体内容包括&#xff1a;根据给定的代码放入Matlab中分别进行两次运行测试——比较并观察运行后的实验结果与原图像的不同点——画出IJ的直方图&#xff0c;并比较二者差异。接下来会对每一步进行具体讲解。 题目&#xff1a…...