将工程使用CPack工具打包成为一个deb包

为什么要打包

最简单的答案是,方便软件包管理。想象一下,一个团队可能有很多个人同时开发N个工程,这N个工程包含了无数个不同种类的可执行文件、静态库文件、动态库文件。这无数多个文件最终都需要部署到一台服务器上运行。这样这个服务器的文件系统就会非常凌乱,当需要进行卸载,升级等动作时,极有可能出现各种各样的问题。

而使用包管理工具来管理这些软件包,就可以避免上述的问题,减轻软件发布和维护的工作难度。

DEB是Debian所使用的软件包,所有Debian系的Linux发行版都可以使用DEB包管理工具来进行软件管理, 而CPack,则是CMake下的一个打包工具,其支持将软件打包成 .deb, .zip, .7z 等各种各样的软件包。

如何使用CPack打包成为deb包

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

  1. 设定软件包的属性(例如:包名称,包类型,版本号,作者等信息)
  2. 指定需要打包的文件(例如:可执行文件,静态库,动态库)

根据CMake教程(二)中的例子,我们只需要在CMakeLists.txt中添加打包的命令,如下:

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 PrinterChar
        RUNTIME DESTINATION /tmp/cmake_demo
        #LIBRARY DESTINATION /tmp/cmake_demo    # 通常,编译器只会在 </usr/lib> 和 </lib> 中找头文件,如果
        #ARCHIVE DESTINATION /tmp/cmake_demo    # 将库文件放在其他目录,可能会引起找不到库文件错误
        )

include(CPack)

然后重新执行, 即可生成对应的deb包。

cmake ..
make package

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

值得注意的是,静态库和动态库文件也可以指定安装的目录,但是由于编译器一般只会从/lib/usr/lib两个目录中寻找头文件,如果库文件放在别的地方,可能会引起运行可执行文件时出现找不到库文件的错误(当然其实是有其他解决方案的),所以可以不指定库文件的安装目录,这样库文件就会默认安装到/usr/lib中。

打包完成后,我们可以通过以下命令查看一下这个deb软件包的信息和内容:

dpkg-deb -I <deb包文件>
dpkg -c <deb包文件>

在这里插入图片描述到此,deb包打包成功。

附录: deb包的简单使用

sudo dpkg -i <deb包文件># 安装deb包
sudo dpkg -l# 显示已经安装的包
sudo dpkg -P <包名称># 卸载指定的软件包

转自:

posted @ 2022-10-22 16:23  MasonLee  阅读(627)  评论(0编辑  收藏  举报