当前位置: 首页 > news >正文

【CMake】`install()` 命令详解

install()是 CMake 中用于定义安装规则的核心命令,它指定了项目构建后如何被安装到目标系统目录中,是创建可分发软件包的基础。

基本语法概览

# 安装目标(可执行文件、库等) install(TARGETS <target>... [...]) # 安装文件 install(FILES <file>... [...]) # 安装目录 install(DIRECTORY <dir>... [...]) # 安装脚本 install(SCRIPT <file> [...]) # 安装代码 install(CODE <code> [...]) # 安装导出 install(EXPORT <export-name> [...]) # 安装运行时依赖 install(RUNTIME_DEPENDENCY_SET <set-name> [...]) # 安装生成的配置文件 install(IMPORTED_RUNTIME_ARTIFACTS <target>... [...])

详细参数解析

1.安装目标(TARGETS)

基本语法
install(TARGETS <target>... [EXPORT <export-name>] [RUNTIME_DEPENDENCIES <arg>...] [[ARCHIVE|LIBRARY|RUNTIME|OBJECTS|FRAMEWORK|BUNDLE| PRIVATE_HEADER|PUBLIC_HEADER|RESOURCE|FILE_SET <set-name>] [DESTINATION <dir>] [PERMISSIONS <permissions>...] [CONFIGURATIONS [Debug|Release|...]] [COMPONENT <component>] [NAMELINK_COMPONENT <component>] [OPTIONAL] [EXCLUDE_FROM_ALL] [NAMELINK_ONLY|NAMELINK_SKIP] ] [...] [INCLUDES DESTINATION [<dir> ...]] )
目标类型详解
类型说明默认安装目录典型文件
ARCHIVE静态库和导入库${CMAKE_INSTALL_LIBDIR}.a,.lib
LIBRARY共享库(动态库)${CMAKE_INSTALL_LIBDIR}.so,.dylib,.dll
RUNTIME可执行文件和DLL${CMAKE_INSTALL_BINDIR}.exe,.dll(Windows)
OBJECTS对象文件${CMAKE_INSTALL_LIBDIR}.obj,.o
FRAMEWORKmacOS框架Frameworks目录.framework
BUNDLEmacOS应用程序包Applications目录.app
PRIVATE_HEADER私有头文件${CMAKE_INSTALL_INCLUDEDIR}.h,.hpp
PUBLIC_HEADER公共头文件${CMAKE_INSTALL_INCLUDEDIR}.h,.hpp
RESOURCE资源文件${CMAKE_INSTALL_DATADIR}图像、配置文件等
示例
# 安装可执行文件 add_executable(myapp main.cpp) install(TARGETS myapp RUNTIME DESTINATION bin CONFIGURATIONS Release ) # 安装库(同时安装头文件) add_library(mylib STATIC mylib.cpp) target_include_directories(mylib PUBLIC include) install(TARGETS mylib ARCHIVE DESTINATION lib PUBLIC_HEADER DESTINATION include/mylib COMPONENT development ) # 安装共享库(带版本控制) add_library(myshared SHARED myshared.cpp) set_target_properties(myshared PROPERTIES VERSION 1.2.3 SOVERSION 1 ) install(TARGETS myshared LIBRARY DESTINATION lib COMPONENT runtime NAMELINK_SKIP # 不创建符号链接 LIBRARY DESTINATION lib COMPONENT development NAMELINK_ONLY # 只安装符号链接 PUBLIC_HEADER DESTINATION include COMPONENT development )

2.安装文件(FILES)

基本语法
install(FILES <file>... [DESTINATION <dir>] [PERMISSIONS <permissions>...] [CONFIGURATIONS [Debug|Release|...]] [COMPONENT <component>] [RENAME <name>] [OPTIONAL] [EXCLUDE_FROM_ALL] )
示例
# 安装单个文件 install(FILES README.md DESTINATION doc COMPONENT documentation ) # 安装多个文件 install(FILES LICENSE AUTHORS CHANGELOG.md DESTINATION doc ) # 安装配置文件(带权限) install(FILES config.ini DESTINATION etc/myapp PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ ) # 安装生成的文件 configure_file(config.h.in config.h @ONLY) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/config.h DESTINATION include ) # 安装并重命名 install(FILES myapp.desktop DESTINATION share/applications RENAME com.company.myapp.desktop ) # 条件安装 if(UNIX AND NOT APPLE) install(FILES myapp.man DESTINATION share/man/man1 RENAME myapp.1 ) endif()

