CMake 安装与打包

news2024/11/23 21:37:30

书接上回,前面我们已经介绍了动态库、静态库的构建和使用,这里将介绍项目构建完成后的安装打包发布

上一节:

动态库、静态库的构建与使用_爱钓鱼的歪猴的博客-CSDN博客

目录

 一、安装

1、理解install命令

2、CMakeLists.txt

3、执行安装

 二、打包发布

CMakeLists.txt

打包发布

 三、个人总结


 一、安装

1、理解install命令

nstall 命令用于指定文件的输出路径,这个文件可以是二进制执行文件、动态库文件、静态库文件,甚至是目录。通俗的来讲,install 其实就是把生成的文件统一拷贝到某个目录下,方便打包或者转移

install 在不同场合,使用的格式也会有所不同,大体可分为安装目标文件、安装目录。需要注意的是,运行 make 命令时不会执行install命令,运行 make install  才会执行 install 命令
 

2、CMakeLists.txt

直接看最后三个命令即可

# 添加源文件目录
aux_source_directory(./ SOURCES)

# 生成可执行文件
add_executable(example ${SOURCES})


# 添加动态库 得到libhaha.so动态库文件
add_library(haha SHARED haha.cpp)
# 给动态库添加版本号 得到libhaha.so.1.2  同时有两个链接
set_target_properties(haha PROPERTIES VERSION 1.2 SOVERSION 1)

# 添加静态库  得到libhaha.a静态库文件
add_library(haha_static STATIC haha.cpp)
# 更改输出库的名字 libhah.a 修改为 libhello.a
set_target_properties(haha_static PROPERTIES OUTPUT_NAME "hello")

# 设置可执行文件的输出路径 这是是工程目录下的lib目录
SET(EXECUTABLE_OUTPUT_PATH "${PROJECT_SOURCE_DIR}/lib")
# 设置库文件的输出路径 这是是工程目录下的lib目录
SET(LIBRARY_OUTPUT_PATH "${PROJECT_SOURCE_DIR}/lib")


# 设置统一安装路径前缀 该路径必须存在
set(CMAKE_INSTALL_PREFIX /home/jason/work/my-deploy/example/my_install_test)



# 安装 目标文件(TARGETS)
install(TARGETS ${PROJECT_NAME} haha_static haha   #等待安装的目标文件 可执行文件 静态库 动态库
    RUNTIME  DESTINATION bin                       # 安装 可执行文件到指定目录下的bin目录
    LIBRARY DESTINATION lib                        # 安装 动态库文件到指定目录下的lib目录
    ARCHIVE DESTINATION static_lib)                # 安装静态库文件到指定目录下的static_lib目录

# 安装普通文件 (FILES)
install(FILES haha.h DESTINATION include)

3、执行安装

在项目所在目录打开终端,执行:

mkdir build && cd build
cmake ..
make 
make install

查看是否都安装都指定目录:

这些目录都是CMake install 自动生成的

 查看文件是否在目录下:

 二、打包发布

CMakeLists.txt

# 添加源文件目录
#aux_source_directory(./ SOURCES)
#file(GLOB SRC_LIST "*.cpp" "src/*.cpp" "src/modules/*.cpp")

# 生成可执行文件
add_executable(example main.cpp)

# 添加动态库 得到libhaha.so动态库文件
add_library(haha SHARED haha.cpp)
# 给动态库添加版本号 得到libhaha.so.1.2  同时有两个链接
set_target_properties(haha PROPERTIES VERSION 1.2 SOVERSION 1)


# 链接刚刚生成的动态链接库 到可执行文件
target_link_libraries(${PROJECT_NAME} haha)

############################## deb 打包配置 ################################


# 说明要生成的是deb包
SET(CPACK_GENERATOR "DEB")

# 设置版本
set(CPACK_PACKAGE_VERSION "1.0.0")
# 还可通过设置每个版本字段号设置版本
#设置版本信息如下
#SET(CPACK_PACKAGE_VERSION_MAJOR "1")
#SET(CPACK_PACKAGE_VERSION_MINOR "0")
#SET(CPACK_PACKAGE_VERSION_PATCH "0")

# 设置安装包的包名,打包好的包将会是<packagename>-<version>-<sys>.deb,如果不设置,默认就是工程名
set(CPACK_PACKAGE_NAME "haha")

# 设置程序名,就是程序安装之后的名字
set(CPACK_DEBIAN_PACKAGE_NAME "haha" )

# 设置架构
set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "amd64") # amd64 与 x86_64 同意

# 设置依赖
#SET(CPACK_DEBIAN_PACKAGE_DEPENDS "libc6 (>= 2.3.1-6)") # libc6,即Linux下的C函数库

