第八章:安装与打包

一、安装目标:让用户轻松部署

1. 基本安装命令

bash 复制代码
# 安装可执行文件
install(TARGETS MyApp
        RUNTIME DESTINATION bin
        BUNDLE DESTINATION bin)  # macOS专用

# 安装动态库
install(TARGETS MyLib
        LIBRARY DESTINATION lib
        ARCHIVE DESTINATION lib/static  # 静态库
        RUNTIME DESTINATION bin)        # Windows DLL

# 安装头文件
install(DIRECTORY include/ DESTINATION include
        FILES_MATCHING PATTERN "*.h")

# 安装资源文件
install(DIRECTORY assets/ DESTINATION share/${PROJECT_NAME}/assets)

2. 安装路径控制

变量 Unix默认值 Windows默认值 用途
CMAKE_INSTALL_PREFIX /usr/local C:/Program Files 安装根目录
CMAKE_INSTALL_BINDIR bin bin 可执行文件
CMAKE_INSTALL_LIBDIR lib lib 库文件
CMAKE_INSTALL_INCLUDEDIR include include 头文件
scss 复制代码
# 使用GNUInstallDirs标准化路径
include(GNUInstallDirs)

install(TARGETS MyApp
        RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})

3. 安装导出目标

bash 复制代码
# 创建导出目标
install(TARGETS MyLib EXPORT MyLibTargets
        LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
        ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}/static
        INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})

# 导出目标文件
install(EXPORT MyLibTargets
        FILE MyLibTargets.cmake
        DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/MyLib)

# 生成配置文件
include(CMakePackageConfigHelpers)
configure_package_config_file(
    ${CMAKE_CURRENT_SOURCE_DIR}/Config.cmake.in
    ${CMAKE_CURRENT_BINARY_DIR}/MyLibConfig.cmake
    INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/MyLib
)

install(FILES ${CMAKE_CURRENT_BINARY_DIR}/MyLibConfig.cmake
        DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/MyLib)

二、使用CPack生成安装包

1. 基础CPack配置

bash 复制代码
include(CPack)

# 设置包基本信息
set(CPACK_PACKAGE_NAME "MyApplication")
set(CPACK_PACKAGE_VERSION ${PROJECT_VERSION})
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "My awesome application")
set(CPACK_PACKAGE_VENDOR "My Company")
set(CPACK_PACKAGE_CONTACT "support@example.com")
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE.txt")

2. 生成平台特定包

Windows NSIS安装程序

bash 复制代码
set(CPACK_GENERATOR "NSIS")
set(CPACK_NSIS_MUI_ICON "${CMAKE_SOURCE_DIR}/assets/installer.ico")
set(CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL ON)
set(CPACK_NSIS_MODIFY_PATH ON)  # 添加安装路径到系统PATH

Linux DEB/RPM包

bash 复制代码
set(CPACK_GENERATOR "DEB;RPM")
set(CPACK_DEBIAN_PACKAGE_MAINTAINER "Dev Team")
set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON)  # 自动检测依赖
set(CPACK_RPM_PACKAGE_RELEASE "1")      # 构建版本号
set(CPACK_DEBIAN_PACKAGE_DEPENDS "libc6 (>= 2.14), libstdc++6 (>= 4.9)")

macOS Bundle

bash 复制代码
set(CPACK_GENERATOR "Bundle")
set(CPACK_BUNDLE_NAME "My Application")
set(CPACK_BUNDLE_ICON "${CMAKE_SOURCE_DIR}/macos/AppIcon.icns")
set(CPACK_BUNDLE_PLIST "${CMAKE_BINARY_DIR}/Info.plist")

3. 组件化安装包

scss 复制代码
# 定义组件
cpack_add_component(Runtime DISPLAY_NAME "Runtime" REQUIRED)
cpack_add_component(Development DISPLAY_NAME "Development")
cpack_add_component(Documentation DISPLAY_NAME "Documentation")

# 分配安装目标到组件
install(TARGETS MyApp
        RUNTIME DESTINATION bin
        COMPONENT Runtime)
        
install(DIRECTORY include/ DESTINATION include
        COMPONENT Development)
        
install(FILES README.md DESTINATION doc
        COMPONENT Documentation)

三、高级安装技巧

1. 安装后脚本

makefile 复制代码
# Windows注册COM组件
install(CODE "execute_process(COMMAND regsvr32 /s $<TARGET_FILE:MyComComponent>)"
        COMPONENT Runtime)

# Linux更新动态链接库缓存
install(CODE "execute_process(COMMAND ldconfig)"
        COMPONENT Runtime)

2. 跨平台桌面集成