3.安装目录(DIRECTORY)

基本语法
install(DIRECTORY <dir>... [DESTINATION <dir>] [FILE_PERMISSIONS <permissions>...] [DIRECTORY_PERMISSIONS <permissions>...] [USE_SOURCE_PERMISSIONS] [CONFIGURATIONS [Debug|Release|...]] [COMPONENT <component>] [FILES_MATCHING] [[PATTERN <pattern> | REGEX <regex>] [EXCLUDE] [PERMISSIONS <permissions>...]] [...] [EXCLUDE_FROM_ALL] )
示例
# 安装整个目录 install(DIRECTORY assets/ DESTINATION share/myapp ) # 安装目录内容(不包括目录本身) install(DIRECTORY include/ DESTINATION include FILES_MATCHING PATTERN "*.h" ) # 使用模式匹配 install(DIRECTORY data/ DESTINATION share/myapp/data PATTERN ".gitignore" EXCLUDE PATTERN "*.tmp" EXCLUDE PATTERN "*.log" EXCLUDE PATTERN "test_*" EXCLUDE PATTERN "*.png" PERMISSIONS OWNER_READ GROUP_READ WORLD_READ ) # 复杂过滤 install(DIRECTORY ${CMAKE_SOURCE_DIR}/resources/ DESTINATION resources USE_SOURCE_PERMISSIONS REGEX "\\.svn" EXCLUDE REGEX "\\.git" EXCLUDE PATTERN "*.txt" PERMISSIONS OWNER_WRITE OWNER_READ PATTERN "*.json" PERMISSIONS OWNER_READ GROUP_READ ) # 安装空目录 install(DIRECTORY DESTINATION var/log/myapp DIRECTORY_PERMISSIONS OWNER_WRITE OWNER_READ OWNER_EXECUTE )

4.安装脚本和代码

SCRIPT 模式
# 安装时运行脚本 install(SCRIPT postinstall.cmake COMPONENT runtime ) # postinstall.cmake 示例: # message(STATUS "运行安装后脚本") # execute_process(COMMAND ldconfig)
CODE 模式
# 直接在 CMakeLists.txt 中嵌入安装代码 install(CODE " message(STATUS \"自定义安装步骤\") file(WRITE \${CMAKE_INSTALL_PREFIX}/version.txt \"${PROJECT_VERSION}\") execute_process( COMMAND \${CMAKE_COMMAND} -E create_symlink current_version \${CMAKE_INSTALL_PREFIX}/latest ) ")

5.安装导出(EXPORT)

用于导出目标供其他项目使用。

# 创建可导出的目标 add_library(mylib STATIC mylib.cpp) install(TARGETS mylib EXPORT mylib-targets ARCHIVE DESTINATION lib INCLUDES DESTINATION include ) # 导出目标文件 install(EXPORT mylib-targets FILE mylib-config.cmake NAMESPACE MyLib:: DESTINATION lib/cmake/mylib COMPONENT development ) # 创建包配置文件 include(CMakePackageConfigHelpers) configure_package_config_file( ${CMAKE_CURRENT_SOURCE_DIR}/mylib-config.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/mylib-config.cmake INSTALL_DESTINATION lib/cmake/mylib ) write_basic_package_version_file( ${CMAKE_CURRENT_BINARY_DIR}/mylib-config-version.cmake VERSION ${PROJECT_VERSION} COMPATIBILITY SameMajorVersion ) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/mylib-config.cmake ${CMAKE_CURRENT_BINARY_DIR}/mylib-config-version.cmake DESTINATION lib/cmake/mylib )

6.安装运行时依赖(RUNTIME_DEPENDENCY_SET)

# 收集运行时依赖 install(TARGETS myapp RUNTIME_DEPENDENCY_SET myapp_deps RUNTIME DESTINATION bin ) # 安装依赖 install(RUNTIME_DEPENDENCY_SET myapp_deps PRE_EXCLUDE_REGEXES \"^api-ms-\" \"^ext-ms-\" POST_EXCLUDE_REGEXES \".*system32/.*\\.dll\" DIRECTORIES $<TARGET_FILE_DIR:myapp> DESTINATION bin )