# 设置descripation
SET(CPACK_PACKAGE_DESCRIPTION "just a cpack test")

# 设置联系方式
SET(CPACK_PACKAGE_CONTACT "xxxxxxxxxx@qq.com")

# 设置维护人
set(CPACK_DEBIAN_PACKAGE_MAINTAINER "jason")

# 包含Cpack
include(CPack)

打包发布

在项目下开启终端运行:

mkdir buid && cd build
cmake ..
make 
make package

 成功生成deb包
我们用pkdg查看一下deb包的基本信息

 我们还可以看看deb包将要安装的路径所在

 最后分享一些dpkg相关常用命令

 三、个人总结

上面的haha包源码的效果在在中控台打印 haha,将其打包为deb包,安装好后,也没有多大用。要想起能有功能,那工作量应该不小。

对于笔者而言,将一个项目构建成静态库或动态库,或将可执行文件、库文件、头文件安装到别的地方,或许更有意义。举一个不太恰当的例子:新的电脑不用再安装一些软件,比如我已经将OpenCV的库文件、头文件和可执行文件安装好了。

参考:

【cmake篇】install 命令_仲夏夜之梦~的博客-CSDN博客

C++编译之(4)-进阶-cmake设置install及package配置_cmake install指令_丰色木夕的博客-CSDN博客

【cmake学习】cmake 引入第三方库(头文件目录、库目录、库文件)_cmake添加第三方库_仲夏夜之梦~的博客-CSDN博客

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

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

相关文章

Class 08 - 数据的读取和保存 R语言中的管道(pip)功能

Class 08 - 数据的读取和保存 & R语言中的管道&#xff08;pip&#xff09;功能 数据的读取和保存data() - 加载R中的数据集readr 功能包介绍readr 包中读取文件的函数read_csv() 读取 .csv 文件 readxl 包读取Excel文件read_excel() - 读取Excel文件excel_sheets() - 读取…

windows平台的视频播放软件-potplayer

可以播放多种格式的视频&#xff0c;可以将大视频按需裁剪为多个指定的小视频&#xff0c; 裁剪方式&#xff1a;快捷键altc打开如下界面 从上往下的功能大致描述为&#xff1a; 1、选择裁剪得到的视频的存储路径 2、设置才见得到的视频文件的前缀名 3、这个功能很重要&#xf…

ChatGPT帮你写简历找工作

随着随着毕业时间的到来&#xff0c;应届生将要面临求职问题&#xff0c;根据官方的统计&#xff0c;2023届高校毕业生预计达1158万人&#xff0c;就业市场竞争激烈&#xff0c;无论是校园招聘&#xff0c;招聘会&#xff0c;线上招聘除了自身的准备和个人能力&#xff0c;都会…

优秀的前端开发框架

优秀的前端开发框架 1.Vue Vue2文档&#xff1a;Vue.js Vue3文档&#xff1a;Vue.js - 渐进式 JavaScript 框架 | Vue.js 用于构建用户界面的渐进式框架 Vue的核心库只关注视图层。可与elementUI配合Element - The worlds most popular Vue UI framework 2.React 原先的Fa…

动态库、静态库的构建与使用

一、理解动态库与静态库 静态、动态是指链接 所谓静态、动态是指链接。回顾一下&#xff0c;将一个程序编译成可执行程序的步骤&#xff1a;链接&#xff1a; 把外部函数的代码&#xff08;通常是后缀名为.lib和.a的文件&#xff09;&#xff0c;添加到可执行文件中。这就叫做…

Java面试知识点(全)-分布式和微服务-redis面试知识点

redis是什么 redis是一种支持Key-Value等多种数据结构的存储系统。可用于缓存、事件发布或订阅、高速队列等场景。该数据库使用ANSI C语言编写&#xff0c;支持网络&#xff0c;提供字符串、哈希、列表、队列、集合结构直接存取&#xff0c;基于内存&#xff0c;可持久化。 为…

一个神奇的小工具,让URL地址都变成了“ooooooooo“

转换的逻辑有点像短链平台一样&#xff0c;只不过这个是将你的URL地址变的很长长长长&#xff0c;但是看着都是 ooooooooo&#xff0c;很好奇是如何实现的&#xff0c;所以查阅了源码&#xff0c;本文解读其核心实现逻辑&#xff0c;很有趣且巧妙的实现了这个功能。 发现一个很…

kaggle帕金森病进展预测大赛金牌方案分享

赛题背景 帕金森病 &#xff08;PD&#xff09; 是一种致残的脑部疾病&#xff0c;会影响运动、认知、睡眠和其他正常功能。不幸的是&#xff0c;目前没有治愈的方法 - 并且疾病会随着时间的推移而恶化。据估计&#xff0c;到2037年&#xff0c;美国将有1万人患有帕金森病&…

