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

cmake之旅(12)

cmake之旅12cmake之旅12CPack 打包与发布1 CPack 是什么2 最简单的 CPack 配置3 配置 CPack3.1 基本信息3.2 选择打包格式4 生成 DEB 包5 生成 RPM 包6 完整示例7 组件化打包8 source 包9 本篇命令速查表10 总结与下一篇预告同系列文章cmake之旅(1):构建的过程cmake之旅(2):CMakeLists.txt 核心语法cmake之旅(3):多目录项目管理cmake之旅(4):静态库与动态库cmake之旅5):函数、宏与 .cmake 模块cmake之旅6查找和使用第三方库cmake之旅7编译选项与条件编译cmake之旅8Modern CMake 与 target 思维cmake之旅9安装与导出cmake之旅10自动化测试与 CTestcmake之旅11交叉编译与工具链文件cmake之旅12CPack 打包与发布cmake之旅12CPack 打包与发布上一篇我们学会了交叉编译让程序可以在不同平台上运行。但把编译好的程序分发给最终用户总不能给他一堆.so文件和一个可执行文件让他自己放到正确的目录里吧。我们需要把项目打包成标准的安装包——Linux 上是.debDebian/Ubuntu或.rpmCentOS/FedoraWindows 上是.exe安装程序或.zipmacOS 上是.dmg。CMake 内置的CPack工具正好解决这个问题。1 CPack 是什么CPack 是 CMake 配套的打包工具。它复用install()命令定义的安装规则把要安装的文件打包成各种格式的安装包。换句话说如果你已经在第九篇中写好了install()规则那 CPack 几乎是零成本使用的——它直接利用已有的安装规则来决定哪些文件需要打包。2 最简单的 CPack 配置在 CMakeLists.txt 的末尾加上两行就行# 引入 CPack 模块必须放在所有 install 命令之后 include(CPack)然后构建并打包mkdirbuildcdbuild cmake..makecpackcpack命令默认会生成一个.tar.gz压缩包和一个.sh自解压脚本。不过默认的配置比较粗糙。我们来看看如何自定义打包行为。3 配置 CPackCPack 的配置通过一系列CPACK_xxx变量来控制。这些变量必须在include(CPack)之前设置。3.1 基本信息# 包的基本信息 set(CPACK_PACKAGE_NAME Calculator) set(CPACK_PACKAGE_VERSION ${PROJECT_VERSION}) set(CPACK_PACKAGE_DESCRIPTION_SUMMARY 一个简单的计算器库) set(CPACK_PACKAGE_VENDOR MyCompany) set(CPACK_PACKAGE_CONTACT devexample.com) # 许可协议文件 set(CPACK_RESOURCE_FILE_LICENSE ${CMAKE_SOURCE_DIR}/LICENSE) # 输出文件名不含后缀 set(CPACK_PACKAGE_FILE_NAME ${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}-${CMAKE_SYSTEM_NAME}) include(CPack)3.2 选择打包格式通过CPACK_GENERATOR指定要生成的包格式# 指定一种或多种打包格式 set(CPACK_GENERATOR TGZ;DEB;RPM)常用的打包格式生成器格式适用系统TGZ.tar.gz通用ZIP.zip通用DEB.debDebian / UbuntuRPM.rpmCentOS / FedoraNSIS.exe 安装程序WindowsWIX.msi 安装程序WindowsDragNDrop.dmgmacOSSTGZ.sh 自解压脚本Linux也可以在命令行中指定cpack-GDEB# 只生成 .deb 包cpack-GZIP# 只生成 .zip 包4 生成 DEB 包Debian/Ubuntu 的.deb包是 Linux 上最常见的安装包格式之一。# DEB 包特有的配置 set(CPACK_DEBIAN_PACKAGE_MAINTAINER Your Name youremail.com) set(CPACK_DEBIAN_PACKAGE_SECTION devel) # 分类 set(CPACK_DEBIAN_PACKAGE_DEPENDS libc6 ( 2.17)) # 运行时依赖 include(CPack)构建并打包cmake..makecpack-GDEB生成的.deb文件可以直接用dpkg安装sudodpkg-iCalculator-1.0.0-Linux.deb安装后可执行文件会出现在/usr/local/bin/库文件出现在/usr/local/lib/头文件出现在/usr/local/include/——这些路径就是你在install()命令中指定的。卸载sudodpkg-rcalculator5 生成 RPM 包CentOS/Fedora 系统使用 RPM 包。需要先安装rpmbuild工具sudoapt-getinstallrpm# Ubuntu 上安装 rpm 工具CMake 配置# RPM 包特有的配置 set(CPACK_RPM_PACKAGE_LICENSE MIT) set(CPACK_RPM_PACKAGE_GROUP Development/Libraries) set(CPACK_RPM_PACKAGE_REQUIRES glibc 2.17) # 运行时依赖 include(CPack)cpack-GRPM6 完整示例我们基于 Calculator 项目写一个完整的支持打包的 CMakeLists.txtcmake_minimum_required(VERSION 3.14) project(Calculator VERSION 1.0.0 LANGUAGES CXX) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED True) include(GNUInstallDirs) # ---- 构建 ---- add_library(calc_lib src/add.cpp src/de.cpp ) target_include_directories(calc_lib PUBLIC $BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include $INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR} ) add_executable(calculator src/main.cpp) target_link_libraries(calculator PRIVATE calc_lib) # ---- 安装 ---- install(TARGETS calc_lib calculator EXPORT CalcLibTargets ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} ) install(DIRECTORY include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} ) # 安装 CMake 配置文件可选供其他 CMake 项目使用 install(EXPORT CalcLibTargets FILE CalcLibTargets.cmake NAMESPACE CalcLib:: DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/CalcLib ) # ---- CPack 打包配置 ---- set(CPACK_PACKAGE_NAME Calculator) set(CPACK_PACKAGE_VERSION ${PROJECT_VERSION}) set(CPACK_PACKAGE_DESCRIPTION_SUMMARY 一个简单的计算器库和工具) set(CPACK_PACKAGE_VENDOR MyCompany) set(CPACK_PACKAGE_CONTACT devexample.com) set(CPACK_RESOURCE_FILE_LICENSE ${CMAKE_SOURCE_DIR}/LICENSE) # 安装路径前缀 set(CPACK_PACKAGING_INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX}) # 输出文件名 set(CPACK_PACKAGE_FILE_NAME ${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}-${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR}) # DEB 配置 set(CPACK_DEBIAN_PACKAGE_MAINTAINER devexample.com) set(CPACK_DEBIAN_PACKAGE_SECTION devel) # RPM 配置 set(CPACK_RPM_PACKAGE_LICENSE MIT) # 引入 CPack必须在所有 CPACK_ 变量设置之后 include(CPack)构建和打包mkdirbuildcdbuild cmake..make# 生成所有配置的格式cpack# 或者只生成特定格式cpack-GTGZ cpack-GDEB cpack-GZIP7 组件化打包对于复杂的项目你可能不想把所有东西打成一个包。比如用户可能只想安装运行时文件可执行文件 动态库不想安装开发文件头文件 静态库 CMake 配置。CPack 支持组件化打包——把安装内容分成多个组件每个组件可以单独打包。# 运行时组件 install(TARGETS calculator RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT runtime ) install(TARGETS calc_lib LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT runtime ) # 开发组件 install(TARGETS calc_lib ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT development ) install(DIRECTORY include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} COMPONENT development ) # 启用组件化打包 set(CPACK_DEB_COMPONENT_INSTALL ON) # 组件描述 set(CPACK_COMPONENT_RUNTIME_DISPLAY_NAME 运行时文件) set(CPACK_COMPONENT_RUNTIME_DESCRIPTION 可执行文件和动态库) set(CPACK_COMPONENT_DEVELOPMENT_DISPLAY_NAME 开发文件) set(CPACK_COMPONENT_DEVELOPMENT_DESCRIPTION 头文件、静态库和 CMake 配置) set(CPACK_COMPONENT_DEVELOPMENT_DEPENDS runtime) # 开发组件依赖运行时组件这样 CPack 会生成两个独立的包Calculator-1.0.0-Linux-runtime.deb Calculator-1.0.0-Linux-development.deb用户可以按需安装# 只安装运行时sudodpkg-iCalculator-1.0.0-Linux-runtime.deb# 如果需要开发编写依赖此库的代码再装开发包sudodpkg-iCalculator-1.0.0-Linux-development.deb8 source 包除了打包编译后的二进制文件CPack 还可以打包源码# 打包源码cpack--configCPackSourceConfig.cmake默认会包含所有源文件。可以通过CPACK_SOURCE_IGNORE_FILES排除不需要的文件set(CPACK_SOURCE_IGNORE_FILES /build/ /\\.git/ \\.gitignore /\\.vscode/ ) set(CPACK_SOURCE_GENERATOR TGZ;ZIP)9 本篇命令速查表CPack 常用变量变量含义CPACK_PACKAGE_NAME包名CPACK_PACKAGE_VERSION版本号CPACK_PACKAGE_DESCRIPTION_SUMMARY简短描述CPACK_PACKAGE_VENDOR厂商/作者CPACK_PACKAGE_CONTACT联系方式CPACK_GENERATOR打包格式列表CPACK_PACKAGE_FILE_NAME输出文件名CPACK_RESOURCE_FILE_LICENSE许可协议文件cpack 命令行参数参数作用-G generator指定打包格式-C config指定构建配置Debug/Release--config file使用指定的配置文件-V详细输出10 总结与下一篇预告这一篇我们学习了 CPack 的使用方法包括基本配置、DEB/RPM 包的生成、组件化打包、以及源码打包。CPack 最大的优势是复用已有的 install() 规则几乎不需要额外的工作就能生成标准化的安装包。到这里我们已经完整地走过了 CMake 从入门到进阶的所有核心知识点。最后一篇我们用一个完整的实战项目把这 12 篇的知识全部串起来让你看到一个生产级的 CMake 项目是什么样子的。下一篇——cmake之旅13实战项目总结整个系列的收官之作。