安装组件(COMPONENT)

组件化安装

# 定义组件 set(CPACK_COMPONENTS_ALL runtime development documentation) # 安装运行时组件 install(TARGETS myapp RUNTIME DESTINATION bin COMPONENT runtime ) # 安装开发组件 install(TARGETS mylib ARCHIVE DESTINATION lib PUBLIC_HEADER DESTINATION include COMPONENT development ) # 安装文档组件 install(FILES README.md LICENSE DESTINATION doc/myapp COMPONENT documentation ) # 安装示例(单独组件) install(DIRECTORY examples/ DESTINATION share/examples/myapp COMPONENT examples )

组件依赖

# 设置组件依赖关系 set(CPACK_COMPONENT_RUNTIME_DISPLAY_NAME "Runtime") set(CPACK_COMPONENT_DEVELOPMENT_DISPLAY_NAME "Development Files") set(CPACK_COMPONENT_DOCUMENTATION_DISPLAY_NAME "Documentation") set(CPACK_COMPONENT_DEVELOPMENT_DEPENDS runtime) set(CPACK_COMPONENT_DOCUMENTATION_DEPENDS runtime)

权限设置(PERMISSIONS)

文件权限

# 常用权限组合 install(FILES script.sh DESTINATION bin PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE ) # 配置文件权限 install(FILES config.json DESTINATION etc/myapp PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ ) # 数据文件权限 install(FILES data.db DESTINATION var/lib/myapp PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_NONE # 无权限 )

目录权限

install(DIRECTORY data/ DESTINATION var/lib/myapp DIRECTORY_PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE FILE_PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ )

配置相关安装(CONFIGURATIONS)

按构建类型安装

# 只安装 Release 版本 install(TARGETS myapp RUNTIME DESTINATION bin CONFIGURATIONS Release COMPONENT runtime ) # Debug 版本安装到不同位置 install(TARGETS myapp RUNTIME DESTINATION debug/bin CONFIGURATIONS Debug COMPONENT debug ) # 安装不同配置的文件 install(FILES $<IF:$<CONFIG:Debug>,debug.conf,release.conf> DESTINATION etc/myapp RENAME myapp.conf ) # 条件安装资源 install(DIRECTORY resources/ DESTINATION share/myapp CONFIGURATIONS Release RelWithDebInfo PATTERN "debug_*" EXCLUDE )

安装路径变量

CMake 预定义路径变量

变量默认值 (Unix)默认值 (Windows)说明
CMAKE_INSTALL_PREFIX/usr/localC:/Program Files/<project>安装前缀
CMAKE_INSTALL_BINDIRbinbin可执行文件目录
CMAKE_INSTALL_SBINDIRsbinsbin系统可执行文件目录
CMAKE_INSTALL_LIBDIRliblib库文件目录
CMAKE_INSTALL_INCLUDEDIRincludeinclude头文件目录
CMAKE_INSTALL_DATADIRshareshare数据文件目录
CMAKE_INSTALL_DATAROOTDIRshareshare数据根目录
CMAKE_INSTALL_MANDIRshare/manshare/man手册页目录
CMAKE_INSTALL_DOCDIRshare/docshare/doc文档目录

使用 GNUInstallDirs 模块

# 包含 GNU 标准安装目录 include(GNUInstallDirs) # 使用变量 install(TARGETS myapp RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} ) install(FILES myapp.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/myapp )

自定义安装布局

# 自定义安装前缀 if(WIN32) set(INSTALL_PREFIX "C:/MyCompany/MyApp") else() set(INSTALL_PREFIX "/opt/myapp") endif() # 自定义目录结构 set(MYAPP_BIN_DIR "${INSTALL_PREFIX}/bin") set(MYAPP_LIB_DIR "${INSTALL_PREFIX}/lib") set(MYAPP_INCLUDE_DIR "${INSTALL_PREFIX}/include") set(MYAPP_DATA_DIR "${INSTALL_PREFIX}/share/myapp") set(MYAPP_CONFIG_DIR "${INSTALL_PREFIX}/etc/myapp") install(TARGETS myapp RUNTIME DESTINATION ${MYAPP_BIN_DIR} LIBRARY DESTINATION ${MYAPP_LIB_DIR} ARCHIVE DESTINATION ${MYAPP_LIB_DIR} )

