【CMake】CMake入门(五)打包安装程序 使用CMake管理库 打包调试版和发行版

本篇文章不是新手入门教学文章,主要是记录笔者个人的学习笔记

CMake入门(五)

  • 一、打包
  • 二、使用CMake管理库
  • 三、打包调试版和发行版

一、打包

发布程序可以有多种形式,比如安装包、压缩包、源文件等。CMake也提供了打包程序cpack可将程序打包成多种形式。

在Windows上默认情况会打包成.exe文件,所以需要先安装一个exe打包程序NSIS(Null Soft Installer)

  • NSIS下载地址:https://sourceforge.net/projects/nsis/

只需要在顶层CMakelists.txt最后添加以下代码

include(InstallRequiredSystemLibraries)
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/License.txt")
set(CPACK_PACKAGE_VERSION_MAJOR "${Tutorial_VERSION_MAJOR}")
set(CPACK_PACKAGE_VERSION_MINOR "${Tutorial_VERSION_MINOR}")
# 设置打包的方式
set(CPACK_SOURCE_GENERATOR "TGZ")
include(CPack)

include(CPack)会在构建路径(Build tree)下生成两个cpack的配置文件,CPackConfig.cmakeCPackSourceConfig.cmake,其实也就对应了两个构建目标:packagepackage_source

关于打包的方式可以使用下面的命令查看

cpack --help

在这里插入图片描述

在项目构建完成之后,可以直接执行

cpack

也可以指定生成器打包成对应的格式

cpack -G ZIP # 打包成ZIP

对于多配置项目,可以指定打包配置

cpack -C Debug # 打包Debug版本

也可以打包源代码

cpack --config CPackSourceConfig.cmake

二、使用CMake管理库

我们先来看一下在CMake中使用第三方库的方法,MathFunctions的库文件、头文件在其他路径当中,这时库的引入方式如下:

# CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(Tutorial)

add_executable(Tutorial tutorial.cxx)

set(mathlib_DIR C:/Users/YAN/Desktop/cmake/mathlib)

# cmake中使用第三方库的一般步骤
# 1. 设置头文件位置
target_include_directories(Tutorial PRIVATE "${mathlib_DIR}/include")

# 2. 设置库文件搜索位置
target_link_directories(Tutorial PRIVATE "${mathlib_DIR}/lib")

# 3. 指定需要链接的库(libXXX.a libXXX.dll直接写成XXX的形式即可)
target_link_libraries(Tutorial PRIVATE MathFunctions)

现在的问题是,如果一个库不用CMake管理,那就是用如上方法来引用,可是这个库也是由CMake构建来的,还用同样的方法来引入,那CMake不是白用了吗?

用CMake管理简化后的版本为:

cmake_minimum_required(VERSION 3.10)
project(Tutorial)

add_executable(Tutorial tutorial.cxx)

# 如果库是安装在环境变量里有的位置,这行可以不用写
set(MathFunctions_DIR C:/Users/YAN/Desktop/cmake/mathlib/lib/cmake/MathFunctions)
# 第一个参数是库名称  第二个参数表名这个库是必须的
find_package(MathFunctions REQUIRED)

target_link_libraries(Tutorial PRIVATE MathFunctions)

可以看出使用CMake管理库之后,我们对库的使用也会更加方便,所以本节内容为如何导出一个用CMake管理的库。


  1. 给目标安装添加导出
install(TARGETS ${installable_libs}
        EXPORT <导出的文件名>
        DESTINATION lib)

EXPORT可以生成一个导出的文件名.cmake的文件,这里面描述了此处安装的这些目标的一些导出配置

  1. 要让导出文件配置的路径对其他项目也可用,而不是绑定当前项目路径,需要修改头文件搜索路径,构建时和安装后为不同值
target_include_directories(MathFunctions
                           INTERFACE
                           $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
                           $<INSTALL_INTERFACE:include>
                           )

BUILD_INTERFACEINSTALL_INTERFACE 一种生成器表达式中的值。

  • BUILD_INTERFACE:这个表达式在构建阶段(也就是你在电脑上编译代码的时候)生效。
  • INSTALL_INTERFACE:这个表达式在安装阶段(也就是你运行 cmake --install . 的时候)生效。
  1. 将第一步生成的导出的文件名.cmake文件安装
