LLVM-mingw 是一个基于 LLVM 项目的开源工具链,用于在类 Unix 系统(如 Linux 或 macOS)上为 Windows 平台交叉编译应用程序,它结合了 LLVM 编译器基础设施(包括 Clang C/C++/Objective-C 编译器和 LLD 链接器,用以替代传统的 GNU 编译器 GCC)以及 MinGW-w64 运行时库(提供 Windows 平台的 API 头文件和导入库,支持 32 位和 64 位 Windows 应用程序开发)。


安装与配置 LLVM-mingw

1. 下载 LLVM-mingw

LLVM-mingw 提供了预编译工具链,可在以下地址获取:

  • MinGW-w64 官网下载
  • LLVM-mingw GitHub Releases

推荐下载文件 llvm-mingw-20250826-ucrt-x86_64.zip,并将其解压至:

C:\Development\llvm-mingw
  • 20250826:发布日期,格式为 YYYYMMDD,表示版本时间(可选最新)
  • ucrt:使用 Windows Universal C Runtime(UCRT)作为 C 运行时
  • x86_64:架构类型,表示 64 位目标平台

解压后的文件夹结构应类似如下:

LICENSE.TXT          arm64ec-w64-mingw32  bin               include  python  x86_64-w64-mingw32
aarch64-w64-mingw32  armv7-w64-mingw32    i686-w64-mingw32  lib      share

2. 配置环境变量

检查现有工具

确保系统中未添加旧版 MinGW 或其他 GCC 工具链路径。

在 PowerShell 中执行以下命令,查看是否已安装:

gcc --version
clang++ --version

如果命令未找到,说明未配置环境变量或尚未安装。


添加到 PATH

C:\Development\llvm-mingw\bin 添加到 系统级环境变量 PATH

setx PATH "$($env:Path);C:\Development\llvm-mingw\bin" /M
  • setx PATH:修改系统 PATH。
  • "$($env:Path);...":保留原有 PATH 内容并追加新路径。
  • /M:设置为系统变量,对所有用户生效。

配置完成后,需重新打开 PowerShell 或 VSCode 终端使其生效。


临时生效(当前会话)

如果仅希望当前 PowerShell 会话立即可用,可以使用:

$env:Path += ";C:\Development\llvm-mingw\bin"

这种方式不会永久保存,窗口关闭后失效。


3. 测试编译和运行

创建测试文件

使用 PowerShell 一行命令创建 main.cpp

echo '#include <iostream>' > main.cpp; echo 'int main() { std::cout << "Hello, World!" << std::endl; return 0; }' >> main.cpp

编译 C++ 程序

使用 clang++ 编译生成 main.exe

clang++ main.cpp -o main.exe

运行测试程序

执行生成的程序:

./main.exe

输出结果应为:

Hello, World!

清理测试文件

如果不再需要测试文件,可以删除:

Remove-Item main.cpp, main.exe

可以按照之前的文风,将内容润色、分段和强化说明如下:


安装 VSCode 与插件

1. 下载与安装 VSCode

访问 Visual Studio Code 官网,下载安装最新版本的 VSCode。
安装过程中可保持默认设置即可,安装完成后即可打开编辑器。


2. 安装必要插件

在 VSCode 中按下 Ctrl + Shift + X 打开插件市场,然后搜索并安装以下插件:

  • Chinese (Simplified):提供 VSCode 界面汉化,使编辑器更易上手
  • CodeLLDB:利用 LLVM 工具链中的 lldb 对 C++ 程序进行调试,包括断点、变量查看和堆栈分析
  • Clangd:基于 LLVM 工具链中的 clangd 提供 C++ 代码智能提示、格式化、高亮、跳转等功能

运行与调试单文件

1. 创建项目文件夹

  1. 新建一个代码文件夹,例如 demo
  2. 使用 VSCode 打开该文件夹,作为工作区。

2. 配置编译任务(tasks.json)

在项目根目录下创建 .vscode\tasks.json 文件,用于定义 Clang++ 编译任务

