CMake之CPack

文章目录

  • 一、CPack
    • 1.用CPack打包成为deb包
    • 2.如何确定的Depends依赖包?
    • 3.如何确定编译Build-Depends?
    • 4.Cpakc打包RPM包
  • 二、deb的简单使用
  • 三、deb包相关文件说明
    • 1.control文件
    • 2.preinst文件
    • 3.postinst文件
    • 4.prerm文件
    • 5.postrm文件

一、CPack

CPack 是 CMake 2.4.2 之后的一个内置工具,用于创建软件的二进制包和源代码包。
CPack 在整个 CMake 工具链的位置。
在这里插入图片描述
CPack,则是CMake下的一个打包工具,其支持将软件打包成 .deb, .zip, .7z 等各种各样的软件包;

1.用CPack打包成为deb包

使用CPack其实很简单,核心只有两步:

  • 设定软件包的属性(例如:包名称,包类型,版本号,作者等信息)
  • 指定需要打包的文件(例如:可执行文件,静态库,动态库)
cmake_minimum_required(VERSION 3.10)# 设置项目名
project(CMakeTutorial VERSION 1.2)# 添加头文件搜索路径
include_directories(
${PROJECT_SOURCE_DIR}/inc
)# 生成库
add_library(PrinterChar STATIC src/printer_char.cpp)    # 静态库
add_library(PrinterInt SHARED src/printer_int.cpp)      # 动态库# 添加需要构建的可执行文件
#------方法对比 1.1 - 不用库的写法
# add_executable(LinkLibraryDemo link_library_demo.cpp src/printer_char.cpp src/printer_int.cpp)
#------方法对比 1.2 - 用库的写法
add_executable(LinkLibraryDemo demo/link_library_demo.cpp)
target_link_libraries(LinkLibraryDemo PRIVATE PrinterChar)   # 为目标添加静态库
target_link_libraries(LinkLibraryDemo PRIVATE PrinterInt)    # 为目标添加动态库##---------------- 以下为用CPack打包成deb包的内容 ----------------##
# 指定deb包的版本号
set(_VERSION_MAJOR 1)
set(_VERSION_MINOR 2)
set(_VERSION_PATCH 3)
set(CPACK_PACKAGE_VERSION_MAJOR "${_VERSION_MAJOR}")
set(CPACK_PACKAGE_VERSION_MINOR "${_VERSION_MINOR}")
set(CPACK_PACKAGE_VERSION_PATCH "${_VERSION_PATCH}")
# 指定CPack生成的是deb包(还可以是其他包如 <.7z> <.zip> 等)
set(CPACK_GENERATOR "DEB")
# 指定包名
set(CPACK_PACKAGE_NAME "mork_printer_package_demo")
# 指定程序名,就是程序安装后的名字
set(CPACK_DEBIAN_PACKAGE_NAME "mork_printer_project_demo")
# 指定运行的计算机架构
set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "amd64")
# 指定所需的依赖
# set(CPACK_DEBIAN_PACKAGE_DEPENDS "libgrpc++")
# 设置包作者的联系方式
set(CPACK_PACKAGE_CONTACT "supporter@gmail.com")
# 设置维护人
set(CPACK_DEBIAN_PACKAGE_MAINTAINER "members of support@gmail.cn")
# 指定需要安装的文件
INSTALL(TARGETS LinkLibraryDemo PrinterInt PrinterCharRUNTIME DESTINATION /tmp/cmake_demo#LIBRARY DESTINATION /tmp/cmake_demo    # 通常,编译器只会在 </usr/lib> 和 </lib> 中找头文件,如果#ARCHIVE DESTINATION /tmp/cmake_demo    # 将库文件放在其他目录,可能会引起找不到库文件错误)include(CPack)
#include <iostream>
#include <string>int Add(int t1, int t2)
{int result = t1 + t2;std::cout << t1 << " + " << t2 << " is: " << result << std::endl;return result;
}int main()
{int ret_add;ret_add = Add(1, 2);std::cout << "Hello, this is my first cmake sample "  << ret_add << std::endl;return 0;
}
cmake_minimum_required (VERSION 3.0.0)project (cmake_test VERSION 0.0.4)set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)add_executable(demo main.cpp)# package program
message(STATUS "CPack Configuration added.")include(InstallRequiredSystemLibraries)set(CPACK_PACKAGE_NAME ${PROJECT_NAME})set(CPACK_PACKAGE_VERSION ${PROJECT_VERSION})
set(CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA"${CMAKE_CURRENT_SOURCE_DIR}/prerm;${CMAKE_CURRENT_SOURCE_DIR}/postrm")
set(CPACK_PACKAGE_DIRECTORY ${CMAKE_BINARY_DIR})
set(CPACK_SOURCE_IGNORE_FILES build)set(CPACK_PACKAGE_CONTACT "xxx@163.com")
set(CPACK_PACKAGE_DESCRIPTION "cpack test program")# set(CPACK_SET_DESTDIR ON)
# # 设置安装到的目录路径
# set(CMAKE_INSTALL_BINDIR "/home/raymond/install")install(TARGETS demoRUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})# according to CMake, CPack must be included LAST
# after all settings have been set
include(CPack)