相关文章:

cmake之旅(12)

cmake之旅(12)cmake之旅(12):CPack 打包与发布1 CPack 是什么2 最简单的 CPack 配置3 配置 CPack3.1 基本信息3.2 选择打包格式4 生成 DEB 包5 生成 RPM 包6 完整示例7 组件化打包8 source 包9 本篇命令速查表10 总结与…...

D3KeyHelper:暗黑破坏神3玩家的终极智能助手,5分钟解放双手!

D3KeyHelper:暗黑破坏神3玩家的终极智能助手,5分钟解放双手! 【免费下载链接】D3keyHelper D3KeyHelper是一个有图形界面,可自定义配置的暗黑3鼠标宏工具。 项目地址: https://gitcode.com/gh_mirrors/d3/D3keyHelper 你是…...

Qt定时器实战:5个QTimer高频使用场景代码示例(附避坑指南)

Qt定时器实战:5个QTimer高频使用场景代码示例(附避坑指南) 在Qt开发中,定时器是构建响应式、实时性应用的核心组件之一。无论是界面刷新、数据轮询还是事件防抖,QTimer都能以简洁的API解决复杂的时间控制问题。本文将聚…...

批处理脚本注释避坑指南:为什么你的rem语句有时不生效?

批处理脚本注释避坑指南:为什么你的rem语句有时不生效? 在Windows批处理脚本开发中,注释是代码可读性的重要保障。但许多开发者都遇到过这样的困惑:明明写了rem或::注释,运行时却出现意外错误或注释内容被当作命令执行…...