bash 复制代码
# Windows创建快捷方式
configure_file(${CMAKE_SOURCE_DIR}/cmake/WindowsCreateShortcut.cmake.in
               ${CMAKE_BINARY_DIR}/WindowsCreateShortcut.cmake @ONLY)
install(SCRIPT ${CMAKE_BINARY_DIR}/WindowsCreateShortcut.cmake
        COMPONENT Runtime)

# Linux创建.desktop文件
install(FILES ${CMAKE_BINARY_DIR}/MyApp.desktop
        DESTINATION share/applications
        COMPONENT Runtime)

3. 安装许可证

bash 复制代码
install(FILES LICENSE.txt
        DESTINATION ${CMAKE_INSTALL_DOCDIR}
        RENAME copyright)  # Debian要求

四、实战:创建跨平台安装包

1. 完整安装配置示例

scss 复制代码
include(GNUInstallDirs)
include(CPack)

# 安装目标
install(TARGETS MyApp
        RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
        BUNDLE DESTINATION ${CMAKE_INSTALL_BINDIR}  # macOS
        COMPONENT Runtime)

# 安装头文件(开发包)
install(DIRECTORY include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
        COMPONENT Development)

# 安装文档
install(FILES README.md LICENSE.txt
        DESTINATION ${CMAKE_INSTALL_DOCDIR}
        COMPONENT Documentation)

# 导出目标(开发包)
install(EXPORT MyAppTargets
        FILE MyAppTargets.cmake
        DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/MyApp)

# CPack配置
set(CPACK_PACKAGE_NAME ${PROJECT_NAME})
set(CPACK_PACKAGE_VERSION ${PROJECT_VERSION})
set(CPACK_PACKAGE_DESCRIPTION "My cross-platform application")
set(CPACK_PACKAGE_VENDOR "My Company")
set(CPACK_PACKAGE_CONTACT "contact@example.com")
set(CPACK_DEBIAN_PACKAGE_DEPENDS "libc6 (>= 2.14), libstdc++6 (>= 4.9)")
set(CPACK_NSIS_MODIFY_PATH ON)  # 添加安装路径到系统PATH

# 组件设置
cpack_add_component(Runtime DISPLAY_NAME "Runtime" REQUIRED)
cpack_add_component(Development DISPLAY_NAME "Development"
                   DEPENDS Runtime)
cpack_add_component(Documentation DISPLAY_NAME "Documentation"
                   DEPENDS Runtime)

include(CPack)

2. 生成安装包命令

bash 复制代码
# 配置项目
cmake -B build -DCMAKE_INSTALL_PREFIX=/usr/local

# 构建项目
cmake --build build

# 安装到本地系统(可选)
cmake --install build --prefix install_dir

# 生成安装包
cd build
cpack -G DEB  # 生成Debian包
cpack -G NSIS # 生成Windows安装程序
cpack -G Bundle # 生成macOS应用包

五、安装与打包最佳实践

  1. 路径标准化 :始终使用GNUInstallDirs定义安装路径

  2. 组件分离:将运行时、开发和文档分开打包

  3. 依赖声明:在Linux包中声明依赖关系

  4. 签名机制:对安装包进行数字签名

    bash 复制代码
    # macOS代码签名
    set(CPACK_BUNDLE_APPLE_CERT_APP "Developer ID Application: My Company")
  5. 测试安装:在虚拟环境中测试安装包

  6. 版本兼容:使用语义化版本控制(Semantic Versioning)

相关推荐
oioihoii19 分钟前
C++随机打乱函数:简化源码与原理深度剖析
开发语言·c++·算法
WZF-Sang1 小时前
计算机网络基础——1
网络·c++·git·学习·计算机网络·智能路由器
默凉2 小时前
C++ 虚函数(多态,多重继承,菱形继承)
开发语言·c++
小庞在加油2 小时前
《重构项目》基于Apollo架构设计的项目重构方案(多种地图、多阶段、多任务、状态机管理)
c++·重构·apollo架构
让我们一起加油好吗3 小时前
【基础算法】贪心 (四) :区间问题
c++·算法·贪心算法·洛谷
双叶8363 小时前
(C++)任务管理系统(正式版)(迭代器)(list列表基础教程)(STL基础知识)
c语言·开发语言·数据结构·c++·list
七七七七074 小时前
类与对象【下篇】-- 关于类的其它语法
c语言·开发语言·c++
黄皮の电气鼠4 小时前
C++:继承
开发语言·c++·算法
shylyly_4 小时前
专题一_双指针_查找总价格为目标值的两个商品
c++·算法·leetcode·双指针·查找总价格为目标值的两个商品·和为s的两个数
R-G-B4 小时前
【03】MFC入门到精通——MFC 添加控件 设置属性 按钮 文本框
c++·mfc·mfc添加控件