在上面的CMakeLists.txt中,最重要的是INSTALL这个指令,上面的INSTALL指令所表达的意思是,需要将LinkLibraryDemo, PrinterInt, PrinterChar 这3个文件打包,其中可执行文件放在/tmp/cmake_demo,这个目录中,静态库和动态库文件则放在默认目录中。

如果你不赋值CPACK_DEBIAN_PACKAGE_DEPENDS这个变量,则在debian/control文件中,没有Depends这一行,虽然在你自己的机器上不影响打包构建。但是将deb包提供给他人安装后,可能无法运行。如果添加这一行,则可以在安装时就检查依赖是否满足。

include(InstallRequiredSystemLibraries):这个命令是CMake教程中建议使用的,该命令将包括当前平台项目所需的任何运行时库。
CPACK_PACKAGE_NAME: 包的名称,默认使用项目名称
CPACK_PACKAGE_VERSION : 包的版本,默认使用项目版本
CPACK_PACKAGE_DIRECTORY :cpack要打包的目录,如果没有设置,默认使用编译目录
CPACK_SOURCE_IGNORE_FILES :打包源代码时要排除的目录,默认情况下会将整个工程的目录都打包进源代码,但有些不属于代码的部分或者不想打包的部分可以通过这个变量排除,比如这里的build目录
CPACK_PACKAGE_CONTACT :程序的维护者信息,这是在打包成DEB文件时必须的一个变量
CPACK_PACKAGE_DESCRIPTION : 描述包的信息
install()命令 :描述了包内的文件安装的位置,如可执行文件和共享库等,这里只设置了一个demo的可执行文件。
include(CPack) : 所有的cpack命令需以这个结尾

编译

cmake -B build 
cmake --build build --target package(cmake --build build --target help) 打包install()的内容
cmake --build build --target package_source,打包源码

不用Cmake:Ubuntu Deb 安装包的内容可以 参考

更多例子请参考:

  • cmake菜谱

2.如何确定的Depends依赖包?

使用ldd查看可执行软件链接的动态库。

 ldd xweather | grep [Qq]tlibQt5Widgets.so.5 => /lib/x86_64-linux-gnu/libQt5Widgets.so.5 (0x00007ff241739000)                libQt5Gui.so.5 => /lib/x86_64-linux-gnu/libQt5Gui.so.5 (0x00007ff2411ae000)                        libQt5Network.so.5 => /lib/x86_64-linux-gnu/libQt5Network.so.5 (0x00007ff24100d000)                libQt5Core.so.5 => /lib/x86_64-linux-gnu/libQt5Core.so.5 (0x00007ff240b12000)需要确定这些动态库都在哪些软件包里。
$ dpkg -S libQt5Widgets.so.5 
libqt5widgets5:amd64: /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5.11
libqt5widgets5:amd64: /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5
libqt5widgets5:amd64: /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5.11.3通过上面的步骤,我们就可以得到libQt5Widgets.so.5这个动态库在libqt5widgets5这个包中
将这些软件包名赋值给CPACK_DEBIAN_PACKAGE_DEPENDS即可。
SET(CPACK_DEBIAN_PACKAGE_DEPENDS "libqt5core5a, libqt5widgets5, libqt5network5, libqt5gui5")

3.如何确定编译Build-Depends?

The devscripts package provides a collection of scripts which may be of use to Debian developers and others wishing to build Debian packages.

sudo apt-get install devscripts

要找出编译你的软件所需的软件包可以使用这个命令

$ dpkg-depcheck -d your_build_exec_binary
Packages needed:fonts-lohit-deva

另一种方法可以执行

$ objdump -p your_build_exec_binary | grep NEEDEDNEEDED               libQt5Widgets.so.5

通过上述两个办法获取到动态库后,执行下面的命令,获取开发包。

$ dpkg -S libQt5Network | grep dev
qtbase5-dev:amd64: /usr/lib/x86_64-linux-gnu/libQt5Network.so

填入到Build-Depends中即可。

4.Cpakc打包RPM包

参考:

  • CPack 入门指南

二、deb的简单使用

查看一下这个deb软件包的信息和内容:

查看控制文件内容
dpkg-deb -I <deb包文件>查看打包的内容
dpkg -c <deb包文件>sudo dpkg -i <deb包文件>	# 安装deb包
sudo dpkg -l			# 显示已经安装的包
sudo dpkg -P <包名称>	# 卸载指定的软件包dpkg-deb -R X.deb. X 解压包
dpkg-deb -X X.deb X 解压包#安装(解包并配置) 
dpkg -i|--install <.deb file name>
#dpkg -i mydeb-1.deb#强制安装
dpkg --force-depends -i mydeb-1.deb#解包:该命令仅对 “mydeb-1.deb”进行解包操作,不会执行包配置工作
dpkg --unpack mydeb-1.deb#卸载:删除包,但保留配置文件
dpkg -r|--remove <package> 
# dpkg -r my-deb 
#该命令删除包,且删除配置文件
dpkg -P|--purge my-deb         #查看deb包是否安装/deb包的信息 
dpkg -s|--status <package>
# dpkg -s my-deb#查看deb包文件内容 
dpkg -c mydeb-1.deb#查看当前目录某个deb包的信息
dpkg --info mydeb-1.deb#解压deb中所要安装的文件
#第一个参数为所要解压的deb包,第二个参数为将deb包解压到指定的目录
dpkg -x  mydeb-1.deb mydeb-1#解压deb包中DEBIAN目录下的文件(至少包含control文件)
dpkg -e mydeb-1.deb mydeb-1/DEBIAN#列出与该包关联的文件 dpkg -L|--listfiles <package>
dpkg -L my-deb #配置软件包 
dpkg --configure <package>
# dpkg --configure my-deb#解压deb包中DEBIAN目录下的文件(至少包含control文件)
dpkg -e mydeb-1.deb mydeb-1/DEBIAN#列出与该包关联的文件 dpkg -L|--listfiles <package>
dpkg -L my-deb #配置软件包 
dpkg --configure <package>
# dpkg --configure my-deb

三、deb包相关文件说明

1.control文件

control 文件字段解析
字段 用途 例子/其他
Package 程序名称 中间不能有空格
Version 软件版本
Description 程序说明
Section 软件类别 utils, net, mail, text, x11
Priority 软件对于系统的重要程度 required, standard, optional, extra等;
Essential 是否是系统最基本的软件包 yes/no,若为yes,则不允许卸载(除非强制性卸载)
Architecture 软件所支持的平台架构 i386, amd64, m68k, sparc, alpha, powerpc等
Source 软件包的源代码名称
Depends 软件所依赖的其他软件包和库文件 若依赖多个软件包和库文件,采用逗号隔开
Pre-Depends 软件安装前必须安装、配置依赖性的软件包和库文件 常用于必须的预运行脚本需求
Recommends 推荐安装的其他软件包和库文件
Suggests 建议安装的其他软件包和库文件

2.preinst文件

在Deb包文件解包之前(即软件安装前),将会运行该脚本。可以停止作用于待升级软件包的服务,直到软件包安装或升级完成

3.postinst文件

负责完成安装包时的配置工作。如新安装或升级的软件重启服务

#软件安装完后,执行该Shell脚本,一般用来配置软件执行环境,必须以“#!/bin/sh”为首行#!/bin/sh
echo "my deb" > /root/mydeb.log#!/bin/sh
if [ "$1" = "configure" ]; then
/Applications/MobileLog.app/MobileLog -install
/bin/launchctl load -wF /System/Library/LaunchDaemons/com.iXtension.MobileLogDaemon.plist 
fi

4.prerm文件

该脚本负责停止与软件包相关联的daemon服务。它在删除软件包关联文件之前执行

#!/bin/sh
if [[ $1 == remove ]]; then
/Applications/MobileLog.app/MobileLog -uninstall
/bin/launchctl unload -wF /System/Library/LaunchDaemons/com.iXtension.MobileLogDaemon.plist 
fi

5.postrm文件

#软件卸载后,执行该Shell脚本,一般作为清理收尾工作,必须以“#!/bin/sh”为首行#!/bin/sh
rm -rf /root/mydeb.log

参考:

  • 11.1 生成源代码和二进制包
  • CPACK:我想这个deb安装执行后bash脚本,但它不工作
  • CPack DEB Generator
  • cmake CPack 打包指定目录
  • CPACK_SOURCE_IGNORE_FILES
  • CMake教程(三)- 将工程使用CPack工具打包成为一个deb包
  • 构建deb包前如何获取软件的依赖包
  • 【全网独家】手把手教你制作一个Ubuntu Deb 安装包
  • 用CMake打包deb包流程完整版(带字段解析)

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

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

相关文章

(转载)支持向量机(SVM)的回归拟合(matlab实现)