Illustrator脚本终极指南:5个核心脚本彻底改变你的设计工作流

Illustrator脚本终极指南:5个核心脚本彻底改变你的设计工作流 【免费下载链接】illustrator-scripts Adobe Illustrator scripts 项目地址: https://gitcode.com/gh_mirrors/il/illustrator-scripts Adobe Illustrator是设计师的必备工具,但繁琐的…...

**Istio服务网格实战:基于Go语言的Sidecar注入与流量控制深度解析**在现代云原生架构中,**Istio** 已成为服务治理

Istio服务网格实战:基于Go语言的Sidecar注入与流量控制深度解析 在现代云原生架构中,Istio 已成为服务治理的核心组件之一。它通过 Sidecar 代理(Envoy)实现对微服务间通信的精细化控制,包括流量管理、安全策略、可观测…...

使用 Ace Data Cloud 的 Kling 视频生成 API 创建惊艳视频

简介 在数字内容创作日益普及的今天,视频已经成为了重要的传播媒介。Ace Data Cloud 提供的 Kling API 是一款强大的工具,可以帮助开发者和创作者轻松生成高质量的视频内容。无论是制作短片、广告视频,还是其他各种视觉作品,Klin…...

抖音批量下载终极指南:5分钟掌握无水印视频下载神器