install(EXPORT <导出文件名>
  FILE <导出文件名>.cmake
  DESTINATION <依赖的目标>
)
  1. 在库级别的CMakeLists.txt目录下准备一个<库名>Config.cmake.in文件模板

用CMake管理的库需要用find_package进行导入,为了让find_package能正确找到对应的库,需要再准备一个<库名>Config.cmake文件,通常由模板生成,模板格式固定,内容如下

@PACKAGE_INIT@

include("${CMAKE_CURRENT_LIST_DIR}/第一步导出的文件名.cmake" )

configure_package_config_file根据模板生成<库名>Config.cmake文件。
然后在库级别的CMakeLists.txt 添加下面的代码:

include(CMakePackageConfigHelpers)
configure_package_config_file(${CMAKE_CURRENT_SOURCE_DIR}/<库名>Config.cmake.in
  "${CMAKE_CURRENT_BINARY_DIR}/<库名>Config.cmake"
  INSTALL_DESTINATION "lib/cmake/<库名>"
  NO_SET_AND_CHECK_MACRO
  NO_CHECK_REQUIRED_COMPONENTS_MACRO
  )
  1. 生成版本文件(非必需)

在库级别的CMakeLists.txt 添加下面的代码:

write_basic_package_version_file(
  "${CMAKE_CURRENT_BINARY_DIR}/<库名>ConfigVersion.cmake"
  VERSION "${<项目名>_VERSION_MAJOR}.${<项目名>_VERSION_MINOR}"
  COMPATIBILITY AnyNewerVersion
)
  1. 安装生成文件

在库级别的CMakeLists.txt 添加下面的代码:

install(FILES
  ${CMAKE_CURRENT_BINARY_DIR}/<库名>Config.cmake
  ${CMAKE_CURRENT_BINARY_DIR}/<库名>ConfigVersion.cmake
  DESTINATION lib/cmake/<库名>
  )

上面这样设置好以后,我们在使用上面CMake管理的库时,就很方便了,下面是一个示例:

假设我们对库MathFunctions 进行了上面的配置,那么我们在使用这个库时就可以按照下面的方式来使用。

cmake_minimum_required(VERSION 3.15)
project(Tutorial)

# 指定库的路径   后面的路径就是上面的设置形成以后,配置文件的生成路径
set(MathFunctions_DIR /home/pan/cmake-learing/Step11/install/lib/cmake/MathFunctions/)
# 引入库
find_package(MathFunctions REQUIRED)

# 生成可执行程序
add_executable(Tutorial tutorial.cxx)
# 连接可执行程序
target_link_libraries(Tutorial PRIVATE MathFunctions)

三、打包调试版和发行版

下面示例只针对单配置生成器,对多配置生成器(如Visual Studio)不生效。

CMake一个构建目录只能有一种配置,分别为DebugReleaseMinSizeRelRelWithDebInfo
对于需要指定的不同版本,只需要在配置时指明即可。

# 指定生成器、配置为Release版本
cmake -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Release ..

如果需要让Debug版本生成的目标名称与Release版本不同,可以使用CMAKE_DEBUG_POSTFIX为Debug版设置后缀。

set(CMAKE_DEBUG_POSTFIX d)
add_executable(Tutorial tutorial.cxx)
set_target_properties(Tutorial PROPERTIES DEBUG_POSTFIX ${CMAKE_DEBUG_POSTFIX})

这样一来该目标及其依赖的目标生成的文件都会带有后缀d


通常来说会把Debug版与Release版分别放入两个debugrelease目录中。如果只需要打包一版本,到对应目录中直接运行cpack即可。如果需要同时打包两个版本的内容,则在debugrelease同级目录下新建一个MultiCPackConfig.cmake文件,内容如下:

include("release/CPackConfig.cmake")

set(CPACK_INSTALL_CMAKE_PROJECTS
    "debug;可执行文件;库名;/"
    "release;可执行文件;ALL;/"
    )

