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

CMake跨平台编译生成:从理论到实战

一、引言

在当今软件开发中,跨平台开发已成为常态。无论是需要在Windows、Linux、macOS等多操作系统上运行,还是在不同的硬件架构(如x86、ARM等)间部署,跨平台编译生成都是一个无法回避的关键问题。CMake,作为一款强大且广泛使用的自动化构建系统,凭借其跨平台特性,为开发者提供了一套统一的构建脚本,能在多种操作系统和编译器环境下生成适配本地的构建系统,从而极大地简化了跨平台项目开发工作。本文将深入探讨CMake在不同平台编译生成的方法与技巧,并通过丰富的实例帮助你掌握其核心要点。

二、CMake跨平台编译基础

1. CMake简介

CMake使用简单的脚本语言编写CMakeLists.txt文件来控制软件构建过程,其核心能力之一是能够感知并识别运行或目标构建所处环境。它会根据不同平台特性进行相应配置,从而生成适应特定平台的构建系统,如Makefile(适用于Linux、macOS的Make工具)、Visual Studio项目文件(用于Windows平台的Visual Studio开发环境)、Ninja文件(一款专注于速度的构建系统)等,方便开发者进行自动化构建、测试以及打包项目,无需在编写代码时考虑平台差异。

2. 关键内置变量

  • CMAKE_SYSTEM_NAME:该变量存储CMake当前配置或构建所针对的操作系统名称。在大多数非交叉编译情况下,它与CMAKE_HOST_SYSTEM_NAME(CMake运行所在宿主操作系统名称)相同;交叉编译时,可通过设置CMAKE_SYSTEM_NAME明确指定目标操作系统。常见值包括“Linux”、“Darwin”(macOS)、“Windows”、“AIX”等,一般由CMake在配置时自动确定,多数情况通过查询系统信息(如类Unix系统上执行uname -s命令)来获取,也可通过手动指定覆盖默认值。
  • CMAKE_CXX_COMPILER:表示用于C++编译的编译器路径。
  • CMAKE_C_COMPILER:表示用于C编译的编译器路径。

三、CMake在不同平台的基础编译配置

1. 最小化的CMakeLists.txt示例(通用基础配置)

以下是一个具备基础跨平台能力的CMakeLists.txt示例,适用于大多数简单C++项目的起始配置:

cmake_minimum_required(VERSION 3.10)  # 指定最低CMake版本要求project(MyCrossPlatformProject VERSION 1.0 LANGUAGES CXX)  # 定义项目名称、版本号和使用的编程语言# 设置C++标准
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)# 添加可执行文件目标,此处为简化,仅包含一个源文件
add_executable(MyApp main.cpp)

2. 检测操作系统并进行基础配置

基于不同的操作系统进行差异化配置是跨平台编译的关键步骤,下面通过示例展示如何根据不同的操作系统设置特定的编译器选项和链接库。

示例代码
cmake_minimum_required(VERSION 3.10)
project(CrossPlatformConfig LANGUAGES CXX)# 设置C++标准
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)# 根据操作系统类型设置不同的编译器选项和链接库
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")# Linux系统下的编译选项set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra")# 假设Linux下可能需要特定的库,如pthreadtarget_link_libraries(MyApp PRIVATE pthread)
elseif(CMAKE_SYSTEM_NAME STREQUAL "Windows")# Windows系统下的编译选项set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4")# Windows系统下可能需要的库,如user32.libtarget_link_libraries(MyApp PRIVATE user32.lib)
elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin")# macOS系统下的编译选项set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra")
elseif(CMAKE_SYSTEM_NAME STREQUAL "AIX")# IBM AIX系统下的编译选项set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -q64")
else()message(WARNING "未识别的操作系统:${CMAKE_SYSTEM_NAME},使用默认编译选项")
endif()# 添加可执行文件目标
add_executable(MyApp main.cpp)

解释

  • 使用if-elseif-else条件语句,依据CMAKE_SYSTEM_NAME变量的值对不同操作系统进行区分。
  • 针对各操作系统分别设置特定的编译器选项和链接库。例如在Linux系统下,通过-Wall -Wextra开启额外警告信息,并且链接pthread库用于多线程支持;Windows系统下,使用/W4开启较高级别的警告,链接user32.lib以满足与Windows API交互的功能;macOS系统下同样开启额外警告选项;AIX系统则指定-q64选项以支持64位编译。

3. 不同平台的编译器选择与配置