{"version": "2.0.0","tasks": [{"type": "shell","label": "Build with Clang++","command": "clang++.exe","args": ["-g3","-O0","${file}","-o","${fileDirname}\\${fileBasenameNoExtension}.exe"],"options": {"cwd": "${fileDirname}"},"group": {"kind": "build","isDefault": true},"detail": "Compiler: Clang++ from LLVM-mingw"}]
}
  • -g3:生成调试信息
  • -O0:关闭优化,便于调试
  • ${file} / ${fileDirname} / ${fileBasenameNoExtension}:VSCode 内置变量,可支持任意源文件名
  • 配置完成后,按 Ctrl + Shift + B 可以快速编译当前文件

3. 配置调试任务(launch.json)

.vscode\launch.json 中配置 CodeLLDB 调试器

{"version": "0.2.0","configurations": [{"name": "Debug with CodeLLDB","type": "lldb","request": "launch","program": "${workspaceFolder}/${fileBasenameNoExtension}.exe","args": [],"cwd": "${workspaceFolder}","stopOnEntry": false,"preLaunchTask": "Build with Clang++","sourceLanguages": ["cpp"],"terminal": "integrated"}]
}
  • preLaunchTask:在启动调试前自动执行编译任务
  • ${fileBasenameNoExtension}.exe:与源文件同名的可执行文件
  • 调试时可直接按 F5 启动

4. 创建测试源文件

在项目根目录下创建 main.cpp(支持任意文件名):

#include <iostream>int main() {std::cout << "Hello, World!" << std::endl;return 0;
}

5. 编译与调试

  1. 在 VSCode 中打开 main.cpp
  2. F5 启动调试。
  3. 如果配置正确,调试器会编译源文件并运行程序,输出:
Hello, World!

至此,你已经完成了单文件的编译与调试环境配置。
可在此基础上,逐步扩展为多文件或 CMake 项目。

可以将你的章节内容润色、补充说明,并给出一个推荐的 .clang-format 配置示例:


代码格式化

1. 快捷格式化

安装 Clangd 后,你可以:

  • Ctrl + Alt + F 或右键选择 “Format Document” 进行手动格式化
  • 打开 设置Ctrl + ,),搜索 Format On Save 并勾选
    • 这样每次保存文件时,VSCode 会自动格式化代码

使用 Format On Save 可以保证代码风格统一,减少格式相关的提交差异。


2. 配置 .clang-format

Clangd 的格式化规则可通过项目根目录下的 .clang-format 文件进行定制。
下面给出一个适用于现代 C++ 项目的推荐配置:

# 语言: None, Cpp, Java, JavaScript, ObjC, Proto, TableGen, TextProto
Language: Cpp
# BasedOnStyle:	LLVM# 访问说明符(public、private等)的偏移
AccessModifierOffset: -4# 开括号(开圆括号、开尖括号、开方括号)后的对齐: Align, DontAlign, AlwaysBreak(总是在开括号后换行)
AlignAfterOpenBracket: Align# 连续赋值时,对齐所有等号
AlignConsecutiveAssignments: false# 连续声明时,对齐所有声明的变量名
AlignConsecutiveDeclarations: false# 右对齐逃脱换行(使用反斜杠换行)的反斜杠
AlignEscapedNewlines: Right# 水平对齐二元和三元表达式的操作数
AlignOperands: true# 对齐连续的尾随的注释
AlignTrailingComments: true# 不允许函数声明的所有参数在放在下一行
AllowAllParametersOfDeclarationOnNextLine: false# 不允许短的块放在同一行
AllowShortBlocksOnASingleLine: true# 允许短的case标签放在同一行
AllowShortCaseLabelsOnASingleLine: true# 允许短的函数放在同一行: None, InlineOnly(定义在类中), Empty(空函数), Inline(定义在类中,空函数), All
AllowShortFunctionsOnASingleLine: None# 允许短的if语句保持在同一行
AllowShortIfStatementsOnASingleLine: true# 允许短的循环保持在同一行
AllowShortLoopsOnASingleLine: true# 总是在返回类型后换行: None, All, TopLevel(顶级函数,不包括在类中的函数), 
# AllDefinitions(所有的定义,不包括声明), TopLevelDefinitions(所有的顶级函数的定义)
AlwaysBreakAfterReturnType: None# 总是在多行string字面量前换行
AlwaysBreakBeforeMultilineStrings: false# 总是在template声明后换行
AlwaysBreakTemplateDeclarations: true# false表示函数实参要么都在同一行,要么都各自一行
BinPackArguments: true# false表示所有形参要么都在同一行,要么都各自一行
BinPackParameters: true# 大括号换行,只有当BreakBeforeBraces设置为Custom时才有效
BraceWrapping:# class定义后面AfterClass: false# 控制语句后面AfterControlStatement: false# enum定义后面AfterEnum: false# 函数定义后面AfterFunction: false# 命名空间定义后面AfterNamespace: false# struct定义后面AfterStruct: false# union定义后面AfterUnion: false# extern之后AfterExternBlock: false# catch之前BeforeCatch: false# else之前BeforeElse: false# 缩进大括号IndentBraces: false# 分离空函数SplitEmptyFunction: false# 分离空语句SplitEmptyRecord: false# 分离空命名空间SplitEmptyNamespace: false# 在二元运算符前换行: None(在操作符后换行), NonAssignment(在非赋值的操作符前换行), All(在操作符前换行)
BreakBeforeBinaryOperators: NonAssignment# 在大括号前换行: Attach(始终将大括号附加到周围的上下文), Linux(除函数、命名空间和类定义,与Attach类似), 
#   Mozilla(除枚举、函数、记录定义,与Attach类似), Stroustrup(除函数定义、catch、else,与Attach类似), 
#   Allman(总是在大括号前换行), GNU(总是在大括号前换行,并对于控制语句的大括号增加额外的缩进), WebKit(在函数前换行), Custom
#   注:这里认为语句块也属于函数
BreakBeforeBraces: Custom# 在三元运算符前换行
BreakBeforeTernaryOperators: false# 在构造函数的初始化列表的冒号后换行
BreakConstructorInitializers: AfterColon#BreakInheritanceList: AfterColonBreakStringLiterals: false# 每行字符的限制,0表示没有限制
ColumnLimit: 0CompactNamespaces: true# 构造函数的初始化列表要么都在同一行,要么都各自一行
ConstructorInitializerAllOnOneLineOrOnePerLine: false# 构造函数的初始化列表的缩进宽度
ConstructorInitializerIndentWidth: 4# 延续的行的缩进宽度
ContinuationIndentWidth: 4# 去除C++11的列表初始化的大括号{后和}前的空格
Cpp11BracedListStyle: true# 继承最常用的指针和引用的对齐方式
DerivePointerAlignment: false# 固定命名空间注释
FixNamespaceComments: true# 缩进case标签
IndentCaseLabels: falseIndentPPDirectives: None# 缩进宽度
IndentWidth: 4# 函数返回类型换行时,缩进函数声明或函数定义的函数名
IndentWrappedFunctionNames: false# 保留在块开始处的空行
KeepEmptyLinesAtTheStartOfBlocks: false# 连续空行的最大数量
MaxEmptyLinesToKeep: 1# 命名空间的缩进: None, Inner(缩进嵌套的命名空间中的内容), All
NamespaceIndentation: None# 指针和引用的对齐: Left, Right, Middle
PointerAlignment: Right# 允许重新排版注释
ReflowComments: true# 允许排序#include
SortIncludes: false# 允许排序 using 声明
SortUsingDeclarations: false# 在C风格类型转换后添加空格
SpaceAfterCStyleCast: false# 在Template 关键字后面添加空格
SpaceAfterTemplateKeyword: true# 在赋值运算符之前添加空格
SpaceBeforeAssignmentOperators: true# SpaceBeforeCpp11BracedList: true# SpaceBeforeCtorInitializerColon: true# SpaceBeforeInheritanceColon: true# 开圆括号之前添加一个空格: Never, ControlStatements, Always
SpaceBeforeParens: ControlStatements# SpaceBeforeRangeBasedForLoopColon: true# 在空的圆括号中添加空格
SpaceInEmptyParentheses: false# 在尾随的评论前添加的空格数(只适用于//)
SpacesBeforeTrailingComments: 1# 在尖括号的<后和>前添加空格
SpacesInAngles: false# 在C风格类型转换的括号中添加空格
SpacesInCStyleCastParentheses: false# 在容器(ObjC和JavaScript的数组和字典等)字面量中添加空格
SpacesInContainerLiterals: true# 在圆括号的(后和)前添加空格
SpacesInParentheses: false# 在方括号的[后和]前添加空格,lamda表达式和未指明大小的数组的声明不受影响
SpacesInSquareBrackets: false# 标准: Cpp03, Cpp11, Auto
Standard: Auto# tab宽度
TabWidth: 4# 使用tab字符: Never, ForIndentation, ForContinuationAndIndentation, Always
UseTab: Never

