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

C++ Mac 打包运行方案(cmake)

文章目录

  • 背景
  • 动态库梳理
  • 打包方案
    • 静态库处理
    • 动态库处理(PCL库)
    • 编译链接
    • 动态库后处理逻辑
  • 批量信任

背景

使用C++编写的一个小项目,需要打包成mac下的可执行文件(免安装版本),方便分发给其他mac执行,需要把项目的动态库都打在软件包中,分发之后可以直接运行,而不需要再重复安装。

动态库梳理

经过依赖精简和梳理,项目最终必须依赖的动态库包括:pcl, bzip2, lz4, yaml, rosbag(用于读取rosbag包,后续会有专门的文章会提到如何做到不依赖ros环境)。 在Mac上,这些动态库都已经通过homebrew工具安装好。

brew install cmake bzip2 lz4 pcl

brew 在安装bzip2lz4 时,也会默认安装他们的静态库文件(liblz4.alibbz2.a),而pcl库是直接安装的动态库文件。

打包方案

yaml动态库在前面的文章中已经转成了静态库代码的形式包含在了项目里。对于动态库,和linux类似,需要把动态库(dylib)直接打包到存放可执行文件的目录中。不过,不同于linux,mac上需要处理动态库自身的动态库依赖。

由于我们使用homebrew安装依赖库,所以我们在编译时(CMakeLists.txt)中需要在brew的安装路径下查找定位依赖库。

# Homebrew 安装路径
set(HOMEBREW_PREFIX "/usr/local/opt")

静态库处理

对于bzip2lz4,我们在编译的时候直接依赖他们的静态库文件,这样比较方便。

# lz4, bzip2 静态库路径
set(LZ4_LIBRARY "${HOMEBREW_PREFIX}/lz4/lib/liblz4.a")
set(BZIP2_LIBRARIES "${HOMEBREW_PREFIX}/bzip2/lib/libbz2.a")find_package(BZip2 REQUIRED)
# 显式指定 BZip2 静态库(覆盖默认动态库)
if(BZIP2_FOUND)set(BZIP2_LIBRARIES "${HOMEBREW_PREFIX}/bzip2/lib/libbz2.a")message(STATUS "BZip2 static lib: ${BZIP2_LIBRARIES}")
endif()# 定位 lz4 静态库
find_library(LZ4_LIBRARY_RELEASE NAMES liblz4.a PATHS "${HOMEBREW_PREFIX}/lz4/lib" REQUIRED)
find_library(LZ4_LIBRARY_DEBUG NAMES liblz4d.a PATHS "${HOMEBREW_PREFIX}/lz4/lib")
if(LZ4_LIBRARY_RELEASE)set(LZ4_LIBRARIES ${LZ4_LIBRARY_RELEASE})if(LZ4_LIBRARY_DEBUG)set(LZ4_LIBRARIES optimized ${LZ4_LIBRARY_RELEASE} debug ${LZ4_LIBRARY_DEBUG})endif()message(STATUS "lz4 static lib found: ${LZ4_LIBRARIES}")
endif()

动态库处理(PCL库)

# PCL 动态库路径
set(PCL_DIR "${HOMEBREW_PREFIX}/pcl/lib/cmake/pcl")  
list(APPEND CMAKE_PREFIX_PATH "${PCL_DIR}")# macOS 动态库运行时搜索路径设置
set(CMAKE_INSTALL_RPATH "@executable_path")
set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)# 框架链接(PCL 可能需要的系统框架)
link_libraries("-framework Accelerate" "-framework OpenGL" "-framework Foundation")find_package(PCL REQUIRED COMPONENTS io)
if(PCL_FOUND)message(STATUS "PCL Found: ${PCL_LIBRARIES}")include_directories(${PCL_INCLUDE_DIRS})
else()message(FATAL_ERROR "PCL not found!")
endif()

编译链接