不同操作系统默认使用的编译器可能不同,CMake能自动检测并使用合适的编译器,不过对于一些特定需求,也可以手动指定编译器。

示例代码(指定编译器)
cmake_minimum_required(VERSION 3.10)
project(CrossPlatformCompilerSelection LANGUAGES CXX)# 若要手动指定编译器,可取消以下注释进行配置
# 设置C++编译器路径(适用于类Unix系统,如Linux、macOS,需根据实际路径修改)
# set(CMAKE_CXX_COMPILER /usr/bin/g++)
# set(CMAKE_C_COMPILER /usr/bin/gcc)# 或者在Windows下指定特定的Visual Studio编译器(示例仅为示意,实际根据安装版本调整)
# set(CMAKE_CXX_COMPILER "C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.29.30133/bin/Hostx64/x64/cl.exe")
# set(CMAKE_C_COMPILER "C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.29.30133/bin/Hostx64/x64/cl.exe")# 设置C++标准
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)# 添加可执行文件目标
add_executable(MyApp main.cpp)

解释

  • 通过取消注释相应代码行可手动指定编译器路径。在类Unix系统里,可按实际安装位置设定g++gcc的路径;在Windows系统中,则根据Visual Studio的实际安装路径指定cl.exe编译器路径。不过,手动指定编译器路径时要确保路径准确无误,并且编译器版本与项目需求兼容。

四、跨平台编译实战示例

1. 项目结构

本次实战示例项目结构如下:

CrossPlatformApp/
├── CMakeLists.txt
├── src/
│   ├── main.cpp
│   └── platform_utils.cpp
├── include/
│   └── platform_utils.h
└── data/└── config.txt
  • src/:存放项目的源文件。
  • include/:存放项目的头文件。
  • data/:存放项目所需的数据文件。

2. 代码实现

platform_utils.h
#ifndef PLATFORM_UTILS_H
#define PLATFORM_UTILS_Hvoid platform_specific_function();#endif // PLATFORM_UTILS_H
platform_utils.cpp
#include <iostream>
#include "platform_utils.h"// 根据平台执行不同操作的函数
void platform_specific_function() {
#ifdef _WIN32std::cout << "This is Windows platform." << std::endl;
#elif __linux__std::cout << "This is Linux platform." << std::endl;
#elif __APPLE__std::cout << "This is macOS platform." << std::endl;
#elsestd::cout << "Unknown platform." << std::endl;
#endif
}
main.cpp
#include <iostream>
#include "platform_utils.h"int main() {std::cout << "Welcome to Cross Platform App!" << std::endl;platform_specific_function();return 0;
}
CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(CrossPlatformApp VERSION 1.0 LANGUAGES CXX)# 设置C++标准
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)# 处理不同平台的链接库情况
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")target_link_libraries(MyApp PRIVATE pthread)
elseif(CMAKE_SYSTEM_NAME STREQUAL "Windows")target_link_libraries(MyApp PRIVATE user32.lib)
endif()# 添加可执行文件目标
add_executable(MyApp src/main.cpp src/platform_utils.cpp
)# 包含头文件目录
target_include_directories(MyApp PUBLIC ${PROJECT_SOURCE_DIR}/include)# 将数据文件安装到指定位置(示例)
install(FILES ${PROJECT_SOURCE_DIR}/data/config.txt DESTINATION data)

3. 编译与运行

(1)在Linux系统下
  1. 创建并进入构建目录:
mkdir build_linux
cd build_linux
  1. 生成构建系统文件并编译:
cmake ..
cmake --build .
  1. 运行程序:
./MyApp
(2)在Windows系统下(假设使用Visual Studio 2019)
  1. 创建构建目录并进入:
mkdir build_windows
cd build_windows
  1. 使用CMake生成Visual Studio项目文件并编译:
cmake -G "Visual Studio 16 2019" -A x64 ..
cmake --build . --config Release
  1. 运行程序:
    在构建目录下找到生成的Release\MyApp.exe文件并运行。
(3)在macOS系统下
  1. 创建并进入构建目录:
mkdir build_macos
cd build_macos
  1. 生成构建系统文件并编译:
cmake ..
cmake --build .
  1. 运行程序:
./MyApp

运行结果
在不同操作系统上运行MyApp程序,将输出对应的平台信息,如Windows平台输出“This is Windows platform.” ,Linux平台输出“This is Linux platform.”,macOS平台输出“This is macOS platform.”,以此验证跨平台编译和平台特定代码逻辑的正确性。