CPACK_INSTALL_CMAKE_PROJECTS用来指定要打包的内容,可以有多项,每一项里有4部分内容,分别为

  • 项目路径:指定要打包的项目所在的路径
  • 项目名称:指定要打包的项目的名称
  • 安装组件:指定要打包的项目的安装组件。可以是ALL(所有组件)、DEFAULT(默认组件)或者是一个具体的组件名称
  • 安装路径:指定要打包的项目的安装路径(相对整打包好的整个目录来说的)

完成之后在本目录下执行

cpack --config MultiCPackConfig.cmake

即可打包配置好的内容。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/674079.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

电脑数据恢复,6个方法,恢复文件很简单!

“我在使用电脑时&#xff0c;一个不小心就误删了部分重要数据&#xff0c;现在想恢复电脑数据却不知怎么操作了&#xff0c;希望大家帮帮我&#xff01;” 在数字化时代&#xff0c;电脑数据不仅是工作和学习的重要载体&#xff0c;更是我们生活中珍贵的记忆和情感的存储地。然…

二叉树创建和遍历(及相关OJ题)

个人主页 &#xff1a;敲上瘾-CSDN博客二叉树介绍&#xff1a;二叉树(详解)-CSDN博客 目录 一、二叉树的创建 二、二叉树的遍历 1.前序遍历 2.中序遍历 3.后序遍历 4.层序遍历 三、相关计算 1.总节点个数计算 2.叶子节点个数计算 3.深度计算 一、二叉树的创建 关于…

❤机器学习正则化算法的总结。耗时10个小时完成。❤

❤纯 干 货~❤ 目录 纯干货 1、L1 正则化&#xff08;Lasso 正则化&#xff09; 2、L2 正则化&#xff08;岭正则化&#xff09; 3、弹性网络正则化&#xff08;Elastic Net 正则化&#xff09; 4、Dropout 正则化&#xff08;用于神经网络&#xff09; 5、贝叶斯Rid…

风力发电机常见故障分析

风力发电机常见故障分析 风力发电机是风电机组中的核心部件&#xff0c;其运行的可靠性和稳定性对整个风电系统的发电效率至关重要。然而&#xff0c;由于复杂的机械结构和长期暴露在严酷环境中&#xff0c;风力发电机在运行过程中可能会出现各种故障。本文将详细介绍风力发电…

【Linux】深入理解文件操作:从C语言接口到系统调用与缓冲区管理

文章目录 前言&#xff1a;1. 铺垫2. 重新使用C文件接口&#xff1a;对比一下重定向2.1. 什么叫当前路径&#xff1f;2.2. 写入文件2.3. 读文件2.4. 程序默认打开的文件流2.5. 输出2.6. 输入 3. 系统调用提供的文件接口3.1. open 打开文件3.2. open函数返回值 4. 缓冲区问题总结…

MongoDB~索引使用与优化

Study by&#xff1a; https://docs.mongoing.com/indexeshttps://www.cnblogs.com/Neeo/articles/14325130.html#%E5%85%B6%E4%BB%96%E7%B4%A2%E5%BC%95 作用 如果你把数据库类比为一本书&#xff0c;那书的具体内容是数据&#xff0c;书的目录就是索引&#xff0c;所以索引…

【随笔】Git 实战篇 -- 开心 commit 之后,发现有一处bug还需要改,只能 reset 撤销然后再次提交 -- git reset --(四十三)

&#x1f48c; 所属专栏&#xff1a;【Git】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大…

RabbitMQ小结

MQ分类 Acitvemq kafka 优点&#xff1a;性能好&#xff0c;吞吐量高百万级&#xff0c;分布式&#xff0c;消息有序 缺点&#xff1a;单机超过64分区&#xff0c;cpu会飙高&#xff0c;消费失败不支持重试 &#xff0c; Rocket 阿里的mq产品 优点&#xff1a;单机吞吐量也…

如何赋予LLM多模态能力(MLLM)

基本概念 多模态大型语言模型&#xff08;MLLMs&#xff09;是人工智能领域的一项前沿技术&#xff0c;旨在设计能够理解和生成跨越多种形式数据输入&#xff08;如文本和图像&#xff09;内容的模型。 链接文本和视觉模态&#xff1a;MLLMs能够整合文本和视觉数据源的信息。…

众汇:外汇狙击指标如何使用?