完整项目示例

示例1:简单应用程序

cmake_minimum_required(VERSION 3.15) project(SimpleApp VERSION 1.0.0) # 创建可执行文件 add_executable(simple_app main.cpp) # 包含 GNU 安装目录 include(GNUInstallDirs) # 安装可执行文件 install(TARGETS simple_app RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT applications ) # 安装文档 install(FILES README.md LICENSE.txt DESTINATION ${CMAKE_INSTALL_DOCDIR}/simple_app COMPONENT documentation ) # 安装桌面文件 (Linux) if(UNIX AND NOT APPLE) install(FILES simple_app.desktop DESTINATION share/applications COMPONENT applications ) install(FILES icons/simple_app.png DESTINATION share/icons/hicolor/48x48/apps COMPONENT applications ) endif() # 安装配置文件 install(FILES config.ini DESTINATION ${CMAKE_INSTALL_SYSCONFDIR}/simple_app PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_NONE COMPONENT configuration ) # 安装示例数据 install(DIRECTORY examples/ DESTINATION ${CMAKE_INSTALL_DATADIR}/simple_app/examples COMPONENT examples PATTERN ".gitkeep" EXCLUDE )

示例2:库项目安装

cmake_minimum_required(VERSION 3.16) project(MathLibrary VERSION 2.5.0 LANGUAGES CXX) # 创建库 add_library(math STATIC math.cpp) add_library(math_shared SHARED math.cpp) # 设置版本 set_target_properties(math_shared PROPERTIES VERSION ${PROJECT_VERSION} SOVERSION 2 OUTPUT_NAME math ) # 头文件 target_include_directories(math PUBLIC include) target_include_directories(math_shared PUBLIC include) include(GNUInstallDirs) # 安装库文件 install(TARGETS math math_shared EXPORT MathLibraryTargets ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT development LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT runtime NAMELINK_SKIP LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT development NAMELINK_ONLY PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/math COMPONENT development ) # 安装导出文件 install(EXPORT MathLibraryTargets FILE MathLibraryConfig.cmake NAMESPACE Math:: DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/MathLibrary COMPONENT development ) # 创建包配置文件 include(CMakePackageConfigHelpers) configure_package_config_file( ${CMAKE_CURRENT_SOURCE_DIR}/cmake/MathLibraryConfig.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/MathLibraryConfig.cmake INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/MathLibrary PATH_VARS CMAKE_INSTALL_INCLUDEDIR CMAKE_INSTALL_LIBDIR ) write_basic_package_version_file( ${CMAKE_CURRENT_BINARY_DIR}/MathLibraryConfigVersion.cmake VERSION ${PROJECT_VERSION} COMPATIBILITY SameMajorVersion ) # 安装配置文件 install(FILES ${CMAKE_CURRENT_BINARY_DIR}/MathLibraryConfig.cmake ${CMAKE_CURRENT_BINARY_DIR}/MathLibraryConfigVersion.cmake DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/MathLibrary COMPONENT development ) # 安装文档 install(DIRECTORY docs/ DESTINATION ${CMAKE_INSTALL_DOCDIR}/MathLibrary COMPONENT documentation FILE_PERMISSIONS OWNER_READ GROUP_READ WORLD_READ ) # 安装示例 install(DIRECTORY examples/ DESTINATION ${CMAKE_INSTALL_DATADIR}/MathLibrary/examples COMPONENT examples PATTERN "CMakeLists.txt" EXCLUDE )

示例3:跨平台应用程序

