一、安装目标:让用户轻松部署
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应用包
五、安装与打包最佳实践
-
路径标准化 :始终使用
GNUInstallDirs
定义安装路径 -
组件分离:将运行时、开发和文档分开打包
-
依赖声明:在Linux包中声明依赖关系
-
签名机制:对安装包进行数字签名
bash# macOS代码签名 set(CPACK_BUNDLE_APPLE_CERT_APP "Developer ID Application: My Company")
-
测试安装:在虚拟环境中测试安装包
-
版本兼容:使用语义化版本控制(Semantic Versioning)