新建万能头文件(可选)

虽然 LLVM-mingw 基于 MinGW,但它只包含标准 C++ 内容,而不包括 GCC 的扩展特性。bits/stdc++.h 是 GCC 中的一个特有头文件,它并不是 C++ 标准库的一部分,因此在 LLVM-mingw 中默认并不可用。如果你希望在 LLVM-mingw 中使用该头文件,可以手动创建一个 bits/stdc++.h 并将其放置到工具链的 include 目录中。以下是详细的操作方法:


1. 创建 stdc++.h

在任意临时目录下新建文件 stdc++.h,内容可以如下(覆盖常用 C++ 标准库):

#ifndef _GLIBCXX_NO_ASSERT
#include <cassert>
#endif
#include <cctype>
#include <cfloat>
#include <climits>
#include <csetjmp>
#include <cstdarg>
#include <cstddef>
#include <cstdlib>#if __cplusplus >= 201103L
#include <cstdint>
#if __cplusplus < 201703L
#include <ciso646>
#endif
#endif// C++
// #include <bitset>
// #include <complex>
#include <algorithm>
#include <bitset>
#include <functional>
#include <iterator>
#include <limits>
#include <memory>
#include <new>
#include <numeric>
#include <typeinfo>
#include <utility>#if __cplusplus >= 201103L
#include <array>
#include <atomic>
#include <initializer_list>
#include <ratio>
#include <scoped_allocator>
#include <tuple>
#include <typeindex>
#include <type_traits>
#endif#if __cplusplus >= 201402L
#endif#if __cplusplus >= 201703L
#include <any>
// #include <execution>
#include <optional>
#include <variant>
#include <string_view>
#endif#if __cplusplus >= 202002L
#include <bit>
#include <compare>
#include <concepts>
#include <numbers>
#include <ranges>
#include <span>
#include <source_location>
#include <version>
#if __cpp_impl_coroutine
# include <coroutine>
#endif
#endif#if __cplusplus > 202002L
#include <expected>
#include <stdatomic.h>
#endif#if _GLIBCXX_HOSTED
// C
#ifndef _GLIBCXX_NO_ASSERT
#include <cassert>
#endif
#include <cctype>
#include <cerrno>
#include <cfloat>
#include <climits>
#include <clocale>
#include <cmath>
#include <csetjmp>
#include <csignal>
#include <cstdarg>
#include <cstddef>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <cwchar>
#include <cwctype>#if __cplusplus >= 201103L
#include <cfenv>
#include <cinttypes>
#include <cstdint>
#include <cuchar>
#if __cplusplus < 201703L
#include <ccomplex>
#include <cstdalign>
#include <cstdbool>
#include <ctgmath>
#endif
#endif// C++
#include <complex>
#include <deque>
#include <exception>
#include <fstream>
#include <functional>
#include <iomanip>
#include <ios>
#include <iosfwd>
#include <iostream>
#include <istream>
#include <iterator>
#include <limits>
#include <list>
#include <locale>
#include <map>
#include <memory>
#include <new>
#include <numeric>
#include <ostream>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <stdexcept>
#include <streambuf>
#include <string>
#include <typeinfo>
#include <utility>
#include <valarray>
#include <vector>#if __cplusplus >= 201103L
#include <array>
#include <atomic>
#include <chrono>
#include <codecvt>
#include <condition_variable>
#include <forward_list>
#include <future>
#include <initializer_list>
#include <mutex>
#include <random>
#include <ratio>
#include <regex>
#include <scoped_allocator>
#include <system_error>
#include <thread>
#include <tuple>
#include <typeindex>
#include <type_traits>
#include <unordered_map>
#include <unordered_set>
#endif#if __cplusplus >= 201402L
#include <shared_mutex>
#endif#if __cplusplus >= 201703L
#include <any>
#include <charconv>
// #include <execution>
#include <filesystem>
#include <optional>
#include <memory_resource>
#include <variant>
#endif#if __cplusplus >= 202002L
#include <barrier>
#include <bit>
#include <compare>
#include <concepts>
#include <format>
#include <latch>
#include <numbers>
#include <ranges>
#include <span>
#include <stop_token>
#include <semaphore>
#include <source_location>
#include <syncstream>
#include <version>
#endif#if __cplusplus > 202002L
#include <expected>
#include <flat_map>
#include <flat_set>
#include <generator>
#include <print>
#include <spanstream>
#include <stacktrace>
#include <stdatomic.h>
#include <stdfloat>
#endif#if __cplusplus > 202302L
#include <text_encoding>
#include <stdbit.h>
#include <stdckdint.h>
#endif#endif // HOSTED