五、处理平台相关的构建依赖项

1. 查找与链接外部库(以Boost库为例)

示例代码
cmake_minimum_required(VERSION 3.10)
project(CrossPlatformBoostApp LANGUAGES CXX)# 设置C++标准
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)# 查找Boost库
find_package(Boost 1.70 REQUIRED COMPONENTS system thread)if(Boost_FOUND)include_directories(${Boost_INCLUDE_DIRS})# 假设项目中有个可执行文件MyBoostApp,链接Boost库add_executable(MyBoostApp src/main.cpp)target_link_libraries(MyBoostApp PRIVATE ${Boost_LIBRARIES})
else()message(FATAL_ERROR "Boost library not found.")
endif()

解释

  • 使用find_package(Boost 1.70 REQUIRED COMPONENTS system thread)指令查找版本号为1.70或更高且包含systemthread组件的Boost库。
  • 若找到,使用include_directories包含Boost的头文件目录,并在创建的可执行文件MyBoostApp目标中通过target_link_libraries链接Boost库。
  • 若未找到,通过message(FATAL_ERROR "Boost library not found.")输出错误信息并终止配置过程。

2. 根据不同平台指定不同的依赖库

示例代码
cmake_minimum_required(VERSION 3.10)
project(CrossPlatformDependencies LANGUAGES CXX)set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)# 根据平台查找不同的依赖库
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")# Linux平台下可能依赖的库find_package(OpenSSL REQUIRED)target_link_libraries(MyApp PRIVATE OpenSSL::SSL OpenSSL::Crypto)
elseif(CMAKE_SYSTEM_NAME STREQUAL "Windows")# Windows平台下可能依赖的库find_package(OpenSSL REQUIRED)target_link_libraries(MyApp PRIVATE OpenSSL::SSL OpenSSL::Crypto)# 假设Windows下还有其他特定依赖库target_link_libraries(MyApp PRIVATE some_windows_specific_lib)
endif()# 添加可执行文件目标(这里仅为示例,实际需根据项目补充)
add_executable(MyApp main.cpp)

解释

  • 根据CMAKE_SYSTEM_NAME的值判断操作系统,在Linux系统下通过find_package(OpenSSL REQUIRED)查找OpenSSL库并链接;在Windows系统下,不仅查找OpenSSL库进行链接,还额外链接一个假设的Windows特定库some_windows_specific_lib(实际使用时需替换为真实的库名)。

六、生成跨平台安装包

1. 使用CPack生成安装包

示例代码
cmake_minimum_required(VERSION 3.10)
project(CrossPlatformInstaller LANGUAGES CXX)set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)# 添加可执行文件目标(简化示例,实际根据项目补充)
add_executable(MyApp main.cpp)# 配置CPack
set(CPACK_GENERATOR "TGZ;ZIP")  # 生成TAR.GZ和ZIP格式的安装包
include(CPack)

解释

  • set(CPACK_GENERATOR "TGZ;ZIP")指定使用TGZ(TAR.GZ压缩包)和ZIP格式生成安装包。
  • include(CPack)包含CPack模块,使其生效。

2. 生成安装包

在完成项目编译后,在构建目录下执行以下命令生成安装包:

cpack

执行成功后,会在构建目录下生成指定格式的安装包文件,可在不同平台上方便地分发和使用。

七、交叉编译:在不同平台生成适配其他平台的可执行文件

1. 交叉编译的基本概念

交叉编译是指在一个平台上生成另一个平台上可运行的可执行文件,比如在x86架构的Linux系统上生成适用于ARM架构嵌入式设备的可执行程序。

2. 使用CMake进行交叉编译

示例:在Linux系统上交叉编译ARM架构的可执行程序
  1. 首先创建一个交叉编译工具链文件,例如arm-toolchain.cmake,内容如下:
# 指定目标系统
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)# 指定交叉编译工具链路径(根据实际安装路径调整)
set(CMAKE_C_COMPILER /path/to/arm-linux-gnueabihf-gcc)
set(CMAKE_CXX_COMPILER /path/to/arm-linux-gnueabihf-g++)# 可选:添加其他交叉编译所需的设置
# 例如,指定查找头文件和库的路径
# include_directories(/path/to/arm-linux-gnueabihf/include)
# link_directories(/path/to/arm-linux-gnueabihf/lib)
  1. 在项目根目录下执行CMake命令,使用交叉编译工具链文件:
mkdir build_arm
cd build_arm
cmake -DCMAKE_TOOLCHAIN_FILE=../arm-toolchain.cmake ..
cmake --build .

解释

  • 通过-DCMAKE_TOOLCHAIN_FILE=../arm-toolchain.cmake参数指定交叉编译工具链文件,CMake会根据该文件中的配置生成适用于ARM架构的构建系统。
  • 执行后续的构建命令,即可在Linux系统上生成适用于ARM架构的可执行程序。

八、总结

CMake作为一款强大的跨平台构建工具,为开发者提供了一套统一的框架来处理不同平台下的编译生成工作。通过灵活运用CMake的内置变量、条件语句以及各类指令,开发者可以轻松地在多种操作系统和硬件架构下生成适配的构建系统,实现项目的跨平台编译、链接和安装。在实际项目开发中,深入理解和掌握CMake跨平台编译的能力,将大大提高开发效率,降低维护成本,使项目能够在更广泛的环境中稳定运行。希望本文的详细介绍与实例能帮助读者更好地理解和运用CMake进行跨平台开发。

以上就是关于CMake跨平台编译生成的详细指南,若在实践过程中遇到任何问题,欢迎在评论区留言交流。

相关文章:

CMake跨平台编译生成:从理论到实战

一、引言 在当今软件开发中&#xff0c;跨平台开发已成为常态。无论是需要在Windows、Linux、macOS等多操作系统上运行&#xff0c;还是在不同的硬件架构&#xff08;如x86、ARM等&#xff09;间部署&#xff0c;跨平台编译生成都是一个无法回避的关键问题。CMake&#xff0c;…...

MCP 协议传输机制大变身:抛弃 SSE,投入 Streamable HTTP 的怀抱

在技术的江湖里&#xff0c;变革的浪潮总是一波接着一波。最近&#xff0c;模型上下文协议&#xff08;MCP&#xff09;的传输机制就搞出了大动静&#xff0c;决定和传统的服务器发送事件&#xff08;SSE&#xff09;说拜拜&#xff0c;转身拥抱 Streamable HTTP&#xff0c;这…...

opencv 图像的平移和旋转

warpAffine函数讲解,图片可自行下载&#xff0c;也可用自己的图片 原图im 平移im_shifted 旋转im_rotated # 图像仿射变换 # 步骤&#xff1a; 读取图像 -> 创建仿射变换矩阵 -> 仿射变换计算 # 平移变换矩阵&#xff1a;一种写法&#xff0c;直接写死 # 旋转变…...

IDEA2025版本使用Big Data Tools连接Linux上Hadoop的HDFS

目录 Windows的准备 1. 将与Linux上版本相同的hadoop压缩包解压到本地 ​编辑2.设置$HADOOP HOME环境变量指向:E:\hadoop-3.3.4 3.下载hadoop.dll和winutils.exe文件 4.将hadoop.dll和winutils.exe放入$HADOOP HOME/bin中 IDEA中操作 1.下载Big Data Tools插件 2.添加并连…...

hysAnalyser特色的TS流编辑、剪辑和转存MP4功能说明

摘要 hysAnalyser 是一款特色的 MPEG-TS 数据分析工具&#xff0c;融合了常规TS文件的剪辑&#xff0c;转存功能&#xff0c;可用于平常的视频开发和测试。 本文详细阐述了对MPEG-TS 流的节目ID&#xff0c;名称&#xff0c;PID&#xff0c;时间戳&#xff0c;流类型&#xff…...

Day125 | 灵神 | 二叉树 | 二叉树中的第K大层和

Day125 | 灵神 | 二叉树 | 二叉树中的第K大层和 2583.二叉树中的第K大层和 2583. 二叉树中的第 K 大层和 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 把每层的结果都放到一个vector数组里面&#xff0c;然后排序这个vector数组&#xff0c;返回第K大的元素即…...

Google机器学习实践指南(学习速率篇)

&#x1f525;Google机器学习核心概念精讲&#xff08;学习速率&#xff09; Google机器学习实战(7)-5分钟掌握学习速率。 学习速率&#xff1a;模型训练的关键超参数 学习速率是指在训练模型时用于梯度下降的一个标量。在每次迭代期间&#xff0c;梯度下降法都会将学习速率…...

JS实现直接下载PDF文件

pdf文件通过a标签直接下载会打开页面&#xff0c;所以&#xff0c;请求该文件的blob文件流数据&#xff0c;再通过window.URL.createObjectURL转成链接&#xff0c;就可以直接下载了。 只需要替换url和文件名称就行&#xff0c;文件名的后缀记得要写上pdf&#xff0c;不然会变成…...

