c++ gcc工具链
GCC(GNU Compiler Collection)是一套广泛使用的开源编译工具链,支持多种编程语言(如 C、C++、Objective-C、Fortran 等),主要用于 Linux 和嵌入式开发环境。
组成
GCC 工具链主要由以下几个核心工具组成:
工具 | 作用 |
---|---|
gcc/g++ | GNU 编译器(C 语言使用 gcc ,C++ 语言使用 g++ ) |
as | GNU 汇编器,将汇编代码转换为目标代码 |
ld | GNU 链接器,负责链接目标文件和库,生成可执行文件 |
ar | 归档工具,用于创建、修改静态库(.a 文件) |
nm | 查看目标文件或库文件的符号表 |
objdump | 反汇编工具,查看二进制文件的详细信息 |
readelf | 查看 ELF 文件(Linux 可执行文件格式)的头信息 |
strip | 去除二进制文件中的符号信息,减小体积 |
make | 构建管理工具,执行自动化编译 |
gdb | GNU 调试器,调试 C/C++ 程序 |
编译流程
GCC 编译一个程序的完整流程通常分为 4 个阶段:
预处理(Preprocessing)
- 处理
#include
、#define
、#ifdef
等预处理指令 - 生成扩展的源代码文件(
.i
或.ii
)
命令示例:
gcc -E main.c -o main.i
编译(Compilation)
- 预处理后的
.i
文件转换成汇编代码(.s
文件)
命令示例:
gcc -S main.i -o main.s
汇编(Assembly)
- 汇编代码
.s
转换为目标文件.o
命令示例:
gcc -c main.s -o main.o
链接(Linking)
- 将多个
.o
文件以及库文件链接成最终的可执行文件
命令示例:
gcc main.o -o main
完整编译流程:
gcc main.c -o main
编译选项
基础选项
选项 | 作用 |
---|---|
-o <文件> | 指定输出文件名 |
-c | 只编译但不链接(生成 .o 文件) |
-S | 生成汇编代码 |
-E | 仅进行预处理 |
-v | 显示详细编译过程 |
优化选项
选项 | 作用 |
---|---|
-O0 | 关闭优化(默认) |
-O1 | 轻量优化 |
-O2 | 启用更多优化 |
-O3 | 极致优化(可能增加代码体积) |
-Os | 优化代码体积 |
-Ofast | 最高速优化(可能不符合标准) |
调试选项
选项 | 作用 |
---|---|
-g | 生成调试信息(用于 GDB) |
-ggdb | 生成 GDB 兼容的调试信息 |
-fno-omit-frame-pointer | 保留帧指针,便于调试 |
警告与错误
选项 | 作用 |
---|---|
-Wall | 开启大部分警告 |
-Wextra | 开启额外警告 |
-Werror | 将所有警告视为错误 |
-pedantic | 强制符合标准 |
架构与平台
选项 | 作用 |
---|---|
-m32 / -m64 | 生成 32 位或 64 位代码 |
-march=<cpu> | 生成适用于特定 CPU 架构的代码 |
-mfpu=<type> | 指定浮点单元(适用于 ARM) |
静态库与动态库
静态库(.a)
-
编译:
gcc -c libadd.c -o libadd.o ar rcs libadd.a libadd.o
-
使用:
gcc main.c -L. -ladd -o main_static
动态库(.so)
-
编译:
gcc -shared -fPIC libadd.c -o libadd.so
-
使用:
gcc main.c -L. -ladd -o main_shared export LD_LIBRARY_PATH=.
GCC 与 Makefile
如果项目包含多个源文件,手动编译比较麻烦,推荐使用 Makefile
自动化编译。
示例 Makefile
:
CC = gcc
CFLAGS = -Wall -O2all: mainmain: main.o add.o$(CC) $^ -o $@%.o: %.c$(CC) $(CFLAGS) -c $< -o $@clean:rm -f *.o main
执行:
make # 编译
make clean # 清理
GCC 与 GDB 调试
使用 -g
选项编译:
gcc -g main.c -o main
gdb ./main
常用 GDB 命令:
break main # 设置断点
run # 运行程序
next # 单步执行(不进入函数)
step # 单步执行(进入函数)
print var # 查看变量值
bt # 查看调用栈
优化策略
优化级别(-O 选项)
GCC 提供不同级别的优化,可通过 -O
(字母 O 不是数字 0)指定:
选项 | 作用 |
---|---|
-O0 | 无优化(默认),编译速度快,便于调试 |
-O1 | 基本优化,优化代码但不显著增加编译时间 |
-O2 | 较强优化,启用所有不会影响程序正确性的优化 |
-O3 | 最高级别优化,比 -O2 增加更多优化,如循环展开和向量化 |
-Os | 优化代码大小,适用于嵌入式系统 |
-Ofast | 极速优化,在 -O3 的基础上忽略严格标准,如浮点计算优化 |
-Og | 适用于调试的优化,比 -O0 稍微优化,但保持调试友好 |
常见优化级别建议
- 开发阶段:
-Og
(优化但保留调试信息) - 一般程序:
-O2
(平衡优化和编译时间) - 极致优化:
-O3
或-Ofast
(但可能会增加代码体积) - 嵌入式系统:
-Os
(减少代码大小)
代码生成优化
架构优化
可以针对特定 CPU 进行优化,使编译器生成更高效的指令。
选项 | 作用 |
---|---|
-march=<cpu> | 生成针对特定 CPU 体系结构的代码(如 -march=native 自动检测 CPU) |
-mtune=<cpu> | 仅优化指令调度,仍然兼容其他 CPU |
-m32 / -m64 | 生成 32 位或 64 位代码 |
-mfpu=<type> | 选择浮点单元(适用于 ARM) |
示例(自动检测 CPU):
gcc -O2 -march=native -o program program.c
循环优化
循环优化可以减少不必要的计算,提高效率。
选项 | 作用 |
---|---|
-funroll-loops | 进行循环展开,减少循环跳转开销 |
-floop-optimize | 启用基本循环优化 |
-ftree-vectorize | 启用自动向量化,利用 SIMD 指令 |
-fno-tree-vectorize | 禁用自动向量化(默认启用 -O3 时开启) |
示例(循环展开 + 向量化):
gcc -O3 -funroll-loops -ftree-vectorize -o program program.c
函数优化
选项 | 作用 |
---|---|
-finline-functions | 允许编译器自动内联小函数 |
-fno-inline-functions | 禁用函数内联 |
-fno-strict-aliasing | 允许不同类型的指针安全访问(防止错误优化) |
示例(强制内联优化):
gcc -O3 -finline-functions -o program program.c
分支预测优化
选项 | 作用 |
---|---|
-fprofile-generate / -fprofile-use | 使用运行时数据 进行优化(适用于热点代码) |
-fbranch-probabilities | 优化分支预测(减少 CPU 分支错误) |
示例(使用运行数据优化):
gcc -O2 -fprofile-generate -o program program.c
./program # 运行一次,收集数据
gcc -O2 -fprofile-use -o program program.c
链接优化
静态 vs 动态链接
选项 | 作用 |
---|---|
-static | 静态链接,使可执行文件不依赖动态库 |
-shared | 生成动态库(.so 文件) |
-fPIC | 生成位置无关代码,用于共享库 |
示例(生成动态库):
gcc -shared -fPIC lib.c -o lib.so
链接时优化(LTO)
LTO(Link-Time Optimization)允许在链接时进一步优化整个程序。
选项 | 作用 |
---|---|
-flto | 启用链接时优化 |
-flto=auto | 自动调整 LTO 线程数 |
示例(LTO 优化):
gcc -O2 -flto -o program program.c
其他优化
去除未使用代码
选项 | 作用 |
---|---|
-ffunction-sections | 让每个函数放入单独的段 |
-fdata-sections | 让全局变量放入单独的段 |
-Wl,--gc-sections | 移除未使用的代码(与 -ffunction-sections 配合使用) |
示例(精简可执行文件):
gcc -Os -ffunction-sections -fdata-sections -Wl,--gc-sections -o program program.c
优化浮点计算
选项 | 作用 |
---|---|
-ffast-math | 允许不严格遵守 IEEE 754 标准,提高浮点运算性能 |
-funsafe-math-optimizations | 允许不安全的浮点优化 |
示例(快速浮点运算):
gcc -O3 -ffast-math -o program program.c
并行编译
选项 | 作用 |
---|---|
-pipe | 使用管道而非临时文件,提高编译速度 |
-fopenmp | 启用 OpenMP 并行计算 |
-pthread | 启用多线程支持 |
示例(使用 OpenMP 并行优化):
gcc -O2 -fopenmp -o program program.c
总结
目标 | 推荐优化选项 |
---|---|
开发调试 | -Og -g |
一般优化 | -O2 |
极限优化 | -O3 -march=native -funroll-loops -ftree-vectorize -flto |
小代码体积 | -Os -ffunction-sections -fdata-sections -Wl,--gc-sections |
浮点运算优化 | -Ofast -ffast-math |
多线程优化 | -O2 -fopenmp |
交叉编译
什么是交叉编译?
交叉编译(Cross Compilation) 指在一个平台(如 x86_64)上编译生成另一个平台(如 ARM、RISC-V、MIPS)可执行的代码。常见应用包括:
- 嵌入式开发(如树莓派、ESP32、STM32)
- 不同 CPU 架构移植(如 x86 生成 ARM 代码)
- 交叉工具链构建(如构建 Android、Linux 内核)
交叉编译工具链
交叉编译需要 交叉编译工具链(Cross Toolchain),主要包括:
- 交叉编译器(gcc、g++):如
arm-linux-gnueabi-gcc
- 汇编器(as):生成目标机器的汇编代码
- 链接器(ld):将目标文件链接成可执行文件
- 库文件(libc, libm, libstdc++):目标平台所需的标准库
- 调试工具(gdb):远程调试目标平台的程序
常见交叉编译工具链
目标架构 | 工具链前缀 | 适用平台 |
---|---|---|
ARM 32-bit | arm-linux-gnueabi-gcc | 旧版 ARM |
ARM 32-bit EABI | arm-linux-gnueabihf-gcc | 含硬件浮点的 ARM |
ARM 64-bit (AArch64) | aarch64-linux-gnu-gcc | 64 位 ARM |
MIPS 32-bit | mips-linux-gnu-gcc | 32 位 MIPS |
MIPS 64-bit | mips64-linux-gnuabi64-gcc | 64 位 MIPS |
RISC-V 32-bit | riscv32-unknown-linux-gnu-gcc | 32 位 RISC-V |
RISC-V 64-bit | riscv64-unknown-linux-gnu-gcc | 64 位 RISC-V |
安装方式(Ubuntu/Debian):
sudo apt update
sudo apt install gcc-aarch64-linux-gnu # 安装 AArch64 交叉编译器
交叉编译基本使用
假设要编译 hello.c
为 ARM 64 位可执行程序:
#include <stdio.h>
int main() {printf("Hello, ARM!\n");return 0;
}
普通编译(本机 x86_64)
gcc hello.c -o hello_x86
file hello_x86 # 查看编译结果
输出(x86 机器):
ELF 64-bit LSB executable, x86-64
交叉编译 ARM 64 位
aarch64-linux-gnu-gcc hello.c -o hello_arm64
file hello_arm64
输出(ARM 64 可执行文件):
ELF 64-bit LSB executable, ARM aarch64
此时 hello_arm64
不能在 x86_64 直接运行,需要拷贝到目标 ARM 设备运行。
交叉编译静态 & 动态链接
静态编译
aarch64-linux-gnu-gcc hello.c -static -o hello_static
优点:
- 生成独立可执行文件,无需依赖目标系统的库。
- 适合嵌入式系统。
缺点:
- 文件较大,占用更多存储空间。
动态编译
aarch64-linux-gnu-gcc hello.c -o hello_dynamic
ldd hello_dynamic # 检查动态库依赖
优点:
- 文件更小,依赖目标系统的动态库。
- 适合桌面 Linux 系统。
缺点:
- 可能出现动态库不兼容的问题,需要确保目标系统有相应的库。
交叉编译 Makefile
如果项目较复杂,使用 Makefile
自动化编译:
CC = aarch64-linux-gnu-gcc
CFLAGS = -O2 -Wall
TARGET = hello_armall: $(TARGET)$(TARGET): hello.c$(CC) $(CFLAGS) $< -o $@clean:rm -f $(TARGET)
执行:
make
交叉编译库文件
编译静态库
aarch64-linux-gnu-gcc -c add.c -o add.o
ar rcs libadd.a add.o
在程序中使用:
aarch64-linux-gnu-gcc main.c -L. -ladd -o main
编译动态库
aarch64-linux-gnu-gcc -shared -fPIC add.c -o libadd.so
运行时需要 LD_LIBRARY_PATH
:
export LD_LIBRARY_PATH=.
./main
远程调试(GDB)
如果目标设备没有 GDB,可使用 远程调试:
目标设备(ARM)
gdbserver :1234 ./hello_arm
开发机(x86)
aarch64-linux-gnu-gdb hello_arm
target remote <目标设备IP>:1234
QEMU 模拟运行
如果没有 ARM 设备,可用 QEMU 运行 ARM 可执行文件:
sudo apt install qemu-user
qemu-aarch64 ./hello_arm
交叉编译 Linux 内核
获取 Linux 内核
git clone --depth=1 https://github.com/torvalds/linux.git
cd linux
交叉编译
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- defconfig
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j$(nproc)
生成 Image
可用于 ARM64 设备。
交叉编译 RootFS
嵌入式开发通常需要交叉编译 RootFS,可使用 Buildroot:
git clone https://git.buildroot.net/buildroot
cd buildroot
make menuconfig
make
生成完整的嵌入式系统 RootFS。
总结
任务 | 命令 |
---|---|
安装 ARM 交叉编译器 | sudo yum install gcc-aarch64-linux-gnu |
编译 ARM 64 可执行文件 | aarch64-linux-gnu-gcc hello.c -o hello_arm64 |
编译静态库 | ar rcs libadd.a add.o |
编译动态库 | aarch64-linux-gnu-gcc -shared -fPIC add.c -o libadd.so |
QEMU 运行 ARM 程序 | qemu-aarch64 ./hello_arm |
远程 GDB 调试 | gdbserver :1234 ./hello_arm |
相关文章:
c++ gcc工具链
GCC(GNU Compiler Collection)是一套广泛使用的开源编译工具链,支持多种编程语言(如 C、C、Objective-C、Fortran 等),主要用于 Linux 和嵌入式开发环境。 组成 GCC 工具链主要由以下几个核心工具组成&am…...
基于51单片机的的鸡笼补光和恒温系统的设计与实现(源程序+Protues仿真+电路图+元件清单+器件手册)
编号:71 基于51单片机的的鸡笼补光和恒温系统的设计与实现 功能描述: 本设计由89C52单片机液晶12864显示模块声光报警电路温湿度传感器电路风扇电路LED照明电路光照检测电路GSM电路DS1302时钟电路 1.实现的功能 (1)采用DHT11温湿传感器、光敏电阻捕捉…...
es-head 正则查询和标准正则查询的差异
在es-head里面查询,需要查询字符串是一个json串,因此就要符合json串的格式,在es-head里面可以通过regexp做正则查询,而这里的正则表达式其实是写成字符串的形式的,因此就要面对字符串转义的问题,比如你想匹…...
【深度学习】深度学习和强化学习算法——深度 Q 网络DQN
深度 Q 网络(Deep Q-Network, DQN) 详解 什么是DQNDQN 的背景DQN 训练流程 2 DQN 的核心思想2.1 经验回放(Experience Replay)2.2 目标网络(Target Network)2.3 ε-贪心策略(ε-Greedy Policy&a…...
matlab模拟风场的随机脉动风
1、内容简介 matlab137-模拟风场的随机脉动风 可以交流、咨询、答疑 2、内容说明 略 模拟风场的随机脉动风,并进行相关的统计分析和计算,包括风速谱、空间相关性、自谱、互谱、以及POD(Proper Orthogonal Decomposition)分解等…...
2025年2月16日(numpy-deepseek)
嗯,用户让我介绍一下这段使用numpy的代码。首先,我需要确认用户的需求是什么。他们可能刚开始学习Python或者数据科学,所以需要基础的解释。让我仔细看一下代码。 第一行是import numpy as np,这应该是导入numpy库,并…...
x64和ARM的区别
x64和ARM是两种不同的处理器架构,它们在指令集、设计理念、应用场景和能耗效率等方面存在显著差异。以下是它们之间的主要区别: 1. **指令集架构**: * **x64**:x64架构,也称为x86-64或AMD64,是x86架…...
电解电容的参数指标
容量 这个值通常是室温25℃,在一定频率和幅度的交流信号下测得的容量。容量会随着温度、直流电压、交流电压值的变化而改变。 额定电压 施加在电容上的最大直流电压,通常要求降额使用。 例如额定电压是4V,降额到70%使用,最高施…...
如何在 Mac 上解决 Qt Creator 安装后应用程序无法找到的问题
在安装Qt时,遇到了一些问题,尤其是在Mac上安装Qt后,发现Qt Creator没有出现在应用程序中。通过一些搜索和操作,最终解决了问题。以下是详细的记录和解决方法。 1. 安装Qt后未显示Qt Creator 安装完成Qt后,启动应用程…...
Spring——Spring开发实战经验(1)
摘要 文章主要介绍了 Swagger 作为 API 文档生成和测试工具的功能,包括自动生成 API 文档、提供可视化调试界面、促进前后端协作、支持 OpenAPI 规范等。同时,还提及了 Spring Boot 与 Swagger3 的实战应用,以及 Spring 开发中其他相关技术内…...
设计模式:代理模式
代理模式是很常见的设计模式,即使没有专门学习过这种设计模式,在工作中也一定用过这种设计模式。在实际生活中,代理模式也是常见的,比如内阁首辅相对于皇帝,前者是后者的代理,内阁首辅收到奏折时࿰…...
【NLP】循环神经网络RNN
目录 一、认识RNN 二、RNN模型分类 三、传统RNN模型 3.1 结构分析 3.2 Pytorch构建RNN模型 3.3 优缺点 一、认识RNN RNN(Recurrent Neural Network),中文称作循环神经网络,一般以序列数据为输入,通过网络内部的结构设计有效捕捉序列之…...
深度解析HTTP/HTTPS协议:从原理到实践
深入浅出HTTP/HTTPS协议:从原理到实践 前言 在当今互联网世界中,HTTP和HTTPS协议如同空气般存在于每个网页请求的背后。作为开发者或技术爱好者,理解这些基础协议至关重要。本文将用六大板块,配合原理示意图和实操案例࿰…...
AF3 MmcifObject类解读
AlphaFold3 中 MmcifObject类 是 解析 mmCIF 文件的核心数据结构,用于存储解析后的蛋白质结构信息,包含PDB 头部信息、Biopython 解析的结构、链序列信息等。 下面代码包含 Monomer 、AtomSite、ResiduePosition、ResidueAtPosition、 MmcifObject以及ParsingResult数据类的…...
大数据SQL调优专题——Hive执行原理
引入 Apache Hive 是基于Hadoop的数据仓库工具,它可以使用SQL来读取、写入和管理存在分布式文件系统中的海量数据。在Hive中,HQL默认转换成MapReduce程序运行到Yarn集群中,大大降低了非Java开发者数据分析的门槛,并且Hive提供命令…...
MySQL常见错误码及解决方法(1130、1461、2003、1040、2000、1049、1062、1129、2002、1690等)
目录 【问题1】、FATAL: error 1130: Unknown error 1130 【问题2】、FATAL: error: 1461 【问题3】、ERROR 2003 (HY000): Cant connect to MySQL server on "" (113) 【问题4】、FATAL: error 2003: Cant connect to MySQL server on 172.19.111.151 (111) 【问…...
类和对象详解(下)-----运算符重载
目录 1.运算符重载 2.赋值运算符重载 3.取地址运算符重载 3.1const成员函数 3.2取地址运算符重载 1.运算符重载 什么是运算符重载呢?简单举个例子就懂了。 就是我想实现日期的加法,而“”这个运算符C只实现了内置类型的加法,而我们要想实…...
Visonpro 检测是否有缺齿
一、效果展示 二、上面是原展开工具CogPolarUnwrapTool; 第二种方法: 用Blob 和 CogCopyRegionTool 三、 用预处理工具 加减常数,让图片变得更亮点 四、圆展开工具 五、模板匹配 六、代码分解 1.创建集合和文子显示工具 CogGraphicCollec…...
(萌新入门)如何从起步阶段开始学习STM32 ——2 我应该学习HAL库还是寄存器库?
概念 笔者下面需要介绍的是库寄存器和HAL库两个重要的概念,在各位看完之后,需要决定自己的学习路线到底是学习HAL呢?还是寄存器呢?还是两者都学习呢? 库寄存器 库寄存器就是简单的封装了我们对寄存器的操作…...
【SQL技术】不同数据库引擎 SQL 优化方案剖析
一、引言 在数据处理和分析的世界里,SQL 是不可或缺的工具。不同的数据库系统,如 MySQL、PostgreSQL(PG)、Doris 和 Hive,在架构和性能特点上存在差异,因此针对它们的 SQL 优化策略也各有不同。这些数据库…...
什么是原型?
在 JavaScript 中,原型(Prototype)是每个 JavaScript 对象都有的一个属性,用来实现对象之间的继承。原型是 JavaScript 面向对象编程的核心概念之一,通过原型链(prototype chain),一…...
【第10章:自然语言处理高级应用—10.4 NLP领域的前沿技术与未来趋势】
各位技术探险家们,今天我们要开启一场穿越语言智能奇点的时空之旅。从正在改写物理定律的万亿参数大模型,到能看懂《星际穿越》剧本的跨模态AI,再到正在颠覆编程方式的神经-符号混合系统……这篇万字长文将带你摸清NLP技术进化的七块关键拼图。(建议边读边做笔记,文末有技…...
41.日常算法
1.面试题 02.04. 分割链表 题目来源 给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。你不需要 保留 每个分区中各节点的初始相对位置。 示例 1: 输入:…...
CPP集群聊天服务器开发实践(五):nginx负载均衡配置
1 负载均衡器的原理与功能 单台Chatserver可以容纳大约两万台客户端同时在线聊天,为了提升并发量最直观的办法需要水平扩展服务器的数量,三台服务器可以容纳六万左右的客户端。 负载均衡器的作用: 把client的请求按照负载均衡算法分发到具体…...
Java 中的 HashSet 和 HashMap 有什么区别?
一、核心概念与用途 特性HashSetHashMap接口实现实现 Set 接口(存储唯一元素)实现 Map 接口(存储键值对)数据存储存储单个对象(元素唯一)存储键值对(键唯一,值可重复)典…...
AI大模型的技术突破与传媒行业变革
性能与成本:AI大模型的“双轮驱动” 过去几年,AI大模型的发展经历了从实验室到产业化的关键转折。2025年初,以DeepSeek R1为代表的模型在数学推理、代码生成等任务中表现超越国际头部产品,而训练成本仅为传统模型的几十分之一。这…...
Golang学习01:Go安装和配置+Vscode、GoLand安装激活+Go环境变量避坑的超详细教程
🪁🍁 希望本文能给您带来帮助,如果有任何问题,欢迎批评指正!🐅🐾🍁🐥 文章目录 一、背景二、Go语言安装2.1 Go语言环境安装2.2 Go语言环境验证2.3 其他配置 三、开发环境…...
案例-06.部门管理-根据ID查询
一.根据ID查询-接口文档 二.根据ID查询-Controller层 package com.gjw.controller;/*** 部门管理Controller*/import com.gjw.anno.Log; import com.gjw.pojo.Dept; import com.gjw.pojo.Result; import com.gjw.service.DeptService; import com.gjw.service.impl.DeptServi…...
解决No matching client found for package name xxx编译报错的问题
如果Android工程编译报错,并且信息如下: Execution failed for task :app:processDebugGoogleServices. > No matching client found for package name com.demo.test可能的原因为google-services.json中定义的package_name属性跟app当前的包名不符&…...
基于deepseek api和openweather 天气API实现Function Calling技术讲解
以下是一个结合DeepSeek API和OpenWeather API的完整Function Calling示例,包含意图识别、API调用和结果整合: import requests import json import os# 配置API密钥(从环境变量获取) DEEPSEEK_API_KEY os.getenv("DEEPSEE…...
什么是全局污染,怎么避免全局污染?
具体表现: 全局变量:当变量在全局作用域(通常是 window 对象)中定义时,它会在整个应用程序中都可访问。这个变量可能会被其他部分的代码意外修改或覆盖,导致难以追踪和调试错误。 命名冲突:全局…...
机器视觉--switch语句
引言 在 Halcon 这个强大的机器视觉软件里,编程控制结构对于高效处理图像任务至关重要。其中,Switch 语句作为一种多分支选择结构,能够根据不同的条件值执行不同的代码块,让程序的逻辑更加清晰和简洁。本文将全面深入地介绍 Halc…...
C++ std::atomic可以使用复杂类型(类和结构体)吗
目录 1.引言 2.std::atomic 支持的复杂类型 3.std::atomic与无锁 4.如何使用 std::atomic 保护复杂类型 4.1.使用互斥锁(Mutex) 4.2.使用 std::atomic_flag 和自旋锁 4.3.原子共享指针(Atomic Shared Pointers) 4.4.使用高…...
音乐随想、日语认识
Rapport的日文歌词(初) Rapport - キタニタツヤ 词:キタニタツヤ 《《 ki ta ni ta tsu ya 歌手的名字,全是片假名,不是本土的平假名(为了国外市场的做法?) 》》 曲:キタニタツヤ 编曲&am…...
SpringBoot速成(11)更新用户头像,密码P13-P14
更新头像: 1.代码展示: 1.RequestParam 是 Spring MVC 中非常实用的注解,用于从 HTTP 请求中提取参数并绑定到控制器方法的参数上。 2.PatchMapping 是 Spring MVC 中的一个注解,用于处理 HTTP 的 PATCH 请求。PATCH 请求通常用于对资源的部…...
自动化测试面试会问哪些?
自动化测试面试1: 1、使用什么测试框架做的上一个项目的自动化测试。 2、自己最熟悉哪个库,如何使用这些库的,是否做了基于复用的封装,怎么考虑的这些封装 3、如何定位app上的元素 4、//*[contains(text,"登录")] 是…...
SQL Server 导入Excel数据
1、选中指定要导入到哪个数据库,右键选择 》任务 》导入数据 2、数据源 选择Excel,点击 下一步(Next) 3、目前 选择OLE DB Provider ,点击 下一步(Next) 4、默认 ,点击 下一步(Next)…...
车载音频架构图详解(精简)
目录 上图是车载音频架构图,对这个图我们进行详细的分析 左边第一层 是 app 常用的类有MediaPlayer和MediaRecorder, AudioTrack和AudioRecorder 第二层 是framework提供给应用的多媒体功能的API类,封装在android.media.* API包中。编译后,在framework.jar中。...
基于SpringBoot+Vue的智慧校园管理系统设计和实现(源码+文档+部署讲解)
🎬 秋野酱:《个人主页》 🔥 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 .🚀 技术架构技术栈全景 🎯 功能模块功能矩阵表📊 数据库设计核心ER关系图 💻 核心…...
浏览器打印局部网页,设置页眉
占位的页眉 重点部分 1.样式间隙 page { margin-top: 60px; /* 为页眉留出空间,页眉的高度要和他一样 */ top-right { height: 60px; 同时右侧,内容布局右上角要留出60px的 2.背景图片 如果页眉…...
腿足机器人之六- 前向运动学
腿足机器人之六- 前向运动学 刚体运动学基础坐标系定义旋转矩阵与欧拉角齐次变换矩阵(平移旋转的统一表示) 运动链建模串联运动链结构(从基座到末端的关节连接)标准Denavit-Hartenberg(D-H)参数法改进D-H参…...
对openharmony HDF驱动框架的C/S设计模式和单例类的说明
在分析openharmony的HDF驱动框架时我们会发现用了很多面向对象的思想,例如类继承、接口、单例类等,本来应该是好事情,**但使用时对象之间的关系交错复杂,不太符合linux内核分层分模块的思路,导致整体理解起来比较困难&…...
kamailio中Core Cookbook 核心配置手册
Core Cookbook 核心配置手册 版本: Kamailio SIP 服务器 v6.0.x (稳定版) 概述 本教程收集了 Kamailio 核心导出到配置文件的功能和参数。 注意: 本页参数未按字母顺序排列。 结构 kamailio.cfg 的结构可分为三部分: 全局参数模块设置路由块 建议按此顺序排列以保持清晰…...
AI 编程工具—Cursor 进阶篇 数据分析
AI 编程工具—Cursor 进阶篇 数据分析 上一节课我们使用Cursor 生成了北京房产的销售数据,这一节我们使用Cursor对这些数据进行分析,也是我们尝试使用Cursor 去帮我们做数据分析,从而进一步发挥Cursor的能力,来帮助我们完成更多的事情 案例一 房产销售数据分析 @北京202…...
HTML、Vue和PHP文件的区别与联系
一、核心区别 类型性质执行环境功能特点.html静态标记语言浏览器直接解析定义页面结构和内容,无逻辑处理能力.vue前端框架组件文件浏览器/构建工具整合HTML模板JS逻辑CSS样式,支持动态数据绑定和组件化开发.php服务器端脚本语言文件Web服务器执行动态生…...
Map 和 Set
目录 一、搜索 概念: 模型: 二、Map 编辑 1.Map 实例化: 2. Map的常见方法: 3.Map的常见方法演示: 1. put(K key, V value):添加键值对 3. containsKey(Object key):检查键是否存在 4.…...
白话大模型LLM-通用基础入门知识-适合给纯小白的入门!
文章目录 什么是大模型大模型训练预训练监督微调SFTRLHF基于人类反馈的强化学习 大模型分类大语言模型-LLM多模态模型-VLM视觉模型音频模型 大模型工作流程分词化与词表映射大模型回答过程 & 基于token的概率预测 Agent导论子任务拆分 什么是大模型 大模型就是训练的一个能…...
线程进入WAITING的N种方式
目录 一、调用 Object 的 wait 方法 二、调用 Thread.join 方法 三、调用LockSupport.park()方法 一、调用 Object 的 wait 方法 public static void main(String[] args) throws InterruptedException {// 创建一个锁对象Object lock new Object();Thread thread new Thr…...
智能车摄像头开源—8 元素处理
目录 一、前言 二、无元素状态 三、直线与弯道 四、十字与环岛 1、十字识别处理 2、环岛识别处理 五、坡道 六、障碍物 七、斑马线 八、入库 九、出界停车 一、前言 在写这篇文章之前,考虑了很久到底该写到什么程度,但思来想去,不同…...
【从0做项目】Java搜索引擎(4)——性能优化~烧脑~~~
本篇文章将对项目搜索引擎(1)~(3)进行性能优化,包括测试,优化思路,优化前后对比 目录 一:文件读取 二:实现多线程制作索引 1:代码分析 2:代码…...