cmake_minimum_required(VERSION 3.18) project(CrossPlatformApp VERSION 3.1.0) # 应用程序 add_executable(cp_app WIN32 MACOSX_BUNDLE main.cpp) # 平台特定设置 if(APPLE) # macOS 应用程序包设置 set_target_properties(cp_app PROPERTIES MACOSX_BUNDLE TRUE MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/Info.plist.in MACOSX_BUNDLE_BUNDLE_NAME "CrossPlatformApp" MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR} MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION} MACOSX_BUNDLE_GUI_IDENTIFIER "com.company.crossplatformapp" ) endif() # 安装配置 if(WIN32) set(INSTALL_PREFIX "C:/Program Files/CrossPlatformApp") elseif(APPLE) set(INSTALL_PREFIX "/Applications") else() set(INSTALL_PREFIX "/opt/crossplatformapp") endif() # 安装可执行文件 if(APPLE) install(TARGETS cp_app BUNDLE DESTINATION . COMPONENT applications ) else() install(TARGETS cp_app RUNTIME DESTINATION bin COMPONENT applications ) endif() # 安装资源文件 install(DIRECTORY resources/ DESTINATION ${INSTALL_PREFIX}/resources COMPONENT resources USE_SOURCE_PERMISSIONS PATTERN ".DS_Store" EXCLUDE PATTERN "Thumbs.db" EXCLUDE ) # 安装平台特定文件 if(WIN32) install(FILES windows/installer.nsi windows/logo.ico DESTINATION ${INSTALL_PREFIX} COMPONENT windows_specific ) # 安装运行时依赖 install(CODE " file(GLOB_RECURSE DLLS \"${CMAKE_BINARY_DIR}/*.dll\") foreach(dll IN LISTS DLLS) get_filename_component(dll_name \${dll} NAME) install(FILES \${dll} DESTINATION bin COMPONENT runtime_deps ) endforeach() ") elseif(APPLE) # macOS 特定安装 install(FILES macos/AppIcon.icns DESTINATION ${INSTALL_PREFIX}/CrossPlatformApp.app/Contents/Resources COMPONENT macos_specific ) install(SCRIPT macos/postinstall.cmake COMPONENT macos_specific ) else() # Linux 特定安装 install(FILES linux/crossplatformapp.desktop DESTINATION share/applications COMPONENT linux_specific ) install(FILES linux/crossplatformapp.appdata.xml DESTINATION share/appdata COMPONENT linux_specific ) install(FILES linux/icon.svg DESTINATION share/icons/hicolor/scalable/apps COMPONENT linux_specific ) # 安装 systemd 服务文件 if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/linux/crossplatformapp.service) install(FILES linux/crossplatformapp.service DESTINATION lib/systemd/system PERMISSIONS OWNER_READ GROUP_READ WORLD_READ COMPONENT linux_specific ) endif() endif() # 安装文档 install(DIRECTORY docs/ DESTINATION ${INSTALL_PREFIX}/docs COMPONENT documentation PATTERN "*.md" PERMISSIONS OWNER_READ GROUP_READ WORLD_READ ) # 安装许可证 install(FILES LICENSE DESTINATION ${INSTALL_PREFIX} RENAME LICENSE.txt COMPONENT documentation ) # 安装后的脚本 install(CODE " message(STATUS \"安装完成!\") message(STATUS \"安装目录: ${INSTALL_PREFIX}\") if(UNIX AND NOT APPLE) # 更新桌面数据库 execute_process( COMMAND update-desktop-database WORKING_DIRECTORY share/applications ) # 更新图标缓存 execute_process( COMMAND gtk-update-icon-cache -f -t share/icons/hicolor ) endif() ")

最佳实践

1.使用组件管理

# 明确组件划分 set(CPACK_COMPONENTS_ALL runtime development documentation examples tools ) # 为每个组件设置显示名称 set(CPACK_COMPONENT_RUNTIME_DISPLAY_NAME "应用程序") set(CPACK_COMPONENT_DEVELOPMENT_DISPLAY_NAME "开发文件") set(CPACK_COMPONENT_DOCUMENTATION_DISPLAY_NAME "文档") set(CPACK_COMPONENT_EXAMPLES_DISPLAY_NAME "示例") set(CPACK_COMPONENT_TOOLS_DISPLAY_NAME "工具") # 设置组件依赖 set(CPACK_COMPONENT_DEVELOPMENT_DEPENDS runtime) set(CPACK_COMPONENT_EXAMPLES_DEPENDS runtime) set(CPACK_COMPONENT_TOOLS_DEPENDS runtime)

2.正确处理权限

# 可执行文件 install(TARGETS myapp RUNTIME DESTINATION bin PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE ) # 配置文件 install(FILES config.yaml DESTINATION etc/myapp PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_NONE # 敏感配置 ) # 数据目录 install(DIRECTORY data/ DESTINATION var/lib/myapp DIRECTORY_PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_NONE )

3.支持重定位安装

