【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(MathFunctionsINTERFACE$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>$<INSTALL_INTERFACE:include>)

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

  • BUILD_INTERFACE:这个表达式在构建阶段(也就是你在电脑上编译代码的时候)生效。
  • INSTALL_INTERFACE:这个表达式在安装阶段(也就是你运行 cmake --install . 的时候)生效。
  1. 将第一步生成的导出的文件名.cmake文件安装
install(EXPORT <导出文件名>FILE <导出文件名>.cmakeDESTINATION <依赖的目标>
)
  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_MACRONO_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.cmakeDESTINATION 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

即可打包配置好的内容。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

金钱的认知,你如何理解呢?

金钱的认知 建立在金钱之上的爱情是纯真的爱&#xff0c;朋友关系也才够纯粹&#xff0c;才是单纯的世界&#xff0c;反之没了钱的条件爱情和友情的美好关系极易破碎&#xff0c;也极易反目成仇。 心若美好钱就美好&#xff0c;心有欲望狰狞钱就是只咬人的老虎&#xff0c;钱…

Linux 僵尸进程和孤儿进程

一.Z(zombie)-僵尸进程 1.僵死状态&#xff08;Zombies&#xff09;是一个比较特殊的状态。当进程退出并且父进程&#xff08;使用wait()系统调用后&#xff09;没有读取到子进程退出的返回代码时就会产生僵死(尸)进程 2.僵死进程会以终止状态保持在进程表中&#xff0c;并且会…

Java17 --- SpringCloud之seate