注:可以根据需要裁剪头文件,只包含项目会用到的内容。


2. 放置到系统 include 路径

LLVM-mingw 的 include 路径通常在:

C:\Development\llvm-mingw\include\c++\v1\

你可以创建 bits 文件夹:

C:\Development\llvm-mingw\include\c++\v1\bits\

然后将 stdc++.h 放入该目录:

C:\Development\llvm-mingw\include\c++\v1\bits\stdc++.h

这样在你的代码中就可以:

#include <bits/stdc++.h>

总结

通过本教程,我们成功搭建了一个基于 LLVM-mingw 和 VSCode 的 Windows C++ 开发环境。使用 LLVM-mingw 工具链,不仅能享受 LLVM 编译器提供的高效优化和现代 C++ 支持,还能通过 MinGW-w64 提供的 Windows API 和运行时库实现无缝的 Windows 平台开发。

与传统的 Windows 开发工具链相比,LLVM-mingw 在跨平台开发、性能和编译速度上具有优势,同时结合 VSCode 的智能编辑功能和强大的插件支持,开发者可以在 Windows 平台上以更简洁、便捷的方式进行 C++ 开发。

整个开发流程涵盖了从环境配置、编译、调试到代码格式化等各个方面,确保了高效的开发和调试体验。通过配置 tasks.jsonlaunch.json,VSCode 能够自动化编译、调试任务,使得开发流程更加顺畅。此外,借助 Clangd 插件的代码智能提示、格式化功能,能够提高代码的可维护性和团队协作的效率。

总体来说,使用 LLVM-mingw 和 VSCode 可以帮助开发者在 Windows 平台上获得更加现代化、高效的 C++ 开发体验,尤其适合那些希望避免 Visual Studio 或 Cygwin 等重量级工具的开发者。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/922288.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/922288.shtml
英文地址,请注明出处:http://en.pswp.cn/news/922288.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI内容标识新规实施后,大厂AI用户协议有何变化?(六)科大讯飞

科大讯飞也是国产老将&#xff0c;当年OpenAI横空出世&#xff0c;国内唯有文心和星火能与之一战&#xff0c;早期效果感觉甚至是优于文心的&#xff0c;只是后面再也没有什么大动静出来。讯飞也算大厂了&#xff0c;但跟百度阿里这些老牌互联网门阀相比&#xff0c;还是不够持…

Error: MiniProgramError{“errMsg“:“navigateTo:fail webview count limit exceed“}