# 使用相对路径 install(TARGETS myapp RUNTIME DESTINATION bin ) # 在配置文件中处理重定位 configure_file( ${CMAKE_SOURCE_DIR}/cmake/config.h.in ${CMAKE_BINARY_DIR}/config.h @ONLY ) # config.h.in 中使用相对路径 #define INSTALL_BIN_DIR "@CMAKE_INSTALL_BINDIR@" #define INSTALL_DATA_DIR "@CMAKE_INSTALL_DATADIR@" # 或在运行时检测 install(CODE " file(RELATIVE_PATH REL_BIN_DIR \"@CMAKE_INSTALL_PREFIX@\" \"@CMAKE_INSTALL_FULL_BINDIR@\" ) file(WRITE @CMAKE_INSTALL_PREFIX@/relative_paths.txt \"BIN_DIR=\${REL_BIN_DIR}\\n\" ) ")

4.处理版本控制

# 库版本控制 set_target_properties(mylib PROPERTIES VERSION ${PROJECT_VERSION} SOVERSION ${PROJECT_VERSION_MAJOR} OUTPUT_NAME mylib ) install(TARGETS mylib LIBRARY DESTINATION lib COMPONENT runtime NAMELINK_SKIP LIBRARY DESTINATION lib COMPONENT development NAMELINK_ONLY ) # 安装版本化文件 install(FILES ${CMAKE_CURRENT_BINARY_DIR}/mylib-${PROJECT_VERSION}.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig RENAME mylib.pc )

常见问题和解决方案

问题1:安装路径不存在

# 确保目录存在 install(CODE " file(MAKE_DIRECTORY @CMAKE_INSTALL_PREFIX@/var/log/myapp) file(MAKE_DIRECTORY @CMAKE_INSTALL_PREFIX@/etc/myapp) ") # 或在安装时创建 install(DIRECTORY DESTINATION var/log/myapp DIRECTORY_PERMISSIONS OWNER_WRITE OWNER_READ OWNER_EXECUTE )

问题2:符号链接处理

# 创建符号链接 install(CODE " execute_process( COMMAND @CMAKE_COMMAND@ -E create_symlink @CMAKE_INSTALL_FULL_BINDIR@/myapp @CMAKE_INSTALL_FULL_BINDIR@/myapp-current ) ") # 或使用自定义命令 add_custom_command(TARGET myapp POST_BUILD COMMAND ${CMAKE_COMMAND} -E create_symlink $<TARGET_FILE:myapp> $<TARGET_FILE_DIR:myapp>/myapp-latest )

问题3:卸载支持

# 生成卸载脚本 configure_file( ${CMAKE_SOURCE_DIR}/cmake/uninstall.cmake.in ${CMAKE_BINARY_DIR}/uninstall.cmake @ONLY ) install(SCRIPT ${CMAKE_BINARY_DIR}/uninstall.cmake) # uninstall.cmake.in 内容: if(NOT CMAKE_INSTALL_PREFIX) set(CMAKE_INSTALL_PREFIX "@CMAKE_INSTALL_PREFIX@") endif() message(STATUS "卸载: ${CMAKE_INSTALL_PREFIX}") # 删除安装的文件 file(REMOVE_RECURSE ${CMAKE_INSTALL_PREFIX}/bin/myapp ${CMAKE_INSTALL_PREFIX}/lib/libmylib.so ${CMAKE_INSTALL_PREFIX}/include/mylib ${CMAKE_INSTALL_PREFIX}/share/myapp )

调试技巧

查看安装计划

# 打印安装信息 function(print_install_info) get_cmake_property(vars VARIABLES) foreach(var ${vars}) if(var MATCHES "^CMAKE_INSTALL_") message(STATUS "${var}=${${var}}") endif() endforeach() endfunction() print_install_info() # 检查安装目标 get_target_property(installed_targets install INSTALL_TARGETS) if(installed_targets) message(STATUS "已注册的安装目标:") foreach(target ${installed_targets}) message(STATUS " - ${target}") endforeach() endif()

验证安装规则

# 创建测试安装 add_custom_target(test_install COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR} --target install --prefix ${CMAKE_BINARY_DIR}/test_install COMMENT "测试安装到 ${CMAKE_BINARY_DIR}/test_install" ) # 检查安装结果 add_custom_target(verify_install COMMAND find ${CMAKE_BINARY_DIR}/test_install -type f | sort DEPENDS test_install COMMENT "验证安装的文件" )

