Makefile与CMake
一、Makefile 核心内容
1. Makefile 基础结构与工作原理
- 三要素:
- 目标(Target):要生成的文件或执行的操作(如可执行文件、清理操作)。
- 依赖(Dependency):生成目标所需的文件或其他目标。
- 命令(Command):生成目标的具体指令(需以Tab 键开头)。
- 工作原理:
Make 通过检查依赖文件的修改时间,仅重新编译更新过的文件,提高编译效率。例如:simple: main.o foo.o # 目标:simple,依赖:main.o和foo.ogcc -o simple main.o foo.o # 命令 main.o: main.c # 子目标:main.o依赖main.cgcc -c main.c -o main.o
2. 关键特性与语法
-
伪对象(.PHONY):
避免 Make 将目标视为同名文件,强制执行命令。例如:.PHONY: clean clean:rm simple main.o foo.o
- 若不声明
.PHONY
,当目录存在clean
文件时,make clean
会认为目标已更新,不执行删除命令。
- 若不声明
-
变量与自动变量:
- 自定义变量:用于存储重复内容(如编译器、文件列表),例:
CC = gcc SRCS = main.c foo.c OBJS = $(SRCS:.c=.o) # 将.c替换为.o
- 自动变量:
$@
:当前目标名(如simple
)。$^
:所有依赖文件(如main.o foo.o
)。$<
:第一个依赖文件(如main.c
)。
$(EXE): $(OBJS)$(CC) -o $@ $^ # 等价于gcc -o simple main.o foo.o
- 自定义变量:用于存储重复内容(如编译器、文件列表),例:
-
函数与第三方库依赖:
wildcard
:获取指定模式的文件列表,例:SRCS = $(wildcard *.c)
。patsubst
:字符串替换,例:OBJS = $(patsubst %.c, %.o, $(SRCS))
。- 第三方库链接:通过
-I
指定头文件路径,-L
指定库路径,-l
指定库名,例:makefile
CFLAGS += -I./include LDFLAGS += -L./lib -lpthread
3. 实战范例
-
简单示例:
all: test@echo "hello all" test:@echo "hello test"
make
默认执行第一个目标(all
),依赖test
,因此先执行test
再执行all
。
-
复杂编译流程:
通过变量和自动变量简化多文件编译,例:CC = gcc SRCS = main.c foo.c OBJS = $(SRCS:.c=.o) EXE = simple$(EXE): $(OBJS)$(CC) -o $@ $^%.o: %.c$(CC) -c $< -o $@
二、CMake 核心内容
1. CMake 概述
- 定位:跨平台构建工具,通过编写
CMakeLists.txt
生成 Makefile 或其他项目文件(如 VS 工程),简化多平台编译配置。 - 优势:相比 Makefile,语法更简洁,支持模块化设计,适合大型项目。
2. 基础语法与流程
- 核心命令:
cmake_minimum_required
:指定 CMake 最低版本。project
:定义项目名称和语言(如C
、CXX
)。add_executable
:添加可执行文件,关联源文件。add_library
:生成库文件(SHARED
动态库,STATIC
静态库)。target_link_libraries
:链接库文件到可执行文件。
- 编译流程:
- 在项目根目录创建
CMakeLists.txt
。 - 创建
build
目录,进入后执行cmake ..
生成 Makefile。 - 执行
make
编译。
- 在项目根目录创建
3. 实战场景
-
单文件编译:
cmake_minimum_required(VERSION 2.8) project(0voice) set(SRC_LIST main.c) add_executable(0voice ${SRC_LIST})
-
多目录与库管理:
- 子目录编译为库:
# 根目录CMakeLists.txt add_subdirectory(src/dir1) # 添加子目录 add_subdirectory(src/dir2) add_executable(main main.c) target_link_libraries(main dir1 dir2) # 链接库
# src/dir1/CMakeLists.txt add_library(dir1 SHARED dir1.c) # 生成动态库
- 强制使用静态库:
target_link_libraries(main libdir1.a) # 指定静态库文件名
- 子目录编译为库:
-
安装与编译选项:
- 指定安装路径:
cmake -DCMAKE_INSTALL_PREFIX=/usr/local .. # 安装到/usr/local make install # 安装库、头文件等到目标路径
- Debug/Release 模式:
if(${CMAKE_BUILD_TYPE} MATCHES "Release")set(CMAKE_CXX_FLAGS "-O3 -Wall") # Release优化 else()set(CMAKE_CXX_FLAGS "-O0 -g") # Debug调试符号 endif()
- 指定安装路径:
特性 | Makefile | CMake |
---|---|---|
学习难度 | 较高(语法灵活但复杂) | 较低(模块化命令,易上手) |
跨平台支持 | 依赖平台特定语法(如 GNU Make) | 原生支持多平台(生成对应平台构建文件) |
大型项目管理 | 手动维护依赖关系,易出错 | 支持子目录、库管理,自动处理依赖 |
适用场景 | 简单项目或需要精细控制编译流程的场景 | 复杂多模块项目、跨平台开发 |
建议:
- 小型项目或需要深入理解编译原理时,使用 Makefile。
- 中大型项目或跨平台开发时,优先选择 CMake,搭配
make
执行编译。
三、Makefile和CMake的具体案例
案例 1:Makefile 跨目录编译
项目结构
project_make/ ├── include/ # 头文件目录 │ └── utils.h ├── src/ # 源文件目录 │ ├── main.c │ └── utils/ │ └── util.c ├── build/ # 输出目录(存放目标文件和可执行文件) └── Makefile
代码文件内容
include/utils.h
(头文件)#ifndef UTILS_H #define UTILS_Hint add(int a, int b);#endif
src/utils/util.c
(功能实现)#include "utils.h"int add(int a, int b) {return a + b; }
src/main.c
(主函数)#include <stdio.h> #include "utils.h"int main() {int sum = add(3, 5);printf("3 + 5 = %d\n", sum);return 0; }
Makefile 实现
# 变量定义 CC = gcc CFLAGS = -Wall -I./include # -I 指定头文件路径 SRCS = $(wildcard src/*.c src/utils/*.c) # 匹配所有源文件 OBJS = $(patsubst %.c, build/%.o, $(SRCS)) # 目标文件路径(build目录下保持原目录结构) EXE = build/app # 最终可执行文件路径# 生成可执行文件(默认目标) all: $(EXE)# 链接目标文件生成可执行文件 $(EXE): $(OBJS)@mkdir -p $(dir $@) # 创建输出目录(若不存在)$(CC) $^ -o $@# 模式规则:编译 .c 文件为 .o(保持目录结构) build/%.o: %.c@mkdir -p $(dir $@) # 创建目标文件所在目录(如 build/src/utils/)$(CC) $(CFLAGS) -c $< -o $@# 清理生成文件 .PHONY: clean clean:rm -rf build/
操作说明
- 执行
make
,会自动:
- 在
build
目录下生成src/main.o
、src/utils/util.o
目标文件。- 链接生成可执行文件
build/app
。- 运行
./build/app
,输出3 + 5 = 8
。案例 2:CMake 跨目录编译
项目结构
project_cmake/ ├── include/ # 头文件目录 │ └── utils.h ├── src/ # 源文件目录 │ ├── main.c │ └── utils/ │ ├── util.c │ └── CMakeLists.txt # 子目录 CMake 配置 ├── build/ # 编译目录(手动创建) └── CMakeLists.txt # 根目录 CMake 配置
代码文件内容
头文件
include/utils.h
、src/utils/util.c
、src/main.c
与 Makefile 案例完全相同。CMake 配置文件
- 根目录
CMakeLists.txt
:cmake_minimum_required(VERSION 3.10) project(MyProject)# 指定 C 标准(可选) set(CMAKE_C_STANDARD 11) set(CMAKE_C_STANDARD_REQUIRED ON)# 包含头文件目录(全局生效) include_directories(include)# 添加子目录(会执行 src/utils/CMakeLists.txt) add_subdirectory(src/utils)# 定义主程序源文件(仅主函数) set(MAIN_SRC src/main.c)# 生成可执行文件(链接子目录生成的库) add_executable(app ${MAIN_SRC}) target_link_libraries(app utils) # 链接子目录生成的库
- 子目录
src/utils/CMakeLists.txt
:# 定义当前目录的源文件(仅功能实现) set(UTIL_SRC util.c)# 生成静态库(库名:utils) add_library(utils STATIC ${UTIL_SRC})# 可选:设置库的输出目录(例如放到 build/lib) set_target_properties(utils PROPERTIES ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
操作说明
- 进入
build
目录(需手动创建):mkdir build && cd build
- 执行
cmake ..
生成构建文件(会自动处理跨目录依赖)。- 执行
make
编译,生成:
- 静态库
build/lib/libutils.a
(子目录生成)。- 可执行文件
build/app
(根目录生成)。- 运行
./app
,输出3 + 5 = 8
。
0voice · GitHub
相关文章:
Makefile与CMake
一、Makefile 核心内容 1. Makefile 基础结构与工作原理 三要素: 目标(Target):要生成的文件或执行的操作(如可执行文件、清理操作)。依赖(Dependency):生成目标所需的…...
P8803 [蓝桥杯 2022 国 B] 费用报销
P8803 [蓝桥杯 2022 国 B] 费用报销 - 洛谷 题目描述 小明在出差结束后返回了公司所在的城市,在填写差旅报销申请时,粗心的小明发现自己弄丢了出差过程中的票据。 为了弥补小明的损失,公司同意小明用别的票据进行报销,但是公司财…...
11 web 自动化之 DDT 数据驱动详解
文章目录 一、DDT 数据驱动介绍二、实战 一、DDT 数据驱动介绍 数据驱动: 现在主流的设计模式之一(以数据驱动测试) 结合 unittest 框架如何实现数据驱动? ddt 模块实现 数据驱动的意义: 通过不同的数据对同一脚本实现…...
15:00开始面试,15:06就出来了,问的问题有点变态。。。
从小厂出来,没想到在另一家公司又寄了。 到这家公司开始上班,加班是每天必不可少的,看在钱给的比较多的份上,就不太计较了。没想到4月一纸通知,所有人不准加班,加班费不仅没有了,薪资还要降40%…...
深入理解浏览器渲染引擎:底层机制与性能优化实战
现代浏览器背后是一个庞大而复杂的系统工程,渲染引擎作为核心模块之一,承担着从解析 HTML/CSS 到最终绘制页面的关键职责。本文将从底层机制出发,系统梳理渲染引擎(如 Blink)工作原理、V8 与渲染流程的协作方式&#x…...
【LeetCode 热题 100】56. 合并区间 —— 一文弄懂排序+遍历经典解法(附Python代码)
📌 题目链接 LeetCode 56. 合并区间 📖 一、引言:区间合并,刷题路上的绊脚石? 区间类问题是算法面试中常见的经典题型,尤其是“合并区间”问题,考察你对排序、区间重叠判断及边界处理的理解和编码能力。 很多同学在面对这题时,容易卡在: 什么时候两个区间算重叠?…...
使用Mathematica绘制Clifford奇异吸引子
Clifford Attractors 是一种由微分方程 生成的混沌吸引子,参数a,b,c,d不同会产生不同的分形图案。这类吸引子属于迭代函数系统,通过不断迭代参数方程来生成复杂的图形。其数学基础可能与 Clifford 代数或高维函数理论相关,例如 Clifford 代数…...
各个历史版本mysql/tomcat/Redis/Jdk/Apache下载地址
mysql 各版本下载地址: https://downloads.mysql.com/archives/community/ **************************************************************** tomcat 各版本下载地址: https://archive.apache.org/dist/tomcat/ ********************************…...
全面解析机器学习与深度学习中的模型权重文件格式与应用场景
概述 随着机器学习和人工智能技术的飞速发展,高效且安全地存储、共享和部署训练有素的模型的方法变得越来越重要。模型权重文件格式在这个过程中发挥着关键作用。这些格式不仅保存了模型的学习参数,还能够实现可复现性,并且便于在各种不同环…...
鸿蒙OSUniApp 实现的地图定位与导航功能#三方框架 #Uniapp
UniApp 实现的地图定位与导航功能 随着移动互联网的发展,地图定位与导航功能已成为众多应用的标配。本文将详细介绍如何在 UniApp 框架下实现地图定位与导航功能,并探讨如何适配鸿蒙系统,助力开发者打造更加流畅的地图体验。 前言 最近在做一…...
【HarmonyOS 5】鸿蒙星闪NearLink详解
【HarmonyOS 5】鸿蒙星闪NearLink详解 一、前言 鸿蒙星闪NearLink Kit 是 HarmonyOS 提供的短距离通信服务,支持星闪设备间的连接、数据交互。例如,手机可作为中心设备与外围设备(如鼠标、手写笔、智能家电、车钥匙等)通过星闪进…...
Java并发编程面试题总结
目录 线程有哪几种状态?状态如何流转? 创建线程的方式? 多线程有什么应用? 线程池的好处? 线程池的七个参数? 为什么不推荐使用jdk的Executors创建线程池? 线程池的执行流程? 任务拒绝策略有哪些,怎么选择? 线程池的核心线程数和最大线程数怎么设定…...
LAMP项目部署实战
一、LAMP部署前期准备 1.1 关闭防火墙 # systemctl stop firewalld # systemctl disable firewalld 1.2 关闭SELinux SELinux(Security-EnhancedLinux)是美国国家安全局(NSA)对于强制访问控制的实现,是Linux历史上最杰出的新安全子系统。 …...
Dify与n8n全面对比指南:AI应用开发与工作流自动化平台选择【2025最新】
Dify与n8n全面对比指南:AI应用开发与工作流自动化平台选择【2025最新】 随着AI技术与自动化工具的迅速发展,开发者和企业面临着多种平台选择。Dify和n8n作为两个备受关注的自动化平台,分别专注于不同领域:Dify主要面向AI应用开发&…...
VBA_NZ系列工具NZ10:VBA压缩与解压工具
我的教程一共九套及VBA汉英手册一部,分为初级、中级、高级三大部分。是对VBA的系统讲解,从简单的入门,到数据库,到字典,到高级的网抓及类的应用。大家在学习的过程中可能会存在困惑,这么多知识点该如何组织…...
EFT不过整改思路与调试经验
EFT是如何影响EUT的: EFT试验是为了验证电气和电子设备对诸如来自切换瞬态过程(切断感性负载、继电器触点弹跳等)的各种类型瞬变骚扰的抗扰度。EFT干扰是在电路中感性负载断开时产生的,它的特点是干扰信号不是单个脉而是一连串的脉冲群。EFT 干扰可以在…...
2.安卓逆向2-adb指令
免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于:图灵Python学院 工具下载: 链接:https://pan.baidu.com/s/1bb8NhJc9eTuLzQr39lF55Q?pwdzy89 提取码࿱…...
VSCode CMake工作流
Foreword 之前看到CMake有这么多选项,感觉不简单,还是看下别人在这里设计了多少东西 CMake 整体来说CMake遵循这样一套结构 操作-操作预设(如果有的话)-操作目标(如果有的话)比如 Configure-Configure…...
【上位机——WPF】App.xml和Application类简介
App.xml和Application类简介 概述App.xamlApp.xaml.cs 入门代码App.xamlMainWindow.xml Application生命周期窗体的声明周期 概述 xaml类型的文件包含两部分,一部分以.xaml扩展名结尾的前端代码,另一部分以.xaml.cs结尾的后端代码,通常我们也…...
MySQL 8.0 OCP 1Z0-908 101-110题
Q101.which two queries are examples of successful SQL injection attacks? A.SELECT id, name FROM backup_before WHERE name‘; DROP TABLE injection; --’; B. SELECT id, name FROM user WHERE id23 oR id32 OR 11; C. SELECT id, name FROM user WHERE user.id (SEL…...
Linux/Centos7离线安装并配置MySQL 5.7
文章目录 前言1、安装包下载2、卸载MariaDB3、创建MySQL用户4、上传安装包5、创建数据目录和配置文件6、安装MySQL7、启动MySQL8、初始化MySQL9、退出验证新密码10、创建普通用户和库11、测试普通用户和库总结 前言 博主参考了一些大佬的文章,部分收费的就看不了了&…...
在Angular中使用Leaflet构建地图应用
Leaflet是一个用于创建地图的JavaScript库,它包含许多功能,并且非常适用于移动设备。 准备 nodejs: v20.15.0 npm: 10.7.0 angular: 19.2.10 创建一个地图应用工程 npx angular/cli new my-leaflet-app --stylecss --routingfalse --skip-tests提示 …...
GPU与NPU异构计算任务划分算法研究:基于强化学习的Transformer负载均衡实践
点击 “AladdinEdu,同学们用得起的【H卡】算力平台”,H卡级别算力,按量计费,灵活弹性,顶级配置,学生专属优惠。 引言 在边缘计算与AI推理场景中,GPU-NPU异构计算架构已成为突破算力瓶颈的关键技…...
iOS 抓包实战:从 Charles 到Sniffmaster 的日常工具对比与使用经验
iOS 抓包实战:从 Charles 到抓包大师 Sniffmaster 的日常工具对比与使用经验 抓包这件事,不是高级黑客才要做的。作为一名移动端开发,我几乎每天都要和网络请求打交道,尤其是 HTTPS 请求——加密、重定向、校验证书,各…...
【微服务】SpringBoot + Docker 实现微服务容器多节点负载均衡详解
目录 一、前言 二、前置准备 2.1 基本环境 2.2 准备一个springboot工程 2.2.1 准备几个测试接口 2.3 准备Dockerfile文件 2.4 打包上传到服务器 三、制作微服务镜像与运行服务镜像 3.1 拷贝Dockerfile文件到服务器 3.2 制作服务镜像 3.3 启动镜像服务 3.4 访问一下服…...
【Linux系统】从 C 语言文件操作到系统调用的核心原理
文章目录 前言lesson 15_基础IO一、共识原理二、回顾C语言接口2.1 文件的打开操作2.2 文件的读取与写入操作2.3 三个标准输入输出流 三、过渡到系统,认识文件系统调用3.1 open 系统调用1. 比特位标志位示例 3.2 write 系统调用1. 模拟实现 w 选项2. 模拟实现 a 选项…...
俄罗斯方块算法
俄罗斯方块是一款风靡全球 38 年的经典益智游戏,凭借其简单易学但难于精通的特点,成为游戏史上的不朽之作。 游戏界面与规则 游戏界面为 20 行10 列的可视区域。横向 X 轴区间为 [0,9],共 10 列;纵向 Y 轴区间为 [0&a…...
Node.js 循环依赖问题详解:原理、案例与解决方案
文章目录 一、什么是循环依赖?二、循环依赖的典型表现三、解决方案四、如何检测循环依赖五、循环依赖的隐藏危害 一、什么是循环依赖? 当两个或者多个模块互相直接或者间接引用时,就会形成循环依赖。例如: A.js → 依赖 → B.js…...
Linux系统编程——vfork函数的使用方法以及与fork函数的区别
vfork() 是 Linux 系统编程中与 fork() 类似的系统调用,用于创建一个新的子进程。它们都能创建子进程,但在实现机制和使用场景上有明显区别。 以下是对 vfork() 的详细介绍,包括: 使用方法 注意事项 与 fork() 的联系与区别 使…...
.NET 无侵入自动化探针原理与主流实现详解
目录 引言 一、.NET 无侵入自动化探针的原理 1.1 CLR Profiling API 核心机制 示例代码 1.2 CLR Instrumentation 核心机制 示例代码 1.3 反射和动态代理 核心机制 示例代码 1.4 DiagnosticSource 核心机制 示例代码 二、主流实现与工具 2.1 AppDynamics 实现原…...
大数据:新能源汽车宇宙的未来曲率引擎
** 发布日期:2025-05-14** 关键词:大数据、新能源、机器学习、碳中和、CSDN爆款 1. 大数据科普:定义、特征与技术核心 1.1 什么是大数据? 大数据(Big Data)指规模巨大、类型多样、生成速度快且价值密度低…...
创建你的第一个MCP服务
创建你的第一个MCP服务 Model Context Protocol (MCP) 中国天气查询服务创建教程 什么是 Model Context Protocol (MCP) Model Context Protocol (MCP) 是一种开放标准协议,允许大型语言模型(LLM)如 Claude 与外部系统和数据源进行交互。通…...
说一说Node.js高性能开发中的I/O操作
众所周知,在软件开发的领域中,输入输出(I/O)操作是程序与外部世界交互的重要环节,比如从文件读取数据、向网络发送请求等。这段时间,也指导项目中一些项目的开发工作,发现在Node.js运用中&#…...
小白入门:GitHub 远程仓库使用全攻略
一、Git 核心概念 1. 三个工作区域 工作区(Working Directory):实际编辑文件的地方。 暂存区(Staging Area):准备提交的文件集合(使用git add操作)。 本地仓库(Local…...
Protobuf3协议关键字详解与应用实例
一、核心语法与基础关键字 syntax 声明协议版本,必须为文件的第一行非空、非注释内容。 syntax "proto3"; // 显式指定proto3语法,否则编译器默认使用proto2message 定义消息类型,包含一组结构化字段。支持嵌套消息定义ÿ…...
阿克曼-幻宇机器人系列教程3- 机器人交互实践(Message)
上一篇文章介绍了如何通过topic操作命令实现与机器人的交互,本篇我们介绍如何通过Message(即topic的下一级)实现与机器人的交互。 和topic一样,首先在一个终端通过ssh命令登录机器人、启动机器人,然后打开另外一个终端…...
Leetcode刷题 | Day63_图论08_拓扑排序
一、学习任务 拓扑排序代码随想录 二、具体题目 1.拓扑排序117. 软件构建 【题目描述】 某个大型软件项目的构建系统拥有 N 个文件,文件编号从 0 到 N - 1,在这些文件中,某些文件依赖于其他文件的内容,这意味着如果文件 A 依…...
[Harmony]获取资源文件中.txt文件中的字符串
txt文件 src/main/resources/rawfile/userInfo.txt {"Code": 200,"Msg": "登录成功","RetData": {"Name": "shq","Phone": "18511111111","PostName": "按摩技师",&qu…...
matlab多项式
1. 多项式表示 多项式用行向量表示,按降幂排列系数。例如,多项式 3x22x1 表示为 [3 2 1]。 2. 创建多项式 直接输入系数:如 p [1 -3 3 -1] 表示 x3−3x23x−1。由根创建:使用 poly 函数。例如,根为 [1, 1, 1]&…...
手搓传染病模型(SEI - SEIAR )
在传染病防控的前沿研究中,构建精准的数学模型对于理解疾病传播机制、预测疫情走势以及制定有效干预策略至关重要。SEI - SEIAR 模型(易感媒介 \(S_m\) - 潜伏媒介 \(E_m\) - 感染媒介 \(I_m\) - 易感人群 S - 潜伏人群 E - 有症状感染者 I - 无症状感染…...
Ubuntu 安装 Redis
1. 下载 redis 下载地址:https://github.com/redis/redis 2. 解压 redis 把下载的软件包,上传到服务器的 /usr/local 目录中,执行解压命令 tar -zxvf redis-8.0.1.tar.gz 3. 安装 redis 安装依赖 sudo apt-get updatesudo apt-get ins…...
【QGIS二次开发】地图显示与交互-03
系列目录: 【QGIS二次开发】地图显示与交互-01_qgis二次开发加载地图案例-CSDN博客 【QGIS二次开发】地图显示与交互-02_setlayerlabeling-CSDN博客 3. 地图符号与色表 3.1 矢量图层符号设置 任务要求:双击图层树节点,实现图层中图元的符…...
28、动画魔法圣典:Framer Motion 时空奥义全解——React 19 交互动效
"在数字世界的夹缝中,存在着连接现实与虚拟的魔法纽带——这便是 Framer Motion 的时空秘术。" ——《前端魔法师手札卷七》 一、时空裂隙动画 - FLIP量子跃迁术 1. FLIP时空扭曲原理 <motion.divlayout // 开启时空裂隙transition{{type: "spr…...
Ken Thompson 和 Dennis Ritchie
Ken Thompson(肯汤普逊)和Dennis Ritchie(丹尼斯里奇)是计算机科学领域的两位传奇人物,他们对现代计算机技术的发展产生了深远影响。以下是关于他们的详细介绍: 1. Ken Thompson 出生&am…...
SQL:MySQL函数:条件函数(Conditional Functions)
目录 什么是条件函数? 常用 MySQL 条件函数总览表 1️⃣ IF() – 条件判断函数(If Statement) 2️⃣ IFNULL() – 空值判断与替代函数(If Null) 3️⃣ NULLIF() – 相等返回 NULL(Null If Equal&#…...
初识Linux · IP分片
目录 前言: IP分片 分片vs不分片 如何分片 分片举例 三个字段 前言: 前文IP协议上和IP协议下我们已经把IP协议的报头的大多数字段介绍了,唯独有三个字段现在还有介绍,即16位标识,8位协议,13位片偏移…...
TCP 粘包
一、粘包问题详解 1. 粘包的概念 定义: 指在 TCP 通信中,由于发送方和接收方的读写速度、数据量不一致,导致多个数据包被错误地合并成一个数据包处理的现象。产生原因: TCP 是流式协议(无边界)࿰…...
第一个优化
agent项目 tool 调用外部服务时 选择了指数回避的重试机制 优化点:延迟时间那 加了一个随机的时间抖动 指数回避 我第一眼看到 这不就是 tcp重连机制吗 其实就是 如果当时网络波动 网况不好 || 服务正忙 ,可以不急着在这个时候选择多次重试,…...
LabVIEW的CAN通讯测试程序
该程序是基于 NI LabVIEW 平台开发的 CAN(Controller Area Network,控制器局域网)通讯测试程序。主要功能是对 CAN 通讯过程进行模拟、数据传输与验证,确保 CAN 通讯的正常运行和数据的准确传输。 程序详细说明 接口选择ÿ…...
视频质量分析时,遇到不同分辨率的对照视频和源视频,分辨率对齐的正确顺序。
背景 我们平时在做视频转码后,会用VMAF/PSNR得评分工具进行视频对比的评分,但是这几种客观评分方式都有一个要求就是分辨率要一模一样,因为这样才对像素点做数学运算。 但是分辨率对齐其实有两种选择,例如源视频是1080P…...