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

c++ gcc工具链

GCC(GNU Compiler Collection)是一套广泛使用的开源编译工具链,支持多种编程语言(如 C、C++、Objective-C、Fortran 等),主要用于 Linux 和嵌入式开发环境。

组成

GCC 工具链主要由以下几个核心工具组成:

工具作用
gcc/g++GNU 编译器(C 语言使用 gcc,C++ 语言使用 g++
asGNU 汇编器,将汇编代码转换为目标代码
ldGNU 链接器,负责链接目标文件和库,生成可执行文件
ar归档工具,用于创建、修改静态库(.a 文件)
nm查看目标文件或库文件的符号表
objdump反汇编工具,查看二进制文件的详细信息
readelf查看 ELF 文件(Linux 可执行文件格式)的头信息
strip去除二进制文件中的符号信息,减小体积
make构建管理工具,执行自动化编译
gdbGNU 调试器,调试 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-bitarm-linux-gnueabi-gcc旧版 ARM
ARM 32-bit EABIarm-linux-gnueabihf-gcc含硬件浮点的 ARM
ARM 64-bit (AArch64)aarch64-linux-gnu-gcc64 位 ARM
MIPS 32-bitmips-linux-gnu-gcc32 位 MIPS
MIPS 64-bitmips64-linux-gnuabi64-gcc64 位 MIPS
RISC-V 32-bitriscv32-unknown-linux-gnu-gcc32 位 RISC-V
RISC-V 64-bitriscv64-unknown-linux-gnu-gcc64 位 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&#xff08;GNU Compiler Collection&#xff09;是一套广泛使用的开源编译工具链&#xff0c;支持多种编程语言&#xff08;如 C、C、Objective-C、Fortran 等&#xff09;&#xff0c;主要用于 Linux 和嵌入式开发环境。 组成 GCC 工具链主要由以下几个核心工具组成&am…...

基于51单片机的的鸡笼补光和恒温系统的设计与实现(源程序+Protues仿真+电路图+元件清单+器件手册)

编号&#xff1a;71 基于51单片机的的鸡笼补光和恒温系统的设计与实现 功能描述&#xff1a; 本设计由89C52单片机液晶12864显示模块声光报警电路温湿度传感器电路风扇电路LED照明电路光照检测电路GSM电路DS1302时钟电路 1.实现的功能 (1)采用DHT11温湿传感器、光敏电阻捕捉…...

es-head 正则查询和标准正则查询的差异

在es-head里面查询&#xff0c;需要查询字符串是一个json串&#xff0c;因此就要符合json串的格式&#xff0c;在es-head里面可以通过regexp做正则查询&#xff0c;而这里的正则表达式其实是写成字符串的形式的&#xff0c;因此就要面对字符串转义的问题&#xff0c;比如你想匹…...

【深度学习】深度学习和强化学习算法——深度 Q 网络DQN

深度 Q 网络&#xff08;Deep Q-Network, DQN&#xff09; 详解 什么是DQNDQN 的背景DQN 训练流程 2 DQN 的核心思想2.1 经验回放&#xff08;Experience Replay&#xff09;2.2 目标网络&#xff08;Target Network&#xff09;2.3 ε-贪心策略&#xff08;ε-Greedy Policy&a…...

matlab模拟风场的随机脉动风

1、内容简介 matlab137-模拟风场的随机脉动风 可以交流、咨询、答疑 2、内容说明 略 模拟风场的随机脉动风&#xff0c;并进行相关的统计分析和计算&#xff0c;包括风速谱、空间相关性、自谱、互谱、以及POD&#xff08;Proper Orthogonal Decomposition&#xff09;分解等…...

2025年2月16日(numpy-deepseek)

嗯&#xff0c;用户让我介绍一下这段使用numpy的代码。首先&#xff0c;我需要确认用户的需求是什么。他们可能刚开始学习Python或者数据科学&#xff0c;所以需要基础的解释。让我仔细看一下代码。 第一行是import numpy as np&#xff0c;这应该是导入numpy库&#xff0c;并…...

x64和ARM的区别

x64和ARM是两种不同的处理器架构&#xff0c;它们在指令集、设计理念、应用场景和能耗效率等方面存在显著差异。以下是它们之间的主要区别&#xff1a; 1. **指令集架构**&#xff1a; * **x64**&#xff1a;x64架构&#xff0c;也称为x86-64或AMD64&#xff0c;是x86架…...

电解电容的参数指标

容量 这个值通常是室温25℃&#xff0c;在一定频率和幅度的交流信号下测得的容量。容量会随着温度、直流电压、交流电压值的变化而改变。 额定电压 施加在电容上的最大直流电压&#xff0c;通常要求降额使用。 例如额定电压是4V&#xff0c;降额到70%使用&#xff0c;最高施…...

如何在 Mac 上解决 Qt Creator 安装后应用程序无法找到的问题

在安装Qt时&#xff0c;遇到了一些问题&#xff0c;尤其是在Mac上安装Qt后&#xff0c;发现Qt Creator没有出现在应用程序中。通过一些搜索和操作&#xff0c;最终解决了问题。以下是详细的记录和解决方法。 1. 安装Qt后未显示Qt Creator 安装完成Qt后&#xff0c;启动应用程…...

Spring——Spring开发实战经验(1)

摘要 文章主要介绍了 Swagger 作为 API 文档生成和测试工具的功能&#xff0c;包括自动生成 API 文档、提供可视化调试界面、促进前后端协作、支持 OpenAPI 规范等。同时&#xff0c;还提及了 Spring Boot 与 Swagger3 的实战应用&#xff0c;以及 Spring 开发中其他相关技术内…...

设计模式:代理模式

代理模式是很常见的设计模式&#xff0c;即使没有专门学习过这种设计模式&#xff0c;在工作中也一定用过这种设计模式。在实际生活中&#xff0c;代理模式也是常见的&#xff0c;比如内阁首辅相对于皇帝&#xff0c;前者是后者的代理&#xff0c;内阁首辅收到奏折时&#xff0…...

【NLP】循环神经网络RNN

目录 一、认识RNN 二、RNN模型分类 三、传统RNN模型 3.1 结构分析 3.2 Pytorch构建RNN模型 3.3 优缺点 一、认识RNN RNN(Recurrent Neural Network)&#xff0c;中文称作循环神经网络&#xff0c;一般以序列数据为输入&#xff0c;通过网络内部的结构设计有效捕捉序列之…...

深度解析HTTP/HTTPS协议:从原理到实践

深入浅出HTTP/HTTPS协议&#xff1a;从原理到实践 前言 在当今互联网世界中&#xff0c;HTTP和HTTPS协议如同空气般存在于每个网页请求的背后。作为开发者或技术爱好者&#xff0c;理解这些基础协议至关重要。本文将用六大板块&#xff0c;配合原理示意图和实操案例&#xff0…...

AF3 MmcifObject类解读

AlphaFold3 中 MmcifObject类 是 解析 mmCIF 文件的核心数据结构,用于存储解析后的蛋白质结构信息,包含PDB 头部信息、Biopython 解析的结构、链序列信息等。 下面代码包含 Monomer 、AtomSite、ResiduePosition、ResidueAtPosition、 MmcifObject以及ParsingResult数据类的…...

大数据SQL调优专题——Hive执行原理

引入 Apache Hive 是基于Hadoop的数据仓库工具&#xff0c;它可以使用SQL来读取、写入和管理存在分布式文件系统中的海量数据。在Hive中&#xff0c;HQL默认转换成MapReduce程序运行到Yarn集群中&#xff0c;大大降低了非Java开发者数据分析的门槛&#xff0c;并且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.运算符重载 什么是运算符重载呢&#xff1f;简单举个例子就懂了。 就是我想实现日期的加法&#xff0c;而“”这个运算符C只实现了内置类型的加法&#xff0c;而我们要想实…...

Visonpro 检测是否有缺齿

一、效果展示 二、上面是原展开工具CogPolarUnwrapTool&#xff1b; 第二种方法&#xff1a; 用Blob 和 CogCopyRegionTool 三、 用预处理工具 加减常数&#xff0c;让图片变得更亮点 四、圆展开工具 五、模板匹配 六、代码分解 1.创建集合和文子显示工具 CogGraphicCollec…...

(萌新入门)如何从起步阶段开始学习STM32 ——2 我应该学习HAL库还是寄存器库?

概念 笔者下面需要介绍的是库寄存器和HAL库两个重要的概念&#xff0c;在各位看完之后&#xff0c;需要决定自己的学习路线到底是学习HAL呢&#xff1f;还是寄存器呢&#xff1f;还是两者都学习呢&#xff1f; 库寄存器 库寄存器就是简单的封装了我们对寄存器的操作&#xf…...

【SQL技术】不同数据库引擎 SQL 优化方案剖析

一、引言 在数据处理和分析的世界里&#xff0c;SQL 是不可或缺的工具。不同的数据库系统&#xff0c;如 MySQL、PostgreSQL&#xff08;PG&#xff09;、Doris 和 Hive&#xff0c;在架构和性能特点上存在差异&#xff0c;因此针对它们的 SQL 优化策略也各有不同。这些数据库…...

什么是原型?

在 JavaScript 中&#xff0c;原型&#xff08;Prototype&#xff09;是每个 JavaScript 对象都有的一个属性&#xff0c;用来实现对象之间的继承。原型是 JavaScript 面向对象编程的核心概念之一&#xff0c;通过原型链&#xff08;prototype chain&#xff09;&#xff0c;一…...

【第10章:自然语言处理高级应用—10.4 NLP领域的前沿技术与未来趋势】

各位技术探险家们,今天我们要开启一场穿越语言智能奇点的时空之旅。从正在改写物理定律的万亿参数大模型,到能看懂《星际穿越》剧本的跨模态AI,再到正在颠覆编程方式的神经-符号混合系统……这篇万字长文将带你摸清NLP技术进化的七块关键拼图。(建议边读边做笔记,文末有技…...

41.日常算法

1.面试题 02.04. 分割链表 题目来源 给你一个链表的头节点 head 和一个特定值 x &#xff0c;请你对链表进行分隔&#xff0c;使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。你不需要 保留 每个分区中各节点的初始相对位置。 示例 1&#xff1a; 输入&#xff1a…...

CPP集群聊天服务器开发实践(五):nginx负载均衡配置

1 负载均衡器的原理与功能 单台Chatserver可以容纳大约两万台客户端同时在线聊天&#xff0c;为了提升并发量最直观的办法需要水平扩展服务器的数量&#xff0c;三台服务器可以容纳六万左右的客户端。 负载均衡器的作用&#xff1a; 把client的请求按照负载均衡算法分发到具体…...

Java 中的 HashSet 和 HashMap 有什么区别?

一、核心概念与用途 特性HashSetHashMap接口实现实现 Set 接口&#xff08;存储唯一元素&#xff09;实现 Map 接口&#xff08;存储键值对&#xff09;数据存储存储单个对象&#xff08;元素唯一&#xff09;存储键值对&#xff08;键唯一&#xff0c;值可重复&#xff09;典…...

AI大模型的技术突破与传媒行业变革

性能与成本&#xff1a;AI大模型的“双轮驱动” 过去几年&#xff0c;AI大模型的发展经历了从实验室到产业化的关键转折。2025年初&#xff0c;以DeepSeek R1为代表的模型在数学推理、代码生成等任务中表现超越国际头部产品&#xff0c;而训练成本仅为传统模型的几十分之一。这…...

Golang学习01:Go安装和配置+Vscode、GoLand安装激活+Go环境变量避坑的超详细教程

&#x1fa81;&#x1f341; 希望本文能给您带来帮助&#xff0c;如果有任何问题&#xff0c;欢迎批评指正&#xff01;&#x1f405;&#x1f43e;&#x1f341;&#x1f425; 文章目录 一、背景二、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工程编译报错&#xff0c;并且信息如下&#xff1a; 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示例&#xff0c;包含意图识别、API调用和结果整合&#xff1a; import requests import json import os# 配置API密钥&#xff08;从环境变量获取&#xff09; DEEPSEEK_API_KEY os.getenv("DEEPSEE…...

什么是全局污染,怎么避免全局污染?

具体表现&#xff1a; 全局变量&#xff1a;当变量在全局作用域&#xff08;通常是 window 对象&#xff09;中定义时&#xff0c;它会在整个应用程序中都可访问。这个变量可能会被其他部分的代码意外修改或覆盖&#xff0c;导致难以追踪和调试错误。 命名冲突&#xff1a;全局…...

机器视觉--switch语句

引言 在 Halcon 这个强大的机器视觉软件里&#xff0c;编程控制结构对于高效处理图像任务至关重要。其中&#xff0c;Switch 语句作为一种多分支选择结构&#xff0c;能够根据不同的条件值执行不同的代码块&#xff0c;让程序的逻辑更加清晰和简洁。本文将全面深入地介绍 Halc…...

C++ std::atomic可以使用复杂类型(类和结构体)吗

目录 1.引言 2.std::atomic 支持的复杂类型 3.std::atomic与无锁 4.如何使用 std::atomic 保护复杂类型 4.1.使用互斥锁&#xff08;Mutex&#xff09; 4.2.使用 std::atomic_flag 和自旋锁 4.3.原子共享指针&#xff08;Atomic Shared Pointers&#xff09; 4.4.使用高…...

音乐随想、日语认识

Rapport的日文歌词&#xff08;初&#xff09; Rapport - キタニタツヤ 词&#xff1a;キタニタツヤ 《《 ki ta ni ta tsu ya 歌手的名字&#xff0c;全是片假名&#xff0c;不是本土的平假名(为了国外市场的做法&#xff1f;) 》》 曲&#xff1a;キタニタツヤ 编曲&am…...

SpringBoot速成(11)更新用户头像,密码P13-P14

更新头像&#xff1a; 1.代码展示: 1.RequestParam 是 Spring MVC 中非常实用的注解&#xff0c;用于从 HTTP 请求中提取参数并绑定到控制器方法的参数上。 2.PatchMapping 是 Spring MVC 中的一个注解&#xff0c;用于处理 HTTP 的 PATCH 请求。PATCH 请求通常用于对资源的部…...

自动化测试面试会问哪些?

自动化测试面试1&#xff1a; 1、使用什么测试框架做的上一个项目的自动化测试。 2、自己最熟悉哪个库&#xff0c;如何使用这些库的&#xff0c;是否做了基于复用的封装&#xff0c;怎么考虑的这些封装 3、如何定位app上的元素 4、//*[contains(text,"登录")] 是…...

SQL Server 导入Excel数据

1、选中指定要导入到哪个数据库&#xff0c;右键选择 》任务 》导入数据 2、数据源 选择Excel&#xff0c;点击 下一步(Next) 3、目前 选择OLE DB Provider &#xff0c;点击 下一步&#xff08;Next&#xff09; 4、默认 &#xff0c;点击 下一步&#xff08;Next&#xff09;…...

车载音频架构图详解(精简)

目录 上图是车载音频架构图,对这个图我们进行详细的分析 左边第一层 是 app 常用的类有MediaPlayer和MediaRecorder, AudioTrack和AudioRecorder 第二层 是framework提供给应用的多媒体功能的API类,封装在android.media.* API包中。编译后,在framework.jar中。...

基于SpringBoot+Vue的智慧校园管理系统设计和实现(源码+文档+部署讲解)

&#x1f3ac; 秋野酱&#xff1a;《个人主页》 &#x1f525; 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 .&#x1f680; 技术架构技术栈全景 &#x1f3af; 功能模块功能矩阵表&#x1f4ca; 数据库设计核心ER关系图 &#x1f4bb; 核心…...

浏览器打印局部网页,设置页眉

占位的页眉 重点部分 1.样式间隙 page { margin-top: 60px; /* 为页眉留出空间&#xff0c;页眉的高度要和他一样 */ top-right { height: 60px; 同时右侧&#xff0c;内容布局右上角要留出60px的 2.背景图片 如果页眉…...

腿足机器人之六- 前向运动学

腿足机器人之六- 前向运动学 刚体运动学基础坐标系定义旋转矩阵与欧拉角齐次变换矩阵&#xff08;平移旋转的统一表示&#xff09; 运动链建模串联运动链结构&#xff08;从基座到末端的关节连接&#xff09;标准Denavit-Hartenberg&#xff08;D-H&#xff09;参数法改进D-H参…...

对openharmony HDF驱动框架的C/S设计模式和单例类的说明

在分析openharmony的HDF驱动框架时我们会发现用了很多面向对象的思想&#xff0c;例如类继承、接口、单例类等&#xff0c;本来应该是好事情&#xff0c;**但使用时对象之间的关系交错复杂&#xff0c;不太符合linux内核分层分模块的思路&#xff0c;导致整体理解起来比较困难&…...

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静态标记语言浏览器直接解析定义页面结构和内容&#xff0c;无逻辑处理能力.vue前端框架组件文件浏览器/构建工具整合HTML模板JS逻辑CSS样式&#xff0c;支持动态数据绑定和组件化开发.php服务器端脚本语言文件Web服务器执行动态生…...

Map 和 Set

目录 一、搜索 概念&#xff1a; 模型&#xff1a; 二、Map ​编辑 1.Map 实例化&#xff1a; 2. Map的常见方法&#xff1a; 3.Map的常见方法演示&#xff1a; 1. put(K key, V value)&#xff1a;添加键值对 3. containsKey(Object key)&#xff1a;检查键是否存在 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、环岛识别处理 五、坡道 六、障碍物 七、斑马线 八、入库 九、出界停车 一、前言 在写这篇文章之前&#xff0c;考虑了很久到底该写到什么程度&#xff0c;但思来想去&#xff0c;不同…...

【从0做项目】Java搜索引擎(4)——性能优化~烧脑~~~

本篇文章将对项目搜索引擎&#xff08;1&#xff09;~&#xff08;3&#xff09;进行性能优化&#xff0c;包括测试&#xff0c;优化思路&#xff0c;优化前后对比 目录 一&#xff1a;文件读取 二&#xff1a;实现多线程制作索引 1&#xff1a;代码分析 2&#xff1a;代码…...