与 CPack 集成

基本 CPack 配置

# 在 install() 命令之后添加 CPack 配置 include(InstallRequiredSystemLibraries) set(CPACK_PACKAGE_NAME "${PROJECT_NAME}") set(CPACK_PACKAGE_VENDOR "My Company") set(CPACK_PACKAGE_VERSION "${PROJECT_VERSION}") set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "My Application") set(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_SOURCE_DIR}/README.md") set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/LICENSE") # 生成器特定配置 if(WIN32) set(CPACK_GENERATOR "NSIS;ZIP") set(CPACK_NSIS_MODIFY_PATH ON) elseif(APPLE) set(CPACK_GENERATOR "DragNDrop;TGZ") set(CPACK_DMG_VOLUME_NAME "${PROJECT_NAME}") else() set(CPACK_GENERATOR "DEB;RPM;TGZ") set(CPACK_DEBIAN_PACKAGE_MAINTAINER "maintainer@example.com") endif() include(CPack)

install()命令是 CMake 项目中专业分发软件的关键,合理使用可以创建符合各种平台标准的安装包,确保软件能够正确部署到目标系统。

http://www.jsqmd.com/news/165558/

相关文章:

  • Nature Medicine | 新疗法通过免疫重置攻克难治性狼疮,这篇文章的Python代码是单细胞+空间转录组学分析的典范
  • 湖北省荆州市市自建房设计公司哪家强?2026年最新权威靠谱测评榜单抢先看 - 苏木2025
  • 绝佳教材 | 这篇模式生物(果蝇)多组学文章,涉及RNA-seq,ChIP-seq和ATAC-seq,代码全公开,值得好好学习
  • 为什么未来 3 年,AI 系统如果“不会拒绝”,就一定上不了线?
  • 2025-2026湖北省咸宁市自建房设计公司权威测评排行榜:核心推荐机构深度解析 - 苏木2025
  • debian 与 ubuntu 之 - CD-ROM in source
  • 一文读懂大数据分析与应用:核心概念、关键技术与实践框架
  • 2025年行业新趋势:十大智能印刷机强力推荐,印刷粘箱打包联动线/印刷开槽模切机/印刷联动线印刷机供货厂家推荐排行榜 - 品牌推荐师
  • 2025年,年末评选出来的hr人力资源管理系统品牌前10名榜单!
  • AI排名优化:提升品牌可见度的数字化营销新关键
  • 2025年java总结:缝缝补补又一年?
  • 研究生必看!9个高效降aigc工具推荐,轻松应对AI检测
  • Gemini 3 Flash:最强牛马的暴力逆袭
  • 力扣刷题:长按键入
  • 选择优质LED照明需考量光源、光效及设计方案
  • skynet源码学习-clusteragent.lua
  • python基于Vue的企业员工奖惩工资考勤管理系统的设计与实现_e45z9_django Flask pycharm项目
  • Java面试必看:同步方法和同步块到底该选哪个?
  • 谁懂啊!2026 转行网安太香了!480 万缺口 + 15K 起薪,薪资 + 工作内容 + 前景全解析!
  • 港大联合字节跳动提出JoVA:一种基于联合自注意力的视频-音频联合生成模型
  • 基于昇腾910B的文生图模型推理服务化部署
  • python基于Vue的农机配件仓库管理系统的设计与实现_56d42_django Flask pycharm项目
  • python基于Vue的减肥体脂健康运动健身器材管理系统的设计与实现_5m179_django Flask pycharm项目
  • debian 与 ubuntu 之 - sudo
  • 在线互动学习网站设计毕业论文+PPT(附源代码+演示视频)
  • 还在熬夜赶论文?7款AI神器帮你选题降重一站式搞定!
  • 油泵轴承厂家推荐榜单 油泵电机/液压泵/电缸/7308/7309/73010/7311/7305/7306/7313/7315长寿命轴承制造商推荐 - 小张666
  • python基于Vue的培训机构在线教育教学平台设计与实现_pff2s_django Flask pycharm项目
  • python基于Vue的客户关系订单服务管理系统设计与实现_37g31_django Flask pycharm项目
  • python基于Vue的拍卖管理系统设计与实现_django Flask pycharm项目