这个错误 "navigateTo:fail webview count limit exceed" 是微信小程序中常见的页面栈溢出问题&#xff0c;原因是微信小程序对页面栈深度有默认限制&#xff08;通常为10层&#xff09;&#xff0c;当使用 navigateTo 连续跳转页面导致页面栈超过限制时就会触发。解…

少即是多:从 MPTCP 看优化干预的边界

“对待端到端传输&#xff0c;信息不足就要少干预&#xff0c;越干预越糟糕”&#xff0c;这是我的信条&#xff0c;这次再来说说 MPTCP。 Linux 内核 MPTCP 最好的调度算法就是 default 算法&#xff0c;没有之一&#xff0c;因为它以代价最小&#xff0c;最自然的方式做到了保…

“开源AI智能名片链动2+1模式S2B2C商城小程序”在直播公屏引流中的应用与效果

摘要&#xff1a;本文聚焦于直播公屏引流场景&#xff0c;探讨“开源AI智能名片链动21模式S2B2C商城小程序”如何通过技术赋能与模式创新&#xff0c;重构直播电商的流量获取与转化路径。研究结合案例分析与实证数据&#xff0c;揭示该方案在提升用户互动、优化供应链管理、降低…

基于大数据挖掘的药品不良反应知识整合与利用研究

标题:基于大数据挖掘的药品不良反应知识整合与利用研究内容:1.摘要 随着医疗数据的爆炸式增长&#xff0c;大数据挖掘技术在医疗领域的应用日益广泛。本研究旨在利用大数据挖掘技术对药品不良反应知识进行整合与利用&#xff0c;以提高药品安全性监测和管理水平。通过收集多源异…

国产时序数据库选型指南-从大数据视角看透的价值

摘要&#xff1a;大数据时代时序数据库崛起&#xff0c;工业物联网场景下每秒百万级数据点写入成为常态。Apache IoTDB凭借单节点1000万点/秒的写入性能、毫秒级查询响应和20:1超高压缩比脱颖而出&#xff0c;其树形数据模型完美适配工业设备层级结构。相比传统数据库&#xff…

教你使用服务器如何搭建数据库

数据库是存储和管理数据的核心组件&#xff0c;无论是网站、应用还是企业系统&#xff0c;都离不开数据库的支持。本文将以 莱卡云服务器 为例&#xff0c;教你如何快速搭建常用数据库服务。一、准备工作服务器环境推荐操作系统&#xff1a;Ubuntu 20.04 / Debian 11 / CentOS …

西门子 S7-200 SMART PLC 核心指令详解:从移位、上升沿和比较指令到流水灯控制程序实战

对于 PLC 初学者来说&#xff0c;“流水灯” 是绕不开的经典入门案例 —— 它看似简单&#xff0c;却浓缩了 PLC 编程的核心逻辑&#xff1a;初始化、时序控制、指令应用与状态判断。今天我们就以 S7-200 SMART 为例&#xff0c;逐行拆解一段 8 位流水灯控制程序&#xff0c;带…

P4342 [IOI 1998] Polygon -普及+/提高

P4342 [IOI 1998] Polygon 题目描述 题目可能有些许修改&#xff0c;但大意一致。 Polygon 是一个玩家在一个有 nnn 个顶点的多边形上玩的游戏&#xff0c;如图所示&#xff0c;其中 n4n 4n4。每个顶点用整数标记&#xff0c;每个边用符号 &#xff08;加&#xff09;或符号 *…

枚举算法和排序算法能力测试

枚举算法题目 1&#xff1a;找出 1-20 中既是偶数又是 3 的倍数的数题目描述&#xff1a;小明想找出 1 到 20 中既能被 2 整除又能被 3 整除的数字&#xff0c;帮他列出来吧。 代码&#xff1a;cpp运行#include <iostream> using namespace std; int main() {int a;for (…

大数据电商流量分析项目实战:Hadoop初认识+ HA环境搭建(二)

✨博客主页&#xff1a; https://blog.csdn.net/m0_63815035?typeblog &#x1f497;《博客内容》&#xff1a;大数据、Java、测试开发、Python、Android、Go、Node、Android前端小程序等相关领域知识 &#x1f4e2;博客专栏&#xff1a; https://blog.csdn.net/m0_63815035/…