add_executable(MyApp ...)target_include_directories(MyApp PUBLIC ${PCL_INCLUDE_DIRS}${CMAKE_SOURCE_DIR}/thirdparty/yaml-cpp/include...
)# 链接配置:PCL动态库 + 其他静态库
target_link_libraries(MyApp PUBLIC ${PCL_LIBRARIES}       # PCL动态库yaml-cpp               # 静态源码编译的yaml-cpp${BZIP2_LIBRARIES}     # BZip2静态库${LZ4_LIBRARIES}       # lz4静态库
)

动态库后处理逻辑

首先,可以使用 otool -L 提取依赖的动态库,不管是App还是动态库本身,都可以用这个命令来定位到他们的依赖。这里和linux不同的地方在于,需要递归去处理动态库及动态库自身的依赖。针对以下两种情况分别处理:

  1. 动态库路径中包含 /usr/local :直接复制对应地址的动态库到目标路径的libs下(dist/libs/

  2. 动态库路径中包含 @rpath:这种情况比较麻烦,因为根据@rpath并不能定位到动态库的路径,需要根据动态库类型替换@rpath为实际的动态库路径:

if echo "$dep" | grep -q "vtk"; thenreplaced_str=${dep//@rpath//usr/local/opt/vtk/lib}echo $replaced_strcp -L "$replaced_str" dist/libs/

把动态库拷贝到目标路径后,就可以递归调用相同的方法,定位拷贝动态库自身的依赖。从递归返回之后,就可以修改当前动态库依赖的路径为新的目标路径,即dist/libs/

new_dep_path="@executable_path/../libs/$dep_name"
install_name_tool -change "$dep" "$new_dep_path" "$lib" 

完整脚本如下:

#!/bin/bash
set -erm -rf build && mkdir build && cd build
cmake .. -DBP_USE_PCL=ON
make -j$(nproc)process_deps() {local lib=$1echo "process lib $1"# 提取当前库的依赖项otool -L "$lib" | awk 'NR>1 && /^\t/ {print $1}' | grep -E "/usr/local|@rpath" |while read dep; do# 复制依赖库到 libs/(如果尚未存在)dep_name=$(basename "$dep")if [ ! -f "dist/libs/$dep_name" ]; thenif echo "$dep" | grep -q "vtk"; thenreplaced_str=${dep//@rpath//usr/local/opt/vtk/lib}echo $replaced_strcp -L "$replaced_str" dist/libs/elif echo "$dep" | grep -q "Qt"; thenreplaced_str=${dep//@rpath//usr/local/opt/qt/lib/}echo $replaced_strcp -L "$replaced_str" dist/libs/elif echo "$dep" | grep -q "pcl"; thenreplaced_str=${dep//@rpath//usr/local/opt/pcl/lib/}echo $replaced_strcp -L "$replaced_str" dist/libs/elif echo "$dep" | grep -q "boost"; thenreplaced_str=${dep//@rpath//usr/local/opt/boost/lib/}echo $replaced_strcp -L "$replaced_str" dist/libs/elsecp -L "$dep" dist/libs/fichmod +w dist/libs/"$dep_name"  # 确保可修改权限process_deps "dist/libs/$dep_name"  # 递归处理fi# 修改当前库的依赖路径new_dep_path="@executable_path/../libs/$dep_name"install_name_tool -change "$dep" "$new_dep_path" "$lib" done
}# 1. 初始化目录
rm -rf dist
mkdir -p dist/{libs,bin}# 2. 拷贝可执行文件
cp MyApp dist/bin/
cp ../mac-prepare.sh dist/
chmod +x dist/mac-prepare.sh
APP_PATH="dist/bin/MyApp"
process_deps "$APP_PATH"
echo "Bundle created in dist/"

批量信任

迁移到其他mac上执行时,会提示不可信任的开发者,而且不只是可执行文件会提示,每个动态库都会提示,人工处理显然处理不过来。

在这里插入图片描述

所以,我们要在目标mac上先进行批量信任才能正常运行该可执行文件。

#!/bin/bash
set -e# 目标机器上执行
BIN_DIR="./bin"
LIB_DIR="./libs"# # 步骤1:递归移除所有隔离属性
echo "[1/3] Removing quarantine attributes..."
xattr -dr com.apple.quarantine "$BIN_DIR"
xattr -dr com.apple.quarantine "$LIB_DIR"# # 步骤2:递归重新签名
echo "[2/3] Re-signing binaries and libraries..."
find "$LIB_DIR" \-type f \( -name "*.dylib" -o -name "*.so" -o -perm +111 \) \-exec codesign --force --sign - {} \; 2>/dev/null

相关文章:

C++ Mac 打包运行方案(cmake)

文章目录 背景动态库梳理打包方案静态库处理动态库处理(PCL库)编译链接动态库后处理逻辑 批量信任 背景 使用C编写的一个小项目,需要打包成mac下的可执行文件(免安装版本),方便分发给其他mac执行,需要把项目的动态库都…...

数学复习笔记 10

前言 我觉得数学的高分乃至满分属于那些,聪明,坚韧,勇敢,细致的人。我非常惭愧自己不是这样的人,我在生活中发现了这样的同学,和他们交流的时候我常常感到汗流浃背,因为他们非常扎实的基础知识…...

Oracle-相关笔记

Oracle Database Online Documentation 11g 连接 WinR sqlplus username/passwordhostname:port/service_namesqlplus user02/123456192.xxx:1521/orclsqlplus / as sysdba #SQL*Plus 終端编码使用UTF-8 chcp 65001#打开SQL*Plus程序 sqlplus /nolog#使用dba角色登录(用 1.…...

mac安装cast

背景 pycharm本地运行脚本时提示cast没有安装 问题原因 脚本尝试调用cast命令(以太坊开发工具foundry中的子命令),但您的系统未安装该工具。 从日志可见,错误发生在通过sysutil.py执行shell命令时。 解决方案 方法1&#xf…...

CodeEdit:macOS上一款可以让Xcode退休的IDE

CodeEdit 是一款轻量级、原生构建的代码编辑器,完全免费且开源。它使用纯 swift 实现,而且专为 macOS 设计,旨在为开发者提供更高效、更可靠的编程环境,同时释放 Mac 的全部潜力。 Stars 数21,719Forks 数1,081 主要特点 macOS 原…...

opencv4.11编译Debug提示缺少python312_d.lib或python3*_d.lib的解决办法

前言 当我们编译OpenCV 4.11的时候可能会遇到提示缺少库文件,这个时候我们可以下载Python源码编译这个lib。 也可以下载我上传的版本(python312_d.lib),但是如果是其他版本需要自己编译。编译步骤如下,大概几分钟搞定…...

html的鼠标点击事件有哪些写法

在HTML中&#xff0c;鼠标点击事件的实现方式多样&#xff0c;以下从基础语法到现代实践为您详细梳理&#xff1a; 一、基础写法&#xff1a;直接内联事件属性 在HTML标签内通过on前缀事件属性绑定处理函数&#xff0c;适合简单交互场景&#xff1a; <!-- 单击事件 -->…...

深度解析物理机服务器故障修复时间:影响因素与优化策略

一、物理机故障修复的核心影响因素 物理机作为企业 IT 基础设施的核心载体&#xff0c;其故障修复效率直接关系到业务连续性。故障修复时间&#xff08;MTTR&#xff09;受多重因素交叉影响&#xff1a; 1. 故障类型的复杂性 硬件级故障&#xff1a; 简单故障&#xff1a;内存…...

蓝桥杯 2024 C++国 B最小字符串

P10910 [蓝桥杯 2024 国 B] 最小字符串 题目描述 给定一个长度为 N N N 且只包含小写字母的字符串 S S S&#xff0c;和 M M M 个小写字母 c 1 , c 2 , ⋯ , c M c_1, c_2, \cdots, c_M c1​,c2​,⋯,cM​。现在你要把 M M M 个小写字母全部插入到字符串 S S S 中&…...

解密企业级大模型智能体Agentic AI 关键技术:MCP、A2A、Reasoning LLMs-docker MCP解析

解密企业级大模型智能体Agentic AI 关键技术&#xff1a;MCP、A2A、Reasoning LLMs-docker MCP解析 这里面有很重要的原因其中一个很其中一个原因是因为如果你使用docker的方式&#xff0c;你可以在虚拟环境下就类似于这个沙箱的这个机制可以进行隔离。这对于安全&#xff0c;…...

访问 Docker 官方镜像源(包括代理)全部被“重置连接”或超时

华为云轻量应用服务器&#xff08;Ubuntu 系统&#xff09; 遇到的问题是&#xff1a; &#x1f512; 访问 Docker 官方镜像源&#xff08;包括代理&#xff09;全部被“重置连接”或超时了&#xff0c;说明你这台服务器的出境网络对这些国外域名限制很严格&#xff0c;常见于华…...

前馈神经网络回归(ANN Regression)从原理到实战

前馈神经网络回归(ANN Regression)从原理到实战 一、回归问题与前馈神经网络的适配性分析 在机器学习领域&#xff0c;回归任务旨在建立输入特征与连续型输出变量之间的映射关系。前馈神经网络&#xff08;Feedforward Neural Network&#xff09;作为最基础的神经网络架构&a…...

RNN/LSTM原理与 PyTorch 时间序列预测实战

🕰️ RNN / LSTM 原理与 PyTorch 时间序列预测实战 在处理时间序列数据、语音信号、文本序列等连续性强的问题时,循环神经网络(RNN)及其改进版本 LSTM(长短期记忆网络)是最常见也最有效的模型之一。本文将深入讲解 RNN 和 LSTM 的核心原理,并通过 PyTorch 实现一个时间…...

Docker容器镜像与容器常用操作指南

一、镜像基础操作 搜索镜像 docker search <镜像名>在Docker Hub中查找公开镜像&#xff0c;例如&#xff1a; docker search nginx拉取镜像 docker pull <镜像名>:<标签>从仓库拉取镜像到本地&#xff0c;标签默认为latest&#xff1a; docker pull nginx:a…...

1:OpenCV—图像基础

OpenCV教程 头文件 您只需要在程序中包含 opencv2/opencv.hpp 头文件。该头文件将包含应用程序的所有其他必需头文件。因此&#xff0c;您不再需要费心考虑程序应包含哪些头文件。 例如 - #include <opencv2/opencv.hpp>命名空间 所有 OpenCV 类和函数都在 cv 命名空…...

测试--BUG(软件测试⽣命周期 bug的⽣命周期 与开发产⽣争执怎么办)

1. 软件测试的⽣命周期 软件测试贯穿于软件的整个⽣命周期&#xff0c;针对这句话我们⼀起来看⼀下软件测试是如何贯穿软件的整个⽣命周期。 软件测试的⽣命周期是指测试流程&#xff0c;这个流程是按照⼀定顺序执⾏的⼀系列特定的步骤&#xff0c;去保证产品质量符合需求。在软…...

基于大模型预测围术期麻醉苏醒时间的技术方案

目录 一、数据收集与处理(一)数据来源(二)数据预处理二、大模型构建与训练(一)模型选择(二)模型训练三、围术期麻醉苏醒时间预测(一)术前预测(二)术中动态预测四、并发症风险预测(一)风险因素分析(二)风险预测模型五、基于预测制定手术方案(一)个性化手术规划…...

QT6 源(101)阅读与注释 QPlainTextEdit,其继承于QAbstractScrollArea,属性学习与测试

&#xff08;1&#xff09; &#xff08;2&#xff09; &#xff08;3&#xff09;属性学习与测试 &#xff1a; &#xff08;4&#xff09; &#xff08;5&#xff09; 谢谢...

电池组PACK自动化生产线:多领域电池生产的“智能引擎”

在电池产业蓬勃发展的当下&#xff0c;电池组PACK自动化生产线凭借其高效、精准、智能的优势&#xff0c;成为众多电池生产领域的核心装备。它广泛适用于数码电池、工具电池、储能电池、电动车电池以及动力电池的生产&#xff0c;有力推动了相关产业的升级与发展。 数码电池领…...

生成式AI在编程中的应用场景:从代码生成到安全检测

引言 生成式AI正在深刻改变软件开发的方式&#xff0c;从代码编写到测试、文档和维护&#xff0c;AI技术正在为每个环节带来革命性的变革。本文将深入探讨生成式AI在编程中的主要应用场景&#xff0c;分析其优势与局限性&#xff0c;并展望未来发展趋势。 主要应用场景 1. 代…...

安全牛报告解读《低空经济发展白皮书(3.0)安全体系》

一、概述 《低空经济发展白皮书&#xff08;3.0&#xff09;安全体系》由粤港澳大湾区数字经济研究院&#xff08;IDEA研究院&#xff09;发布&#xff0c;旨在构建低空经济安全发展的系统性框架&#xff0c;解决规模化低空飞行中的安全挑战。核心目标是明确安全体系需覆盖的飞…...

“2W2H”分析方法

“2W2H”是一种常用的分析方法&#xff0c;它通过回答**What&#xff08;是什么&#xff09;、Why&#xff08;为什么&#xff09;、How&#xff08;怎么做&#xff09;、How much&#xff08;多少&#xff09;**这四个问题来全面了解和分析一个事物或问题。这种方法可以帮助你…...

【数据挖掘笔记】兴趣度度量Interest of an association rule

在数据挖掘中&#xff0c;关联规则挖掘是一个重要的任务。兴趣度度量是评估关联规则的重要指标&#xff0c;以下是三个常用的兴趣度度量&#xff1a;支持度、置信度和提升度。 支持度&#xff08;Support&#xff09; 计算方法 支持度表示包含项集的事务占总事务的比例&…...

ArcGIS Pro调用多期历史影像

一、访问World Imagery Wayback&#xff0c;基本在我国范围 如下图&#xff1a; 二、 放大到您感兴趣的区域 三、 查看影像版本信息 点击第二步的按钮后&#xff0c;便可跳转至World Imagery (Wayback 2025-04-24)的相关信息。 四 、点击上图影像版本信息&#xff0c;页面跳转…...

Web3.0:互联网的去中心化未来

随着互联网技术的不断发展&#xff0c;我们正站在一个新时代的门槛上——Web3.0时代。Web3.0不仅仅是一个技术升级&#xff0c;它更是一种全新的互联网理念&#xff0c;旨在通过去中心化技术重塑网络世界。本文将深入探讨Web3.0的核心概念、技术基础、应用场景以及它对未来的深…...

java17

1.常见API之BigDecimal 底层存储方式&#xff1a; 2.如何分辨过时代码&#xff1a; 有横线的代码表示该代码已过时 3.正则表达式之字符串匹配 注意&#xff1a;如果X不是单一字符&#xff0c;需要加[]中括号 注意&#xff1a;1.想要表达正则表达式里面的.需要\\. 2.想要表…...

游戏引擎学习第283天:“让‘Standing-on’成为一个更严谨的概念

如果同时使用多个OpenGL上下文&#xff0c;并且它们都有工作负载&#xff0c;GPU或GPU驱动程序如何决定调度这些工作&#xff1f;我注意到Windows似乎优先处理活动窗口的OpenGL上下文&#xff08;即活动窗口表现更好&#xff09;&#xff0c;挺有意思的…… 当多个OpenGL上下文…...

小白上手RPM包制作

目录 rpm常用命令 安装环境-Ruby 安装环境-fpm 关于服务器 打包-打包二进制工程 .fpm配置文件 打包-打没有文件的包 RPM 包微调 命令行参数 fpm --help RPM 签名 打包-制作NGINX的RPM包 关于rpmbuild 简单使用 打包之前的准备工作 rpmbuild 打包 - sniproxy …...

电商热销榜的5种实现方案

文章目录 1. MySQL 聚合查询&#xff1a;传统统计法2. Redis Sorted Set&#xff1a;内存排行榜3. Elasticsearch 实时聚合&#xff1a;搜索专家4. 缓存异步更新&#xff1a;榜单的幕后推手5. 大数据离线批处理&#xff1a;夜间魔法师 博主介绍&#xff1a;全网粉丝10w、CSDN合…...

车载诊断进阶篇 --- 车载诊断概念

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 钝感力的“钝”,不是木讷、迟钝,而是直面困境的韧劲和耐力,是面对外界噪音的通透淡然。 生活中有两种人,一种人格外在意别人的眼光;另一种人无论…...

AD 多层线路及装配图PDF的输出

装配图的输出&#xff1a; 1.点开‘智能PDF’ 2. 设置显示顶层&#xff1a; 设置显示底层&#xff1a; 多层线路的输出 同样使用‘智能PDF’...

FramePack - 开源 AI 视频生成工具

&#x1f3ac; 项目简介 由开发者 lllyasviel 创建的一个轻量级动画帧处理工具库&#xff0c;专门用于游戏开发、动画制作和视频处理中的帧序列打包与管理。该项目采用高效的算法实现&#xff0c;能够显著提升动画资源的处理效率。 此 AI 视频生成项目&#xff0c;旨在通过低显…...

“this”这个关键字

一、什么是“this”&#xff1f; 简单来说&#xff0c;“this”是每个非静态成员函数隐含的指针&#xff0c;它指向调用该成员函数的那个对象本身。 换句话说&#xff0c;当你调用对象的方法时&#xff0c;编译器会自动传入一个指针&#xff0c;指向你调用的“那个对象”&…...

问题处理——在ROS2(humble)+Gazebo+rqt下,无法显示仿真无人机的相机图像

文章目录 前言一、问题展示二、解决方法&#xff1a;1.下载对应版本的PX42.下载对应版本的Gazebo3.启动 总结 前言 在ROS2的环境下&#xff0c;进行无人机仿真的过程中&#xff0c;有时需要调取无人机的相机图像信息&#xff0c;但是使用rqt&#xff0c;却发现相机图像无法显示…...

广度和深度优先搜索(BFS和DFS)

1. 广度和深度优先搜索&#xff08;BFS和DFS&#xff09; 1.1. Python实现BFS和DFS from collections import dequeclass Graph:"""无向图类&#xff0c;支持添加边&#xff0c;并实现了 BFS&#xff08;广度优先搜索&#xff09;和 DFS&#xff08;深度优先搜…...

React和Vue在前端开发中, 通常选择哪一个

React和Vue的选择需结合具体需求&#xff1a; 选React的场景 大型企业级应用&#xff0c;需处理复杂状态&#xff08;如电商、社交平台&#xff09;团队熟悉JavaScript&#xff0c;已有React技术栈积累需要高度灵活的架构&#xff08;React仅专注视图层&#xff0c;可自由搭配…...

Vue3学习(组合式API——reactive()和ref()函数详解)

目录 一、reactive()函数。 &#xff08;1&#xff09;介绍与使用。 &#xff08;2&#xff09;简单案例演示。 二、ref()函数。 &#xff08;1&#xff09;介绍与使用。 &#xff08;2&#xff09;简单案例演示。 <1>ref()函数获取响应式对象的本质与底层。 <2>基…...

数据结构 -- 树形查找(一)二叉排序树

二叉排序树 二叉排序树的定义 二叉排序树&#xff0c;又称二叉查找树 一棵二叉树或者是空二叉树&#xff0c;或者是具有以下性质的二叉树&#xff1a; 左子树上所有结点的关键字均小于根结点的关键字 右子树上所有结点的关键字均大于根结点的关键字 左子树和右子树又各是…...

【实战教程】从零实现DeepSeek AI多专家协作系统 - Spring Boot+React打造AI专家团队协作平台

&#x1f680; 本项目是DeepSeek大模型应用系列的V3版本&#xff0c;基于V1和V2版本的功能进行全面升级&#xff0c;引入了多智能体协作机制&#xff01; 系列教程推荐阅读顺序&#xff1a; 【V1版本】零基础搭建DeepSeek大模型聊天系统 - Spring BootReact完整开发指南【V2版本…...

React事件机制

React事件机制 React 的事件机制是其实现高效、跨浏览器交互的核心系统&#xff0c;它通过 合成事件&#xff08;SyntheticEvent&#xff09;、事件委托&#xff08;Event Delegation&#xff09;、事件冒泡&#xff08;Bubbling&#xff09; 和 事件派发&#xff08;Dispatch…...

LeetCode 45. 跳跃游戏 II(中等)

给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向后跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处: 0 < j < nums[i] i j < n 返回到达 nums[n - 1] 的最…...

LeetCode 热题 100 437. 路径总和 III

LeetCode 热题 100 | 437. 路径总和 III 大家好&#xff0c;今天我们来解决一道经典的二叉树问题——路径总和 III。这道题在 LeetCode 上被标记为中等难度&#xff0c;要求计算二叉树中节点值之和等于给定目标值 targetSum 的路径数目。 问题描述 给定一个二叉树的根节点 ro…...

力扣.1471数组的k个最强值,力扣.1471数组的k个最强值力扣1576.替换所有的问号力扣1419.数青蛙​编辑力扣300.最长递增子序列

目录 力扣.1471数组的k个最强值 力扣1576.替换所有的问号 力扣1419.数青蛙​编辑 力扣300.最长递增子序列 力扣.1471数组的k个最强值 class Solution {public static int[] getStrongest(int[] arr,int k) {if(karr.length){return arr;}int []retnew int[k];int narr.lengt…...

使用itextsharp5.0版本来合并多个pdf文件并保留书签目录结构

using System; using System.Collections.Generic; using System.IO; using iTextSharp.text; using iTextSharp.text.pdf;public class PdfMergeUtility {/// <summary>/// 合并多个PDF文件并保留书签目录结构/// </summary>/// <param name"inputFiles&q…...

2025-5-15Vue3快速上手

1、setup和选项式API之间的关系 (1)vue2中的data,methods可以与vue3的setup共存 &#xff08;2&#xff09;vue2中的data可以用this读取setup中的数据&#xff0c;但是反过来不行&#xff0c;因为setup中的this是undefined &#xff08;3&#xff09;不建议vue2和vue3的语法混用…...

Kafka消费者分组机制深度解析

一、集群协调者 1.1 GroupCoordinator的元数据管理 每个Broker内置的GroupCoordinator实例通过哈希算法确定消费者组的归属权。其内存模型维护三个核心数据结构&#xff1a; 成员注册表&#xff1a;采用跳表结构存储消费者ID与心跳时间戳&#xff0c;支持快速查询和过期检测…...

Python 类变量与实例变量完全指南:区别、使用场景及常见陷阱

类变量与实例变量的区别总结 代码示例 class Example:class_var "我是类变量&#xff0c;所有实例共享我" # 类变量def __init__(self, name):self.name name # 实例变量&#xff0c;每个实例独有def modify_class_var(self, new_value):Example.class_var ne…...

Ubuntu Linux bash的相关默认配置文件内容 .profile .bashrc, /etc/profile, /etc/bash.bashrc等

文章目录 文件的source顺序/etc/profile&#xff1a;系统级配置/etc/bash.bashrc&#xff1a;bash终端的系统级配置~/.profile&#xff1a;用户级配置~/.bashrc bash&#xff1a;终端的主要配置~/.bash_logout&#xff1a;bash终端登出时清理 建议的额外配置&#xff1a; 安装 …...

redis解决常见的秒杀问题

title: redis解决常见的秒杀问题 date: 2025-03-07 14:24:13 tags: redis categories: redis的应用 秒杀问题 每个店铺都可以发布优惠券&#xff0c;保存到 tb_voucher 表中&#xff1b;当用户抢购时&#xff0c;生成订单并保存到 tb_voucher_order 表中。 订单表如果使用数据…...

Springboot3自定义starter笔记

场景&#xff1a;抽取聊天机器人场景&#xff0c;它可以打招呼。 效果&#xff1a;任何项目导入此 starter 都具有打招呼功能&#xff0c;并且问候语中的人名需要可以在配置文件中修改。 创建自定义 starter 项目&#xff0c;引入 spring-boot-starter 基础依赖。 <dependen…...