LeetCode 1080. Insufficient Nodes in Root to Leaf Paths【递归,二叉树】中等

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

【Java|基础篇】详解static关键字和代码块

文章目录 1.前言2.static关键字2.1 static修饰成员变量2.2 static修饰成员方法 3. 代码块3.1 普通代码块3.2 静态代码块3.3 构造代码块 4.总结 1.前言 本文主要讲解static关键字以及代码块的执行顺序以及各部分代码块的作用. 2.static关键字 Java中的static关键字是用来修饰…

hive函数02

hive函数02 窗口函数 窗口函数&#xff08;Window functions )也叫做开窗函数、OLAP函数&#xff0c;其最大特点是∶输入值是从SELECT语句的结果集中的一行或多行的“窗口”中获取的。 窗口函数可以简单地解释为类似于聚合函数的计算函数&#xff0c;但是通过GROUP BY子句组合…

jenkins 常见问题汇总

1、win11 节点&#xff08;Error: Unable to access jarfile slave.jar&#xff09; jenkins 默认cd 进入到设置的目录下面&#xff0c;如果不是C盘的话&#xff0c;直接cd 进入不了其他盘&#xff0c;所以&#xff0c;需要在命令前面&#xff0c;加参数进入到对应盘符。eg:E:…

pandas1

pandas pandas 的核心是&#xff1a;‘Series’、‘DataFrame’、Index’三个类型 1. 创建DataFrame对象 1.1 通过二维数组创建 scores np.random.randint(60,101,(5,3)) scoresarray([[ 91, 87, 87],[100, 80, 61],[ 76, 84, 80],[ 81, 97, 69],[ 67, 77, 65]]…

如何查看SSL证书的有效期?(中科三方)

SSL证书能够对数据传输进行加密处理&#xff0c;对网站的真实性进行核验&#xff0c;是网站提升数据安全能力的重要手段&#xff0c;现在已经有越来越多的网站开始安装SSL证书。但为了保障加密技术的快速更新&#xff0c;SSL证书的有效期逐渐缩短&#xff0c;而一旦SSL证书失效…

【腾讯云 Finops Crane 集训营】心得体会

【腾讯云 Finops Crane 集训营】心得体会 一直在关注技术社区的活动&#xff0c;希望看到更多的新技术&#xff0c;最近在逛 CSDN 的过程中&#xff0c;让我有机会参加了腾讯云的 Finops Crane 开源项目的第一季活动&#xff0c;从而深入了解了这个项目。Crane是一种云资源分析…

PMP常考知识点整理

1十大知识领域之项目整合管理 ❒ 变更控制流程&#xff08;简化版&#xff09; 书面记录变更请求→分析影响→提交CCB进行审批→批准或者拒绝→若批准&#xff0c;先修改计划&#xff08;体现变更&#xff09;&#xff0c;再通知变更受影响相关方&#xff0c;最后再执行、追踪…

【PCIE720】 基于PCIe总线架构的高性能计算(HPC)硬件加速卡

板卡概述 PCIE720是一款基于PCI Express总线架构的高性能计算&#xff08;HPC&#xff09;硬件加速卡&#xff0c;板卡采用Xilinx的高性能28nm 7系列FPGA作为运算节点&#xff0c;在资源、接口以及时钟的优化&#xff0c;为高性能计算提供卓越的硬件加速性能。板卡一共具有5个F…

Linux---文件操作命令(find、which、read)

1. find命令 find [路径] [参数] 要查找的目录路径&#xff0c;可以是一个目录或文件名&#xff0c;也可以是多个路径&#xff0c;多个路径之间用空格分隔&#xff0c;如 果未指定路径&#xff0c;则默认为当前目录。 可选参数&#xff0c;用于指定查找的条件&#xff0c;可…

day37_JQuery

今日内容 零、 复习昨日 一、JQuery 零、 复习昨日 正则 匹配,筛选字符串[0-9a-zA-ZA-z\d\w]*?{3}{4,}{5,10}^$reg.test(字符) jquery js封装的库,封装js操作,可以用来操作事件,dom,动画,ajax$("#id") $("element") $(".class")$("选择器…

chatgpt赋能Python-pythonwhile遍历

Python中使用while循环遍历的优势 Python是一种高级语言&#xff0c;广泛用于Web开发、数据科学、人工智能等方面。Python提供了多种循环结构&#xff0c;其中while循环是一种非常常用的遍历方式。在本篇文章中&#xff0c;我们将介绍如何在Python中使用while循环遍历&#xf…