【Linux】Linux进程概念(上)

一、冯诺依曼体系结构我们常见的计算机&#xff0c;如笔记本。我们不常见的计算机&#xff0c;如服务器。它们大部分都遵守冯诺依曼体系。截至目前&#xff0c;我们所认识的计算机&#xff0c;都是由一个个硬件组件组成。输入单元&#xff1a;键盘、鼠标、扫描仪、写板等中央处…

GESP C++ 一~二级拓展课(一)

课题及解析建议用时60分钟&#xff0c;作业及讲解建议用时50分钟。 课题及解析&#xff1a; 4003&#xff1a;【GESP2303二级】画三角形 【题目描述】 输入一个正整数 n&#xff0c;请使用大写字母拼成一个这样的三角形图案&#xff08;参考样例输入输出&#xff09;&#xff…

Kubernetes Ingress:使用 Apache APISIX 进行外部流量路由

什么是 Ingress&#xff1f; 在 Kubernetes 中&#xff0c;随着微服务架构的广泛应用&#xff0c;集群中的服务需要暴露到外部&#xff0c;以便供用户或其他服务访问。如何高效、安全地管理这些流量&#xff0c;成为了一个重要的议题。Ingress 作为 Kubernetes 提供的一种资源&…

Elasticsearch的理解与使用

在大数据与云计算时代&#xff0c;“高效检索” 与 “实时分析” 成为业务突破的关键能力。Elasticsearch&#xff08;简称 ES&#xff09;作为一款开源分布式搜索与分析引擎&#xff0c;凭借其低延迟、高可扩、强灵活的特性&#xff0c;已成为日志分析、全文检索、业务监控等场…

利用FFmpeg自动批量处理m4s文件

缓存了一些视频m4s文件&#xff0c;只能用指定的软件打开&#xff0c;网上查了一下&#xff0c;需要去掉m4s文件开头的9个0&#xff0c;还要用FFmpeg将两个文件合并成一个文件。 经仔细研究缓存目录和其中文件&#xff0c;发现以下特点&#xff1a;“缓存目录”中有很多“数字文…

MLLM学习~M3-Agent Prompt学习

Prompt “输入→处理→输出→评估” 全流程 Prompt 并非孤立存在&#xff0c;形成了完整的视频理解链路&#xff1a; 视频原始数据&#xff08;语音 / 图像&#xff09;→ 模块 1&#xff08;提取语音 绑定人物 ID&#xff09;→ 模块 2&#xff08;生成情景记忆描述&#xff…

Ubuntu 20.04安装显卡驱动、CUDA、Miniconda和Pytorch(2025.06最新)-Ubuntu从零搭建深度学习环境

文章目录一、安装显卡驱动1.1 查看显卡型号1.2 根据显卡型号选择驱动1.3 获取下载链接1.4 查看下载的显卡驱动安装文件1.5 更新软件列表和安装必要软件、依赖1.6 卸载原有驱动1.7 禁用默认驱动1.8 安装lightdm显示管理器1.9 停止显示服务器1.10 在文本界面中&#xff0c;禁用X-…

PyCharm 连接 AutoDL 远程服务器

实验室的电脑性能不行了&#xff0c;所以想着租一台服务器&#xff0c;然后还想使用PyCharm在本地编程&#xff0c;因此就查找相关资料&#xff0c;这里记录一下配置过程&#xff0c;方便以后查阅。 PyCharm 连接 AutoDL 远程服务器PyCharm 连接服务器上传数据集到服务器运行代…

Spark广播变量HttpBroadcast和TorrentBroadcast对比

HttpBroadcast会在driver端的BlockManager里面存储广播变量对象&#xff0c;并且将该广播变量序列化写入文件中去。所有获取广播数据请求都在driver端&#xff0c;所以存在单点故障和网络IO性能问题。 TorrentBroadcast会在driver端的BlockManager里面存储广播变量对象&#xf…