目录 一、创建seata需要的mysql数据库表 二、修改seata的配置文件 三、启动nacos及seata 四、创建需要的数据库及表 一、创建seata需要的mysql数据库表 CREATE DATABASE seata;CREATE TABLE IF NOT EXISTS global_table(xid VARCHAR(128) NOT NULL,…

C++ | Leetcode C++题解之第128题最长连续序列

题目&#xff1a; 题解&#xff1a; class Solution { public:int longestConsecutive(vector<int>& nums) {unordered_set<int> num_set;for (const int& num : nums) {num_set.insert(num);}int longestStreak 0;for (const int& num : num_set) {…

隐马尔可夫链

1 马尔可夫链 马尔科夫链&#xff08;Markov Chain&#xff09;是一种数学模型&#xff0c;它描述了一系列可能事件的概率&#xff0c;其中每个事件的发生仅依赖于前一个事件的状态。这一特性称为“无记忆性”或“马尔可夫性质”。我将用一个简单的天气预测模型作为例子来解释马…

T-Pot多功能蜜罐实践@debian12@FreeBSD

T-Pot介绍 T-Pot是一个集所有功能于一身的、可选择分布式的多构架&#xff08;amd64&#xff0c;arm64&#xff09;蜜罐平台&#xff0c;支持20多个蜜罐和很多可视化选项&#xff0c;使用弹性堆栈、动画实时攻击地图和许多安全工具来进一步改善欺骗体验。GitHub - telekom-sec…

SpringBootWeb登录认证

JWT令牌 JSON Web Token JSON Web Tokens - jwt.ioJSON Web Token (JWT) is a compact URL-safe means of representing claims to be transferred between two parties. The claims in a JWT are encoded as a JSON object that is digitally signed using JSON Web Signatur…

文件系统和日志分析

文件系统 概述 文件是存储在硬盘上的。硬盘上的最小存储单位是扇区&#xff0c;每个扇区的大小是512字节。 inode号&#xff1a;又叫索引号&#xff0c;保存的是元信息&#xff08;主要有文件的属性 &#xff1a;包括权限&#xff0c;创建者&#xff0c;创建日期等&#xff…

Renesas MCU之使用e² studio搭建开发环境

目录 概述 1 e studio介绍 2 搭建Renesas MUC开发环境 2.1 软件版本信息 2.2 安装软件 3 创建工程 3.1 板卡硬件接口 3.2 FSP配置IO 4 Generate Project 4.1 项目目录介绍 4.2 LED接口相关驱动 5 调试 5.1 测试代码 5.2 J-Link调试代码 5.3 硬件结构 概述 本文主…

ES6-01-简介

一、什么是ES6&#xff1f; 每年一个版本o(╥﹏╥)o。 二、javaScript新特性的特点 1、语法简洁&#xff0c;功能丰富&#xff1b; 2、框架开发应用。 3、岗位需求&#xff01; 三、let关键字 3-1、声明变量 let a;let a,b;let e100;let f521, gmilk-love, h[]; 3-2、声明的…

python采集汽车价格数据

python采集汽车价格数据 一、项目简介二、完整代码一、项目简介 本次数据采集的目标是车主之家汽车价格数据,采集的流程包括寻找数据接口、发送请求获取响应、解析数据和持久化存储,先来看一下数据情况,完整代码附后: 二、完整代码 #输入请求页面url #返回html文档 imp…

属性(property)

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 1 创建用于计算的属性 在Python中&#xff0c;可以通过property&#xff08;装饰器&#xff09;将一个方法转换为属性&#xff0c;从而实现用于计算…

几种更新 npm 项目依赖的实用方法

引言 在软件开发的过程中&#xff0c;我们知道依赖管理是其中一个至关重要的环节。npm&#xff08;Node Package Manager&#xff09; 是 Node.js 的包管理器&#xff0c;它主要用于 Node.js 项目的依赖管理和包发布。随着项目的不断发展&#xff0c;依赖库的版本更新和升级成…

基于Win11下的Wireshark的安装和使用

Wireshark的安装和使用 前言一、Wireshark是什么简介 二、下载Wireshark下载过程查看自己电脑配置 三、安装Wireshark安装过程安装组件创建快捷方式winPacpNpcap 打开检验 四、使用Wireshark实施抓包捕获数据包 五、基于Wireshark使用显示过滤器简介使用方法注意ICMP的请求和应…

目标检测算法综述

1 研究背景 1.1 概述 目标检测是计算机视觉的重要分支&#xff0c;主要任务是在给定的图片中精确找到物体所在位置&#xff0c;并标注出物体的类别&#xff0c;即包含了目标定位与目标分类两部分。在计算机视觉领域中的目标跟踪、图像分割、事件检测、场景理解等的任务都以目标…

Java线程几种常用方法详细说明

在Java编程中&#xff0c;多线程编程是一个非常重要的主题。它允许我们同时运行多个任务&#xff0c;提高程序的性能和响应速度。在这篇博客中&#xff0c;我们将介绍一些常用的Java线程方法和构造器&#xff0c;并通过示例代码展示如何使用它们。 Thread提供的常用方法 publi…

SpringBoot与Spring Framework提供的缓存抽象

目录 缓存 项目总结 新建一个SpringBoot项目 pom.xml application.properties CacheConfig Book BookRepository接口 BookService服务类 BookController控制器 SpringbootCacheApplication启动类 启动项目&#xff0c;使用Postman测试 参考博文&#xff1a; 1、使用…

llvm 3.5 源码分析 clang for x86 001 之搭环境

0&#xff0c;目标 编译 针对x86 的&#xff0c;debug 的 c语言的编译器 1&#xff0c;下载代码 git clone --recursive 。。。llvm-project.git $ cd llvm-project 2&#xff0c;预备代码 llvm 3.5 版本的源代码&#xff0c;早期版本&#xff0c;可能比较小比较容易debug $…

Unity MiniCPM-V 让引擎拥有视觉

Unity MiniCPM-V 让引擎拥有视觉 前言项目Python环境布置Unity场景布置代码编写添加并设置脚本总结 鸣谢AI提示 前言 新发布的MiniCPM-V&#xff0c;忍不住玩一下&#xff0c;可以让之前制作的语音助手拥有一定的视觉能力&#xff08;不是OpenCV不行&#xff0c;而是AI更加符合…

深入理解Java关系运算符,避免常见错误!

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…