对于投资者来说&#xff0c;我们各位交易的目的是什么?WeTrade众汇认为那就是盈利。所以来说有一个指标对各位投资者来说那是相当有帮助的。这是因为对于交易者而言&#xff0c;利用这些指标可以快速识别盈利的买卖时机。当我们选择一个指标之后&#xff0c;深入了解其适用范围…

【机器学习】机器学习与AI大数据的融合:开启智能新时代

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 机器学习与AI大数据的融合 &#x1f4d2;1. 引言&#x1f4d5;2. 机器学习与大数据&#x1f3a9;机器学习与大数据的特征&#x1f388;大数据如…

基于全志T507-H的Linux-RT实时性测试案例分享

本文将为各位工程师演示全志T507-H工业评估板&#xff08;TLT507-EVM&#xff09;基于IgH EtherCAT控制伺服电机方法&#xff0c;生动说明Linux-RT Igh EtherCAT的强大之处&#xff01; Linux-RT系统的优势 内核开源、免费、功能完善。 RT PREEMPT补丁&#xff0c;使Linux内…

树形结构获取所有直属父级节点

递归获取 let arr [{name: "/",meta: {},children: [{name: "home",},{name: "home2",},{name: "common-components",children: [{name: "form-component",}]},{name: "multilevel-menu",children: [{name: &qu…

【数据结构】复杂度的重要性—–决定程序运行的效率

【数据结构】复杂度的重要性—–决定程序运行的效率 前言 在我们写算法的时候&#xff0c;常常会需要考虑一个问题&#xff1a;这个算法好不好&#xff1f;而这个“好”实际上就取决于是算法的复杂度。 算法复杂度&#xff08;Algorithmic Complexity&#xff09;是指算法在编…

粒子系统技术在AI绘画中的创新应用

引言&#xff1a; 随着人工智能技术的飞速发展&#xff0c;AI绘画已经成为艺术创作和数字媒体领域的一大热点。粒子系统作为一种模拟复杂物理现象的技术手段&#xff0c;其在AI绘画中的应用为创作过程带来了前所未有的灵活性和创新性。本文将深入探讨粒子系统技术的原理、特点以…

Nvidia Jetson/Orin +FPGA+AI大算力边缘计算盒子:人工智能消防应用

青鸟消防股份有限公司成立于2001年6月&#xff0c;于2019年8月在深圳证券交易所挂牌上市&#xff0c;成为中国消防报警行业首家登陆A股的企业。公司始终聚焦于消防安全与物联网领域&#xff0c;主营业务为“一站式”消防安全系统产品的研发、生产和销售。公司产品已覆盖了火灾报…

【Linux 网络】高级 IO -- 详解

一、IO 的基本概念 I/O&#xff08;input/output&#xff09;也就是输入和输出&#xff0c;在冯诺依曼体系结构当中&#xff0c;将数据从输入设备拷贝到内存就叫作输入&#xff0c;将数据从内存拷贝到输出设备就叫作输出。 对文件进行的读写操作本质就是一种 IO&#xff0c;文…

近邻算法详解:原理、Java实现及应用场景

摘要 近邻算法&#xff08;Nearest Neighbor Algorithm&#xff09;是一类基于实例的学习方法&#xff0c;广泛应用于分类和回归问题中。最常见的近邻算法是K近邻算法&#xff08;K-Nearest Neighbors, KNN&#xff09;&#xff0c;其基本思想是通过计算待分类样本与训练样本的…

内网渗透-详解代理逻辑及隧道

写在前面 红蓝对抗过程中打点以后往往需要进行内网渗透和横向移动&#xff0c;因此大家都需要扎实掌握代理和隧道知识&#xff0c;一款优秀的代理工具也可以给内网渗透带来很大的收益。 1.正向代理&#xff1a; 代理客户端&#xff0c;帮助客户端完成所需请求。 举例&#x…

系统架构设计师【第6章】: 数据库设计基础知识 (核心总结)

文章目录 6.1 数据库基本概念6.1.1 数据库技术的发展6.1.2 数据模型6.1.3 数据库管理系统6.1.4 数据库三级模式 6.2 关系数据库6.2.1 关系数据库基本概念6.2.2 关系运算6.2.3 关系数据库设计基本理论 6.3 数据库设计6.3.1 数据库设计的基本步骤6.3.2 数据需求分析6…