抖音批量下载终极指南:5分钟掌握无水印视频下载神器 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support…...

MusePublic生态扩展:与ControlNet兼容性验证及姿态控制实测

MusePublic生态扩展:与ControlNet兼容性验证及姿态控制实测 1. 项目背景与测试目标 MusePublic作为专为艺术人像创作设计的轻量化文本生成图像系统,已经在艺术感时尚人像生成方面展现出优异的表现。但在实际创作过程中,用户往往需要更精确的…...

Maccy:7个技巧让你成为macOS剪贴板管理大师,工作效率翻倍

Maccy:7个技巧让你成为macOS剪贴板管理大师,工作效率翻倍 【免费下载链接】Maccy Lightweight clipboard manager for macOS 项目地址: https://gitcode.com/gh_mirrors/ma/Maccy 还在为找不到之前复制的内容而烦恼吗?想象一下&#x…...

Phi-4-mini-reasoning实战案例:从数学计算到商业分析,小白也能用的AI大脑

Phi-4-mini-reasoning实战案例:从数学计算到商业分析,小白也能用的AI大脑 1. 认识你的AI推理助手 1.1 什么是Phi-4-mini-reasoning Phi-4-mini-reasoning是一款专为推理任务优化的轻量级AI模型,它就像你随身携带的数学老师和商业顾问。这个…...

RevokeMsgPatcher:Windows平台微信/QQ/TIM防撤回补丁终极使用指南

RevokeMsgPatcher:Windows平台微信/QQ/TIM防撤回补丁终极使用指南 【免费下载链接】RevokeMsgPatcher :trollface: A hex editor for WeChat/QQ/TIM - PC版微信/QQ/TIM防撤回补丁(我已经看到了,撤回也没用了) 项目地址: https:/…...

QTableWidget 表格组件肇

7.1 初识三维模型 7.1.1 三维模型的数据载体 随着计算机图形技术的发展,我们或多或少都会见过或者听说过三维模型。笔者始终记得小时候第一次在电视上看到三维动画《变形金刚:超能勇士》的震撼感受;而现在我们已经可以在手机上玩三维游戏《王…...

30分钟搞定音频格式转换:silk-v3-decoder实战指南

30分钟搞定音频格式转换:silk-v3-decoder实战指南 【免费下载链接】silk-v3-decoder [Skype Silk Codec SDK]Decode silk v3 audio files (like wechat amr, aud files, qq slk files) and convert to other format (like mp3). Batch conversion support. 项目地…...

当Aurora IP遇上多板卡互联:灵活分配GT Quad与Lane的实战策略

Aurora IP在多板卡系统中的GT资源规划与实战技巧 在当今高速数据通信和雷达信号处理领域,多FPGA系统已成为主流架构。这类系统通常需要处理数十Gbps甚至上百Gbps的数据吞吐量,而Xilinx的Aurora协议配合GT高速串行收发器,为这种高带宽需求提供…...

从幻觉到失控,大模型对齐为何总在上线后崩盘?5个被99%团队忽略的工程断点