使用KubeKey快速部署k8s v1.31.8集群

实战环境涉及软件版本信息&#xff1a; 使用kubekey部署k8s 1. 操作系统基础配置 设置主机名、DNS解析、时钟同步、防火墙关闭、ssh免密登录等等系统基本设置 dnf install -y curl socat conntrack ebtables ipset ipvsadm 2. 安装部署 K8s 2.1 下载 KubeKey ###地址 https…...

FreeSWITCH 纯内网配置

纯内网&#xff0c;且同一个网段&#xff0c;Fs 可简化配置&#xff0c;要点是: 1. 不需要事先配置 directory&#xff0c;任意号码都可以注册&#xff0c;且无挑战 2. 呼叫无挑战 不需要考虑那么多安全问题 配置如下&#xff1a; 1. 全局变量 <X-PRE-PROCESS cmd"…...

leetcode hot100:十四、解题思路大全:真·大全!

因为某大厂的算法没有撕出来&#xff0c;怒而整理该贴。部分题目有python版本的AC代码。本贴耗时4天呜呜呜 1.哈希 两数之和 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下…...

kali的简化安装

首先点击kali的官网 https://www.kali.org/get-kali/#kali-platforms 点击虚拟机版本 下载VMware版本的压缩包 解压后 点击 后缀名为 .vmx的文件 原始账号密码为 kali kali 这样安装 就不需要我们再去配置镜像 等等复杂操作了...

交换机的连接方式堆叠和级联

以下是交换机的堆叠和级联各自的优缺点总结&#xff0c;帮助快速对比选择&#xff1a; ​一、堆叠&#xff08;Stacking&#xff09;​ ​优点 ​高性能 堆叠链路带宽高&#xff08;如10G/40G/100G&#xff09;&#xff0c;成员间数据通过背板直连&#xff0c;无带宽瓶颈。支…...

Vortex GPGPU的github流程跑通与功能模块波形探索(三)

文章目录 前言一、./build/ci下的文件结构二、基于驱动进行仿真过程牵扯的文件2.1 blackbox.sh文件2.2 demo文件2.3 额外牵扯到的ramulator2.3.1 ramulator简单介绍2.3.2 ramulator使用方法2.3.3 ramulator的输出2.3.4 ramulator的复现2.3.4.1 调试与验证&#xff08;第 4.1 节…...

React深度解析:Hooks体系与Redux Toolkit现代状态管理实践

前言 React作为当今最流行的前端框架之一&#xff0c;其生态体系不断演进&#xff0c;为开发者提供了更高效、更优雅的解决方案。本文将深入探讨React的两大核心主题&#xff1a;Hooks体系&#xff08;特别是useState和useEffect&#xff09;以及Redux Toolkit现代状态管理方案…...

实用蓝牙耳机哪款好?先做好使用场景分析!

市面上的蓝牙耳机款式繁多&#xff0c;618到来之际&#xff0c;消费者如何选择适合自己的蓝牙耳机&#xff1f;实用蓝牙耳机哪款好&#xff1f;关键在于做好使用场景分析&#xff01;今天&#xff0c;就带大家结合不同的使用场景&#xff0c;分享三款倍思音频的精品蓝牙耳机。 …...

Rules and Monetization

The system creates rules that allow them to monetize. The system doesn’t just enforce rules — it creates them strategically to monetize control. &#x1f527; How It Works: Invent a rule (e.g., “You need a permit to sell food.”)Claim it’s for safety …...

防火墙NAT地址组NAT策略安全策略

本文仅供学习交流&#xff0c;所涉及的知识技术产权归属华为技术有限公司所有&#xff01;&#xff01;&#xff01; 本文仅供学习交流&#xff0c;所涉及的知识技术产权归属华为技术有限公司所有&#xff01;&#xff01;&#xff01; 本文仅供学习交流&#xff0c;所涉及的…...

python开发环境管理和包管理

在 Python 开发中&#xff0c;环境管理 和 包管理 是两个非常重要的概念。它们帮助开发者&#xff1a; 这里写目录标题 一、什么是 Python 环境管理&#xff1f;二、什么是 Python 包管理&#xff1f;三、常见文件说明&#xff08;用于包管理和环境配置&#xff09;四、典型流程…...

Windows 使用 WSL 安装 Ubuntu

