CMake使用CPack制作安装程序
CPack的功能很强大,笔者前面有一博文使用CMake的CPack工具打包项目介绍了一下使用CPack来打包成7z
压缩文件,不仅如此,它还可以生成各平台的安装包。
CPack支持以下类型的生成器:
名称 | 文件类型 | 平台及说明 |
---|---|---|
STGZ | STGZ(.sh) | 自解压文件,支持shell脚本的平台 |
7Z | 7zip(.7z) | 跨平台 |
ZIP | ZIP(.zip) | 跨平台 |
TGZ | TGZ(.tar.gz) | 跨平台 |
TXZ | TXZ(.tar.xz) | 跨平台 |
TBZ2 | TBZ2(.tar.bz2) | 跨平台 |
TZ | TZ(.tar) | 跨平台 |
TZST | TZST(.tar.zst) | 跨平台 |
RPM | RPM(.rpm) | Linux,用于redhat系产品 |
DEB | DEB(.deb) | Linux,用于Debian, ubuntu系列产品 |
DragNDrop | DMG(.dmg) | macOS |
productbuild | PKG(.pkg) | macOS |
Bundle | Bundle(.bundle) | macOS |
NSIS | Binary(.exe) | Windows |
INNOSETUP | Binary(.exe) | Windows |
NuGet | NuGet(.nupkg) | Windows |
WIX | MSI(.msi) | Windows |
IFW | Binary | Linux, Windows, macOS,使用QtIFW编译器生成 |
External | JSON(.json) | 与外部打包工具集成 |
FreeBSD | PKG(pkg) | BSD,Linux, OSX |
本文就介绍一下如何使用CPack来制作各个主流平台的应用程序安装程序。
关于CPack的知识,可以参考https://cmake.org/cmake/help/latest/module/CPack.html
一、Linux
1. RPM
RPM安装包格式适用于red hat
出品的系统RHEL
以及centos
。
安装rpmbuild
要制作RPM包,必须要先安装rpmbuild
命令。
在ubuntu
下使用下面的命令安装:
sudo apt install rpm
安装后既可以使用rpm
命令,也可以使用rpmbuild
命令。
如果是CentOS系统,默认是有rpm
命令的,需要使用下面的命令单独安装rpmbuild
。
yum install rpm-build
CMakeLists.txt设置
#设置安装规则
install(TARGETS ${PROJECT_NAME} DESTINATION /usr/local/bin)
#设置CPack生成器为RPM
set(CPACK_GENERATOR "RPM")
#设置CPack项目名称
set(CPACK_PROJECT_NAME ${PROJECT_NAME})
#设置CPack项目版本
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
#必须包含CPack的cmake文件
include(CPack)
2. DEB
DEB格式适用于Debian
以及Ubuntu
系统。CMakeLists.txt设置:
#设置安装规则
install(TARGETS ${PROJECT_NAME} DESTINATION /usr/local/bin)
# DEB要求设置`CPACK_PACKAGE_CONTACT`或者`CPACK_DEBIAN_PACKAGE_MAINTAINER`变量
set(CPACK_PACKAGE_CONTACT "witton@163.com")
#设置CPack生成器为RPM
set(CPACK_GENERATOR "DEB")
#设置CPack项目名称
set(CPACK_PROJECT_NAME ${PROJECT_NAME})
#设置CPack项目版本
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
#必须包含CPack的cmake文件
include(CPack)
生成好DEB格式后,可以使用apt命令安装:
sudo apt install ./demo-0.1.0-Linux.deb
如果想要生成多种安装包格式,可以在CPACK_GENERATOR
变量中填写多个,以分号隔开:
set(CPACK_GENERATOR "DEB;RPM")
二、MacOS
macOS下制作安装包,稍麻烦一点,最主要的问题是动态库的搜索路径问题,在Linux下可以使用ldconfig进行配置,但是MacOS下没有这样的工具,虽然有环境变量DYLD_LIBRARY_PATH
或 DYLD_FALLBACK_LIBRARY_PATH
可以设置,但是如果生成程序的时候rpath
没有设置为@rpath
开头的路径,而是使用的绝对路径,就是灾难。
所以在生成程序时,最好是设置程序的动态库路径为@rpath
开头的路径。有关MacOS程序的@rpath
、@loader_path
、@executable_path
可以在网络上搜索相关资料。
这里我们以一个实例来讲,更好理解。下面为t
项目结构:
有一个lib
库,提供了一个函数foo
,供main.cc
调用,lib.h
与priv.h
分别为lib库的公开头文件与私有头文件。
lib/lib.cc
:
#include <iostream>
using namespace std;void foo() {cout << "foo" << endl;
}
lib/lib.h
:
#ifndef __LIB__H__
#define __LIB__H__#include "priv/priv.h"void foo();#endif //__LIB__H__
lib/priv/priv.h
:
#pragma once#ifndef __LIB__H__
#error 私有头文件不能直接包含,需要include `lib.h`
#endif// 这是私有头文件
为了展示动态库和静态的安装,这里把lib
库,既编译成动态库,也编译成静态库:
lib/CMakeLists.txt
:
cmake_minimum_required(VERSION 3.25.0)
project(tlib VERSION 0.1.0)add_library(${PROJECT_NAME} SHARED lib.cc)
add_library(${PROJECT_NAME}s lib.cc)#设置库的公开头文件,注意,这里一定要加上${CMAKE_CURRENT_SOURCE_DIR},不然安装时会找不到文件
set_target_properties(${PROJECT_NAME} PROPERTIES PUBLIC_HEADER ${CMAKE_CURRENT_SOURCE_DIR}/lib.h)
#设置库的私有头文件
set_target_properties(${PROJECT_NAME} PROPERTIES PRIVATE_HEADER ${CMAKE_CURRENT_SOURCE_DIR}/priv/priv.h)
main.cc
:
#include <stdio.h>
#include <stdlib.h>
#include "lib.h"int main(int argc, char *argv[])
{foo();return 0;
}
CMakeLists.txt
:
cmake_minimum_required(VERSION 3.25.0)
project(t VERSION 0.1.0)add_subdirectory(lib)
aux_source_directory(. SRC)add_executable(${PROJECT_NAME} ${SRC})
target_include_directories(${PROJECT_NAME} PUBLIC lib)
target_link_libraries(${PROJECT_NAME} tlib)#设置安装规则
install(TARGETS ${PROJECT_NAME} tlib tlibsARCHIVE DESTINATION ${PROJECT_NAME}/lib #静态库,macOS中标记为“FRAMEWORK”除外LIBRARY DESTINATION ${PROJECT_NAME}/lib #动态库,macOS中标记为“FRAMEWORK”除外RUNTIME DESTINATION ${PROJECT_NAME}/bin #可执行文件,macOS中标记为“MACOSX_BUNDLE”除外FRAMEWORK DESTINATION ${PROJECT_NAME}/framework # 在 macOS上,标有“FRAMEWORK”属性的静态库和共享库都被视为“FRAMEWORK”目标。PUBLIC_HEADER DESTINATION ${PROJECT_NAME}/include # 与库关联的任何公开头文件PRIVATE_HEADER DESTINATION ${PROJECT_NAME}/include/priv # 与库关联的任何私有头文件
)
我们期望最终制作的安装包,安装后的结构:
1. dmg
为了制作dmg
格式的安装包,CMakeLists.txt
文件中添加
# 需要设置`${PROJECT_NAME}`目标的属性`INSTALL_RPATH`为`@loader_path/../lib`,
# 即安装后的运行时路径为`@loader_path/../lib`,@loader_path是重点,
# 是相对于可执行文件的路径,否则会出现找不到`libtlib.dylib`库。
# 可以设置多个路径,在后面直接添加即可,比如再添加`/usr/local/lib`
set_property(TARGET ${PROJECT_NAME}PROPERTYINSTALL_RPATH"@loader_path/../lib""/usr/local/lib"
)
# 设置CPACK的生成器类型为`DragNDrop`
set(CPACK_GENERATOR DragNDrop)
#设置CPack的项目名
set(CPACK_PROJECT_NAME ${PROJECT_NAME})
#设置CPack的项目版本号
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
#必须包含CPack
include(CPack)
执行CPack打包命令后,会生成t-0.1.0-Darwin.dmg
安装包,在MacOS系统中双击加载后好即可拖曳安装了,与其它DMG
安装包一样。
拖曳安装好后,执行:
使用otool -L ./t
命令来查看依赖:
使用otool -l ./t
命令来查看rpath
:
完整的CMakeLists.txt
:
cmake_minimum_required(VERSION 3.25.0)
project(t VERSION 0.1.0)add_subdirectory(lib)aux_source_directory(. SRC)add_executable(${PROJECT_NAME} ${SRC})
target_include_directories(${PROJECT_NAME} PUBLIC lib)
target_link_libraries(${PROJECT_NAME} tlib)#设置安装规则
install(TARGETS ${PROJECT_NAME} tlib tlibsARCHIVE DESTINATION ${PROJECT_NAME}/lib #静态库,macOS中标记为“FRAMEWORK”除外LIBRARY DESTINATION ${PROJECT_NAME}/lib #动态库,macOS中标记为“FRAMEWORK”除外RUNTIME DESTINATION ${PROJECT_NAME}/bin #可执行文件,macOS中标记为“MACOSX_BUNDLE”除外FRAMEWORK DESTINATION ${PROJECT_NAME}/framework # 在 macOS上,标有“FRAMEWORK”属性的静态库和共享库都被视为“FRAMEWORK”目标。PUBLIC_HEADER DESTINATION ${PROJECT_NAME}/include # 与库关联的任何公开头文件PRIVATE_HEADER DESTINATION ${PROJECT_NAME}/include/priv # 与库关联的任何私有头文件
)
# 需要设置`${PROJECT_NAME}`目标的属性`INSTALL_RPATH`为`@loader_path/../lib`,
# 即安装后的运行时路径为`@loader_path/../lib`,@loader_path是重点,
# 是相对于可执行文件的路径,否则会出现找不到`libtlib.dylib`库。
# 可以设置多个路径,在后面直接添加即可,比如再添加`/usr/local/lib`
set_property(TARGET ${PROJECT_NAME}PROPERTYINSTALL_RPATH"@loader_path/../lib""/usr/local/lib"
)# 设置CPACK的生成器类型为`DragNDrop`
set(CPACK_GENERATOR DragNDrop)
#设置CPack的项目名
set(CPACK_PROJECT_NAME ${PROJECT_NAME})
#设置CPack的项目版本号
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
#必须包含CPack
include(CPack)
2. pkg
CPack生成器productbuild
可以生成macOS下的pkg
安装包。
将前面的CPACK_GENERATOR
改为productbuild
,再使用cpack_add_component(${PROJECT_NAME} REQUIRED)
添加进组件即可生成一个简单的安装包,如果没有使用cpack_add_component(${PROJECT_NAME} REQUIRED)
添加组件,只会生成一个空包。
完整的CMakeLists.txt
:
cmake_minimum_required(VERSION 3.25.0)
project(t VERSION 0.1.0)add_subdirectory(lib)aux_source_directory(. SRC)add_executable(${PROJECT_NAME} ${SRC})
target_include_directories(${PROJECT_NAME} PUBLIC lib)
target_link_libraries(${PROJECT_NAME} tlib)#设置安装规则
install(TARGETS ${PROJECT_NAME} tlib tlibsARCHIVE DESTINATION ${PROJECT_NAME}/lib #静态库,macOS中标记为“FRAMEWORK”除外LIBRARY DESTINATION ${PROJECT_NAME}/lib #动态库,macOS中标记为“FRAMEWORK”除外RUNTIME DESTINATION ${PROJECT_NAME}/bin #可执行文件,macOS中标记为“MACOSX_BUNDLE”除外FRAMEWORK DESTINATION ${PROJECT_NAME}/framework # 在 macOS上,标有“FRAMEWORK”属性的静态库和共享库都被视为“FRAMEWORK”目标。PUBLIC_HEADER DESTINATION ${PROJECT_NAME}/include # 与库关联的任何公开头文件PRIVATE_HEADER DESTINATION ${PROJECT_NAME}/include/priv # 与库关联的任何私有头文件
)
# 需要设置`${PROJECT_NAME}`目标的属性`INSTALL_RPATH`为`@loader_path/../lib`,
# 即安装后的运行时路径为`@loader_path/../lib`,@loader_path是重点,
# 是相对于可执行文件的路径,否则会出现找不到`libtlib.dylib`库。
# 可以设置多个路径,在后面直接添加即可,比如再添加`/usr/local/lib`
set_property(TARGET ${PROJECT_NAME}PROPERTYINSTALL_RPATH"@loader_path/../lib""/usr/local/lib"
)# 设置CPACK的生成器类型为`productbuild`
set(CPACK_GENERATOR productbuild)
#设置CPack的项目名
set(CPACK_PROJECT_NAME ${PROJECT_NAME})
#设置CPack的项目版本号
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
#必须包含CPack
include(CPack)
#这里必须使用cpack_add_component命令添加组件,否则只会生成一个空包
cpack_add_component(${PROJECT_NAME} REQUIRED)
安装情况如下所示:
默认情况下,介绍
,请先阅读
,许可
三个页面的内容是CPack的模板内容,是三个txt
文本文件,需要自定义一下,可以使用html文件。在项目根目录添加一个res
目录,把所有自定义的CPack安装模板放在里面,现在目录树:
welcome.html
:
<html><head><meta charset="utf-8"></head><body><h1>欢迎使用macOS软件t</h1></body>
</html>
readme.html
:
<html><head><meta charset="utf-8"></head><body><h1>读一下我吧!</h1></body>
</html>
license.html
:
<html><head><meta charset="utf-8"></head><body><h1>版权所有(C),Witton Bell</h1></body>
</html>
CMakeLists.txt
设置:
set(CPACK_RESOURCE_FILE_WELCOME "${CMAKE_SOURCE_DIR}/res/welcome.html")
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/res/license.html")
set(CPACK_RESOURCE_FILE_README "${CMAKE_SOURCE_DIR}/res/readMe.html")# 设置CPACK的生成器类型为`productbuild`
set(CPACK_GENERATOR productbuild)
#设置CPack的项目名
set(CPACK_PROJECT_NAME ${PROJECT_NAME})
#设置CPack的项目版本号
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
#必须包含CPack
include(CPack)
cpack_add_component(${PROJECT_NAME} REQUIRED)
现在生成的安装包,运行如下所示:
三、Windows
Window下介绍一下NSIS/NSIS64
,它是一个开源的安装包制作工具。
使用nsis软件来制作安装包,需要先下载nsis并安装。
设置CPack的生成器为NSIS
或者NSIS64
,该安装程序的许可证是UTF16编码格式的文本。
CMakeLists.txt
设置:
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/res/license.txt")# 设置CPACK的生成器类型为`NSIS64`
set(CPACK_GENERATOR NSIS64)
#设置CPack的项目名
set(CPACK_PROJECT_NAME ${PROJECT_NAME})
#设置CPack的项目版本号
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
#必须包含CPack
include(CPack)
它有一些特殊的变量,可以自定义安装界面的一些显示,具体参见:https://cmake-doc.readthedocs.io/zh-cn/latest/cpack_gen/nsis.html
NSIS软件可以做很多定制,感兴趣的读者可以继续深究!
四、自解压安装包
自解压安装包是使用的shell脚本作为安装程序的,它的CMakeLists.txt
设置:
#设置许可证文本的文件,而不是内容
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/res/license.txt")
# 设置CPACK的生成器类型
set(CPACK_GENERATOR "STGZ")
#设置CPack的项目名
set(CPACK_PROJECT_NAME ${PROJECT_NAME})
#设置CPack的项目版本号
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
set(CPACK_PACKAGE_VENDOR "Witton Bell")
#必须包含CPack
include(CPack)
实际上它是根据CMake安装目录下share/cmake/Modules/Internal/CPack/CPack.STGZ_Header.sh.in
的模板文件来生成的。
它主要可以定制以下变量:
- CPACK_PACKAGE_NAME:包名
- CPACK_PACKAGE_VERSION:包版本
- CPACK_PACKAGE_VENDOR:包所有者
- CPACK_RESOURCE_FILE_LICENSE_CONTENT:直接设置许可证内容
如果想要定制更多内容,可以修改CPack.STGZ_Header.sh.in
模板文件的内容。
如果对你有帮助,欢迎点赞收藏!
相关文章:
CMake使用CPack制作安装程序
CPack的功能很强大,笔者前面有一博文使用CMake的CPack工具打包项目介绍了一下使用CPack来打包成7z压缩文件,不仅如此,它还可以生成各平台的安装包。 CPack支持以下类型的生成器: 名称文件类型平台及说明STGZSTGZ(.sh)自解压文件…...
Flink运行时架构
一、系统架构 1)作业管理器(JobManager) JobManager是一个Flink集群中任务管理和调度的核心,是控制应用执行的主进程。也就是说,每个应用都应该被唯一的JobManager所控制执行。 JobManger又包含3个不同的组件。 &am…...
平衡二叉树(力扣110)
所谓平衡二叉树,就是每一个节点的左右子树的高度差不大于1。而一个子树的高度,就是父节点的最大高度。这道题的思路其实和二叉树的最大深度(力扣104)-CSDN博客有很大的相似之处,都需要将左右子树的高度返回给父节点,因此也是采用后…...
【玩转全栈】---基于YOLO8的图片、视频目标检测
本篇主要讲YOLO8的具体操作,想要了解YOLO的具体原理,可以去官网查询 目录 下载ultralytics库 开始检测 介绍 YOLOv8(You Only Look Once Version 8)是 YOLO 系列的最新版本,由 Ultralytics 开发并发布,是一…...
ES6+新特性,var、let 和 const 的区别
在 JavaScript 中,var、let 和 const 都用于声明变量,但它们有一些重要的区别,主要体现在 作用域、可变性和提升机制 等方面。 1. 作用域(Scope) var: var 声明的变量是 函数作用域,也就是说,它…...
汇编实验·分支程序设计
一、实验目的: 1.能够熟练的进行分支程序的编写,掌握条件语句对应的汇编语言指令的实现 2.掌握多个条件的分支语句的实现原理,理解C语言中的逻辑运算“短路”特征 二、实验内容 1.对2和3任务中的C代码在VS2022中运行,设置生成对应的汇编代码,观察生成代码的不同,着重…...
激光线扫相机无2D图像的标定方案
方案一:基于运动控制平台的标定 适用场景:若激光线扫相机安装在可控运动平台(如机械臂、平移台、旋转台)上,且平台的运动精度已知(例如通过编码器或高精度步进电机控制)。 步骤: 标…...
【Python・机器学习】多元回归模型(原理及代码)
前言 自学笔记,分享给语言学/语言教育学方向的,但对语言数据处理感兴趣但是尚未入门,却需要在论文中用到的小伙伴,欢迎大佬们补充或绕道。ps:本文最少限度涉及公式讲解(文科生小白友好体质)&am…...
ubuntu20.04安装使用direct_visual_lidar_calibration标定雷达和相机
官方链接GitHub - koide3/direct_visual_lidar_calibration: A toolbox for target-less LiDAR-camera calibration [ROS1/ROS2] 官方安装方式 Installation - direct_visual_lidar_calibration 安装依赖 sudo apt install libomp-dev libboost-all-dev libglm-dev libglfw…...
Android 自定义View时四个构造函数使用详解
该文章我们以自定义View继承TextView为例来讲解 创建自定义View命名MyTextView,并使其继承TextView 1、自定义View时第一个构造函数 // 第一个构造函数主要是在Java代码中声明一个MyTextView时所用 // 类似这种(MyTextView myTextViewnew MyTextView(this);) // 不…...
linux中关闭服务的开机自启动
引言 systemctl 是 Linux 系统中用于管理 systemd 服务的命令行工具。它可以用来启动、停止、重启服务,管理服务的开机自启动,以及查看服务的状态等。 什么是 systemd? systemd 是现代 Linux 发行版中默认的 初始化系统(init sys…...
【go语言】go的卸载与安装
一、卸载go sudo rm -rf /usr/local/go sudo apt-get remove golang sudo apt-get remove golang-go sudo apt-get autoremove wget https://dl.google.com/go/go1.19.linux-amd64.tar.gz sudo tar -xzf go1.19.linux-amd64.tar.gz -C /usr/local go env -w GOPROXY"http…...
微软Win10 RP 19045.5435(KB5050081)预览版发布!
系统之家1月20日最新报道,微软面向Release Preview频道的Windows Insider项目成员,发布了适用于Windows10 22H2版本的KB5050081更新,更新后系统版本号将升至19045.5435。本次更新增加了对GB18030-2022标准的支持,同时新版日历将为…...
VUE elTree 无子级 隐藏展开图标
这4个并没有下级节点,即它并不是叶子节点,就不需求展示前面的三角展开图标! 查阅官方文档如下描述,支持bool和函数回调处理,这里咱们选择更灵活的函数回调实现。 给el-tree结构配置一下props,注意! :pr…...
python实现代理服务器转换
使用 http.server 模块和 requests 库来实现,代理服务器可拦截匹配指定路径的 HTTP 请求,并打印或存储请求头和响应体。 实现目标: 1、创建一个HTTP代理服务器。 2、代理所有流量,而对指定的接口(如 /api/target&#…...
计算机网络三张表(ARP表、MAC表、路由表)总结
参考: 网络三张表:ARP表, MAC表, 路由表,实现你的网络自由!!_mac表、arp表、路由表-CSDN博客 网络中的三张表:ARP表、MAC表、路由表 首先要明确一件事,如果一个主机要发送数据,那么必…...
Dangerzone:免费的危险的文件转换安全程序
我们知道很多杀毒软件会将很多文件视作恶意程序,尤其是带宏病毒的DOC文件,直接删除难免会带来不必要的麻烦,那么推荐一款免费的危险的文件转换安全程序:Dangerzone 。它可以检查各种可能有危险的文件并将其转换为安全版本…...
2025/1/21 学习Vue的第四天
睡觉。 --------------------------------------------------------------------------------------------------------------------------------- 11.Object.defineProperty 1.在我们之前学习JS的时候,普通得定义一个对象与属性。 <!DOCTYPE html> <h…...
【IEEE Fellow 主讲报告| EI检索稳定】第五届机器学习与智能系统工程国际学术会议(MLISE 2025)
重要信息 会议时间地点:2025年6月13-15日 中国深圳 会议官网:http://mlise.org EI Compendex/Scopus稳定检索 会议简介 第五届机器学习与智能系统工程国际学术会议将于6月13-15日在中国深圳隆重召开。本次会议旨在搭建一个顶尖的学术交流平台…...
如何使用虚拟现实技术有效提升模拟训练效率
虚拟现实(VR)技术在模拟训练中的应用正逐步展现其巨大的潜力,通过提供高度沉浸式的体验、灵活的训练场景和精准的数据分析,显著提升训练效率。本文将结合Varjo XR-4头显、Techviz多通道显示软件、Senseglove虚拟现实手套等具体案例…...
OpenEuler学习笔记(十一):OpenEuler上搭建LAMP环境
LAMP环境指的是Linux、Apache、MySQL(或MariaDB)和PHP的组合,下面为你介绍在OpenEuler上搭建LAMP环境的详细步骤: 1. 系统更新 首先要更新系统中的软件包,保证系统处于最新状态。 sudo dnf update -y2. 安装Apache…...
Anaconda安装(2024最新版)
安装新的anaconda需要卸载干净上一个版本的anaconda,不然可能会在新版本安装过程或者后续使用过程中出错,完全卸载干净anaconda的方法,可以参考我的博客! 第一步:下载anaconda安装包 官网:Anaconda | The O…...
【玩转全栈】----YOLO8训练自己的模型并应用
继上篇: 【玩转全栈】---基于YOLO8的图片、视频目标检测-CSDN博客 相信大家已经可以训练一些图片和视频了,接下来我将为大家介绍如何训练自己的特定模型,并用其进行检测 目录 准备数据 图片数据 标识数据 配置文件 运行 测试训练结果 存在的问…...
计算机视觉算法实战——无人机检测
✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ 1. 引言✨✨ 随着无人机技术的快速发展,无人机在农业、物流、监控等领域的应用越来越广泛。然而,无人机的滥用也带…...
css粘性定位超出指定宽度失效问题
展示效果 解决办法:外层容器添加display:grid即可 完整代码 <template><div class"box"><div class"line" v-for"items in 10"><div class"item" v-for"item in 8">drgg</div>&…...
⽤vector数组实现树的存储(孩⼦表示法)c++
在我们遇到的算法题中, ⼀般给出的树结构都是有编号的,这样会简化我们之后存储树的操作 ,⼀般提供两个信息; 结点的个数 n;n-1条x结点与y结点相连的边 题⽬描述: ⼀共9个结点셈 1号结点为根节点,接下来8⾏ÿ…...
高级java每日一道面试题-2025年01月23日-数据库篇-主键与索引有什么区别 ?
如果有遗漏,评论区告诉我进行补充 面试官: 主键与索引有什么区别 ? 我回答: 一、主键(Primary Key) 1. 定义 主键是关系型数据库中的一条记录中的某个属性组(可以是一个字段或多个字段的组合),用于唯一标识一条记…...
spring aop 中 返回值
使用环绕切面 Around(value "requsetInterceptor()")public Object logExectionTime(ProceedingJoinPoint joinPoint) throws Throwable {logger.info("-------logExectionTime--------");if(isRun){Object proceed joinPoint.proceed(); // 执行目标方…...
总结7。。
二叉树的遍历是指按某条搜索路径访问树中的每个结点,使得每个结点均被访问一次,而且仅能访问一次(说明不可二次访问,一遍而过)。遍历一颗二叉树便要决定对根结点N、左子树L和右子树的访问顺序。 二叉树常的的遍历方法有…...
9.中断系统、EXTI外部中断
中断系统原理 中断 中断系统是管理和执行中断的逻辑结构,外部中断是众多能产生中断的外设之一,所以本节我们就借助外部中断来学习一下中断系统。在以后学习其它外设的时候,也是会经常和中断打交道的。 中断:在主程序运行过程中…...
【软件测试项目实战 】淘宝网:商品购买功能测试
一、用例设计方法分析 在对淘宝网商品下单功能进行测试时,不同的测试角度和场景适合运用不同的用例设计方法,以下是针对该功能各方面测试所适用方法及其原因的分析: 商品数量相关测试:对于商品数量的测试,主要采用等…...
TangoFlux 本地部署实用教程:开启无限音频创意脑洞
一、介绍 TangoFlux是通过流匹配和 Clap-Ranked 首选项优化,实现超快速、忠实的文本到音频生成的模型。 本模型由 Stability AI 提供支持🚀 TangoFlux 可以在单个 A40 GPU 上在 ~3 秒内生成长达 34.1kHz 的立体声音频。 二、部署 安装方式非常简单 1…...
Android多语言开发自动化生成工具
在做 Android 开发的过程中,经常会遇到多语言开发的场景,尤其在车载项目中,多语言开发更为常见。对应多语言开发,通常都是在中文版本的基础上开发其他国家语言,这里我们会拿到中-外语言对照表,这里的工作难…...
Mac cursor设置jdk、Maven版本
基本配置 – Cursor 使用文档 首先是系统用户级别的设置参数,运行cursor,按下ctrlshiftp,输入Open User Settings(JSON),在弹出的下拉菜单中选中下面这样的: 在打开的json编辑器中追加下面的内容: {"…...
Unity中在UI上画线
在UI中画一条曲线 我封装了一个组件,可以实现基本的画线需求. 效果 按住鼠标左键随手一画. 用起来也很简单,将组件挂到空物体上就行了,红色的背景是Panel. 你可以将该组件理解为一个Image,只不过形状更灵活一些罢了,所以它要放在下面的层级(不然可能会被挡住). 代码 可以…...
Unity中关于实现 管道水流+瀑布流动+大肠蠕动效果笔记
Unity中关于实现 管道水流瀑布流动大肠蠕动效果笔记 效果展示: 参考资料及链接: 1、如何在 Unity 中创建水效果 - 水弯曲教程 https://www.youtube.com/watch?v3CcWus6d_B8 关于补充个人技能中:顶点噪波影响网格着色器配合粒子实现水特效 …...
【ARTS】【LeetCode-704】二分查找算法
目录 前言 什么是ARTS? 算法 力扣704题 二分查找 基本思想: 二分查找算法(递归的方式): 经典写法(找单值): 代码分析: 经典写法(找数组即多个返回值) 代码分析 经典题目 题目描述: 官方题解 深入思考 模版一 (相错终止/左闭右闭) 相等返回情形…...
JavaWeb 学习笔记 XML 和 Json 篇 | 020
今日推荐语 愿你遇见好天气,愿你的征途铺满了星星——圣埃克苏佩里 日期 学习内容 打卡编号2025年01月23日JavaWeb笔记 XML 和 Json 篇020 前言 哈喽,我是菜鸟阿康。 以下是我的学习笔记,既做打卡也做分享,希望对你也有所帮助…...
【LeetCode】--- MySQL刷题集合
1.组合两个表(外连接) select p.firstName,p.lastName,a.city,a.state from Person p left join Address a on p.personId a.personId; 以左边表为基准,去连接右边的表。取两表的交集和左表的全集 2.第二高的薪水 (子查询、if…...
【深度解析Java 20天速成】04_IDEA的安装与使用
【Why IDEA ?】 【注】JetBrains官方说明: 尽管我们采取了多种措施确保受访者的代表性,但结果可能会略微偏向 JetBrains 产品的用户,因为这些用户更有可能参加调查。 此外,2022年,某美国软件开发商在对近千名专业的Ja…...
系统思考—业务协同
最近在和一些客户的沟通中,企业老板都提到一个共同的困惑:每个部门都感觉自己在解决问题,做了正确的事情,但为什么组织的绩效就是没有增长?更糟糕的是,大家都不知道问题到底出在哪里? 在这种情…...
windows安装ES
1. 下载ES 访问ES官网下载Download Elasticsearch | Elastic 2. 配置环境变量 ES_JAVA_HOME : D:\jdk-17.0.9 ES_HOME : D:\elasticsearch-8.17.1-windows-x86_64\elasticsearch-8.17.1 3. 添加一些ES的配置 <1>关闭ES安全认证 打开elasticsearch-8.17.1\config\e…...
[java] java基础-字符串篇
目录 API String 创建字符串对象的两种方式: Java的内存模型 字符串常量池(串池)存放地址 两种构造方法的内存分析 String的常用方法 号比较的是什么 字符串比较(比较字符串的数据值) 遍历字符串 StringBui…...
告别手动编辑:如何用Python快速创建Ansible hosts文件?
在自动化运维领域,Ansible是一款非常强大的工具,它可以帮助我们管理和配置大量的服务器。为了让Ansible能够有效地管理这些服务器,我们需要一个hosts清单文件,该文件定义了Ansible要管理的目标主机。在实际应用中,我们…...
神经网络|(二)sigmoid神经元函数
【1】引言 在前序学习进程中,我们已经了解了基本的二元分类器和神经元的构成,文章学习链接为: 神经网络|(一)加权平均法,感知机和神经元-CSDN博客 在此基础上,我们认识到神经元本身在做二元分类,是一种非…...
DAY6,使用互斥锁 和 信号量分别实现5个线程之间的同步
题目 请使用互斥锁 和 信号量分别实现5个线程之间的同步 代码:信号量实现 void* task1(void* arg); void* task2(void* arg); void* task3(void* arg); void* task4(void* arg); void* task5(void* arg);sem_t sem[5]; //信号量变量int main(int argc, const …...
Redis 集群模式入门
Redis 集群模式入门 一、简介 Redis 有三种集群模式:主从模式、Sentinel 哨兵模式、cluster 分片模式 主从复制(Master-Slave Replication): 在这种模式下,数据可以从一个 Redis 实例(主节点 Master)复…...
计算机网络 (55)流失存储音频/视频
一、定义与特点 定义:流式存储音频/视频是指经过压缩并存储在服务器上的多媒体文件,客户端可以通过互联网边下载边播放这些文件,也称为音频/视频点播。 特点: 边下载边播放:用户无需等待整个文件下载完成即可开始播放…...
vue + element-ui 组件样式缺失导致没有效果
失效 代码: 修改方法: 在main.js文件里面加上: import element-ui/lib/theme-chalk/index.css; 最后:...
在 Windows 11 中为 SMB 3.x 文件共享协议提供 RDMA 支持
注:机翻,未校。 Enable SMB Direct in Windows 11 在 Windows 11 中启用 SMB Direct Provides RDMA support for the SMB 3.x file sharing protocol 为 SMB 3.x 文件共享协议提供 RDMA 支持 Vigneshwaran Vijayakumar November 3, 2024 Last Updat…...