与传统的神经网络相比&#xff0c;SVM具有以下几个优点&#xff1a; (1)SVM是专门针对小样本问题而提出的&#xff0c;可以在有限样本的情况下获得最优解。 (2)SVM算法最终将转化为一个二次规划问题&#xff0c;从理论上讲可以得到全局最优解&#xff0c;从而解决了传统神经网…

linux 信号原理 信号处理设置signal, 信号发送kill,信号等待sigsuspend,信号阻塞sigprocmask,一网打尽信号使用

​专栏内容&#xff1a; postgresql内核源码分析 手写数据库toadb 并发编程 个人主页&#xff1a;我的主页 座右铭&#xff1a;天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物. 概述 信号是一种软中断的方式&#xff0c;让进程陷入中断处理调…

集成支付宝报错订单信息有错误,建议联系实家。 错误码: TOTAL FEE EXCEED

问题 集成支付宝报错——订单信息有错误&#xff0c;建议联系实家。 错误码: TOTAL FEE EXCEED 详细问题 笔者按照支付宝沙箱支付快速集成版进行操作&#xff0c;操作完成访问所集成的支付宝&#xff0c;页面如下 发起请求核心代码 response.sendRedirect("http://ip…

HCIA-HarmonyOS Application Developer学习笔记

目录 一、HarmonyOS 介绍二、HarmonyOS 应用开发流程HarmonyOS 系统架构HarmonyOS 子系统集DevEco StudioHarmonyOS 应用包结构使用资源文件的方法权限管理分布式能力 三、Ability 设计与开发Ability 的概念和分类页面生命周期Intent载体页面间导航Particle Ability 开发 四、U…

Java 动态规划 Licode面试题 08.01. 三步问题

代码展示&#xff1a; class Solution {int mod(int)1e97;public int waysToStep(int n) {//特殊情况处理if(n1||n2){return n;}if(n3){return 4;}//定义dp数组int[]dpnew int[n1];//初始化dp[1]1;dp[2]2;dp[3]4;for(int i4;i<n;i){dp[i]((dp[i-1]dp[i-2])%moddp[i-3])%mod…

git安装及初步使用

git的安装 &#xff1a; 在CentOS 7.6环境下可以使用一条语句就能安装git yum -y install git如果上面命令包以下错误&#xff0c;说明权限不够 [leijiefl ~]$ yum -y install git Loaded plugins: fastestmirror You need to be root to perform this command.可以转换成ro…

关于微服务治理的一些理解

关于微服务治理的一些理解 微服务架构存在的意义 根本意义 其主要目的还是为了解耦&#xff0c;提高灵活性和可扩展性&#xff01; 参考&#xff1a;https://zhuanlan.zhihu.com/p/462078779 相比单体 单体架构的性能高于微服务架构&#xff0c;微服务的负载能力低于单体架构…

【uniapp开发小程序】实现点击跳转手机通话 拨打电话功能

效果图&#xff1a; 代码展示&#xff1a; <template><view class"page-map"><view class"btn" click"telFun()" style"text-align: center;">电话咨询</view></view> </template> <script&g…

设计模式--------结构型模式

结构型模式 结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式&#xff0c;前者采用继承机制来组织接口和类&#xff0c;后者釆用组合或聚合来组合对象。 由于组合关系或聚合关系比继承关系耦合度低&#xff0c;满足“合成复用原则”…

如何解决PostgreSQL执行语句长时间卡着不动,不报错也不执行的问题?

1 问题现象 执行SQL语句&#xff0c;卡着不动&#xff0c;不成功也不执行&#xff0c;就像挂住了一样。 truncate table simple; 2 原因分析 一般来说&#xff0c;语句呈现卡着的状态&#xff0c;主要会是两种原因比较多&#xff0c; 原因1&#xff1a;SQL语句是一个耗时操…

Yolov5-Lite + Sort算法实现边缘目标跟踪

文章目录 前言项目结构Sort算法实现卡尔曼跟踪器工具类多目标跟踪器 整合 前言 昨天挖了个坑&#xff0c;那么今天的话把坑填上&#xff0c;只要是实现Sort算法和Yolov5-Lite的一个整合。当然先前的话&#xff0c;我们在Yolov3–Tiny的时候&#xff0c;也做了一个&#xff0c;…

flutter 更新分支内容

有三个分支&#xff0c;主分支&#xff0c;A分支&#xff0c;B分支&#xff0c;别人在B分支开发了内容&#xff0c;我在A分支进行开发。别人在B分支提交了代码&#xff0c;让我去拉下来。这时候我就是需要切到B分支&#xff0c;拉代码下来&#xff0c;然后再回到A分支&#xff…