一&#xff0c;前言 Windows 上轻松跑 Linux 又不想用笨重的VMware 和VirtualBox &#xff0c;怎么办&#xff1f; 开源项目 Windows Subsystem for Linux (WSL)。它解决了许多开发者在 Windows 和 Linux 间切换的痛点&#xff0c;实现在 Windows 上无缝跑 Linux 工具和命令。…...

.jsx文件和.tsx文件有什么区别

.tsx 和 .jsx 是两种用于 React 开发的 JavaScript 文件扩展名&#xff0c;它们的主要区别在于对 TypeScript 的支持以及使用场景。以下是详细对比&#xff1a; 定义 .jsx&#xff1a;是 JavaScript XML 的缩写&#xff0c;用于在 JavaScript 中编写类似 XML 的 JSX 语法&…...

第九天的尝试

目录 一、每日一言 二、练习题 三、效果展示 四、下次题目 五、总结 一、每日一言 创造美好的代价是努力&#xff0c;失望以及毅力&#xff0c;首先是痛苦&#xff0c;然后才是欢乐。 时间是快的&#xff0c;看怎么利用&#xff0c;安排好一切事情&#xff0c;才能从容面对…...

每日算法 -【Swift 算法】寻找字符串中最长回文子串(三种经典解法全解析)

&#x1f9e9; 最长回文子串问题&#xff1a;三种经典解法全解析&#xff08;含代码注释&#xff09; 本文将系统讲解“最长回文子串”问题的三种常见解法&#xff1a;中心扩展法、动态规划、马拉车算法&#xff08;Manacher’s Algorithm&#xff09;&#xff0c;并进行对比与…...

《Cesium全生态解析:从入门到精通的3D地理空间开发指南》

在WebGL、GIS和三维可视化技术高速发展的今天&#xff0c;Cesium 已经从一个开源地图引擎成长为全球开发者构建数字地球的核心工具。从地球到火星&#xff0c;从网页到游戏引擎&#xff0c;Cesium以其跨平台、高精度和无限扩展性&#xff0c;重新定义了我们对空间数据的交互方式…...

pytorch LSTM 结构详解

最近项目用到了LSTM &#xff0c;但是对LSTM 的输入输出不是很理解&#xff0c;对此&#xff0c;我详细查找了lstm 的资料 import torch.nn as nnclass LSTMModel(nn.Module):def __init__(self, input_size1, hidden_size50, num_layers2):super(LSTMModel, self).__init__()…...

流程自动化引擎:重塑企业数字神经回路

在数字经济高速发展的今天&#xff0c;企业运营的核心逻辑正在经历一场静默的革命。流程自动化引擎作为这场变革的中枢神经系统&#xff0c;通过智能化的技术手段重构企业的业务逻辑与决策链路&#xff0c;将原本离散的“数字神经元”编织成高效协同的神经网络。这种技术不仅打…...

nginx web服务日志分析

特点&#xff1a; 实时分析&#xff1a;支持实时分析 Nginx 日志&#xff0c;无需预先存储大量日志数据&#xff0c;能即时反馈网站的访问情况。轻量级高效&#xff1a;资源占用少&#xff0c;运行速度快&#xff0c;适合处理高流量网站的日志分析。多种输出格式&#xff1a;除…...

VSCode+EIDE通过KeilC51编译,使VSCode+EIDE“支持”C和ASM混编

在使用Keil C51时&#xff0c;要让Keil C51支持混编则需要在混编的.c文件上右键选择Options for File *(ALTF7)&#xff0c;打开选项界面后&#xff0c;在 Properties 页 勾上 Generate Assembler SRC File 和 Assemble SRC File &#xff0c;如下图所示&#xff1a; 这样设置后…...

5.23本日总结

一、英语 复习list5list25 二、数学 写14讲部分课后题&#xff0c;学习15讲部分 三、408 写计网5.3题目&#xff0c;学习计组第一章 四、总结 二重积分的题目也涉及了一元函数积分相关知识&#xff0c;该部分遗忘较多&#xff0c;后续需要再复习。 五、明日计划 英语&…...

游戏引擎学习第298天:改进排序键 - 第1部分

关于向玩家展示多个房间层所需的两种 Z 值 我们在前一天基本完成了为渲染系统引入分层 Z 值的工作&#xff0c;但还没有完全完成所有细节。我们开始引入图形渲染中的分层概念&#xff0c;即在 Z 轴方向上拥有多个独立图层&#xff0c;每个图层内部再使用一个单独的 Z 值来实现…...