第一章:从幻觉到失控:大模型对齐崩盘的本质归因 2026奇点智能技术大会(https://ml-summit.org) 大模型的“对齐崩盘”并非偶然故障,而是多重目标函数在高维策略空间中发生结构性解耦的必然结果。当监督微调(SFT)与基于…...

【前端】【安全】【业务场景】设备指纹技术在前端安全登录中的应用实践

1. 设备指纹技术的前端安全价值 最近处理了一个电商平台的账号盗用案例,攻击者通过撞库获取用户凭证后,竟然能在不同设备上同时登录十几个账号。这让我意识到:单纯依赖账号密码的登录体系已经不够安全。而设备指纹技术就像给每台设备发了一张…...

Mem Reduct终极指南:一键解决Windows内存卡顿的完整教程

Mem Reduct终极指南:一键解决Windows内存卡顿的完整教程 【免费下载链接】memreduct Lightweight real-time memory management application to monitor and clean system memory on your computer. 项目地址: https://gitcode.com/gh_mirrors/me/memreduct …...

软件竞争管理中的差异化策略

在当今高度数字化的商业环境中,软件行业的竞争日益激烈。企业若想在市场中脱颖而出,差异化策略成为关键。通过独特的价值主张和创新的产品设计,软件公司能够有效区分自身与竞争对手,吸引目标用户并建立长期竞争优势。本文将探讨软…...

AMD Ryzen系统调试实战:3大高级策略解决硬件性能瓶颈

AMD Ryzen系统调试实战:3大高级策略解决硬件性能瓶颈 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://git…...

MediaCreationTool.bat:Windows系统部署的自动化解决方案

MediaCreationTool.bat:Windows系统部署的自动化解决方案 【免费下载链接】MediaCreationTool.bat Universal MCT wrapper script for all Windows 10/11 versions from 1507 to 21H2! 项目地址: https://gitcode.com/gh_mirrors/me/MediaCreationTool.bat M…...

如何在2025年完美访问Flash内容:CefFlashBrowser完整使用指南

如何在2025年完美访问Flash内容:CefFlashBrowser完整使用指南 【免费下载链接】CefFlashBrowser Flash浏览器 / Flash Browser 项目地址: https://gitcode.com/gh_mirrors/ce/CefFlashBrowser 你是否还在为无法访问那些经典的Flash网站、教育课件和网页游戏而…...

Python的__init_subclass__设计扩展

Python作为一门灵活且功能强大的编程语言,其面向对象编程特性一直备受开发者青睐。其中,__init_subclass__是Python 3.6引入的一个特殊方法,它为类的继承机制提供了更强大的扩展能力。通过这个方法,开发者可以在子类被定义时自动执…...

从零搭建微信支付商户后台:Spring Boot + Maven实战入门

1. 从Android开发到后台系统的跨界之旅 作为一个常年和Android Studio打交道的移动端开发者,第一次接触微信支付商户后台开发时,那种手足无措的感觉我至今记忆犹新。公司项目突然需要接入支付功能,后台开发人手不足,这个任务就落在…...

基于Redis Sorted Set与前缀匹配的智能搜索组件实战

1. Redis Sorted Set为何适合智能搜索场景 Redis的Sorted Set(有序集合)是构建智能搜索组件的绝佳选择,这源于它独特的分数排序和范围查询能力。每个存储在Sorted Set中的元素都会关联一个分数(score),系统…...

Docker 目录编排规范

总体原则:docker/ 目录用于集中存放项目部署相关内容,成员进入后能快速找到启动方式、配置位置、脚本位置、构建产物位置。标准目录结构:docker/README.mddocker-compose.yml.env.example.env # 本地使用,不提…...

2026届必备的五大降AI率工具实际效果

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 把 AI 生成文本的痕迹予以降低,其关键的要点在于将那种机械的规整性给打破&…...

告别云端依赖:在树莓派5上本地运行Coqui TTS中文语音合成的完整配置流程

告别云端依赖:在树莓派5上本地运行Coqui TTS中文语音合成的完整配置流程 当你在偏远山区进行野外数据采集时,突然发现设备需要语音播报功能,但手机信号时断时续;当你开发智能家居中枢时,不希望用户的语音请求数据被上传…...

如何选择杭州GEO优化公司?2026年4月推荐评测口碑对比TOP7

据权威第三方Gartner预测,2026年搜索引擎访问量将下降25%,近四分之一的搜索流量向AI聊天机器人等新型载体转移,GEO(生成式引擎优化)已成为企业突破流量瓶颈、实现长期发展的核心战略。2026年4月,选择技术扎…...

PX4飞控开发实战(六)-基于VScode的模块化源码扩展与调试

1. 为什么选择VScode开发PX4飞控模块 第一次接触PX4飞控开发时,我尝试过用纯命令行工具链来编译和调试代码。那种在终端里反复输入make命令、面对满屏报错信息的体验,让我深刻理解了什么叫"开发效率黑洞"。直到后来改用VScode,整个…...