不同操作系统下CMake include/src/install目录默认路径与配置问题
CMake跨平台默认安装路径与install指令说明
各系统通用默认头文件安装路径
CMake的安装路径根由内置变量CMAKE_INSTALL_PREFIX控制,不同系统的默认值符合对应平台的通用惯例,头文件默认都存放在根路径下的include目录中:
- Linux:默认
CMAKE_INSTALL_PREFIX为/usr/local,对应头文件默认路径就是/usr/local/include,完全符合Unix文件系统层级标准。 - MacOS:系统层面遵循Unix惯例,CMake默认
CMAKE_INSTALL_PREFIX同样为/usr/local,对应通用默认头文件路径为/usr/local/include。注意Apple Silicon设备上Homebrew安装的库默认存放在/opt/homebrew/include,这是包管理器自定义的路径,不属于系统级通用默认位置。 - Windows:没有类Unix的全局统一安装规范,CMake在Windows下的默认
CMAKE_INSTALL_PREFIX为C:/Program Files/${CMAKE_PROJECT_NAME},对应头文件默认存放在该目录下的include子文件夹,路径格式类似C:/Program Files/你的项目名/include。vcpkg等Windows包管理器安装的库会使用包管理器自身配置的路径,不属于系统通用默认位置。
给出的install指令有效性判断
你写的这段配置:
install(FILES include/sort/sort.hpp DESTINATION ${CMAKE_INSTALL_PREFIX}/include/${CMAKE_PROJECT_NAME}/sort)
基础场景下可以正常把文件复制到目标位置,但写法不符合CMake规范,存在兼容隐患:
- CMake的
install指令中,DESTINATION传入相对路径时,会自动拼接${CMAKE_INSTALL_PREFIX}作为路径前缀,不需要手动写前缀。手动拼接前缀会在安装临时重定向(比如制作安装包、使用DESTDIR参数指定临时安装根目录)的场景下出现路径拼接错误,导致文件安装位置异常。 - 跨平台兼容的标准写法应该去掉手动拼接的前缀,如下:
install(FILES include/sort/sort.hpp DESTINATION include/${CMAKE_PROJECT_NAME}/sort)
这种写法在全平台都能正常工作,也兼容CMake的各类安装、打包逻辑,会把头文件安装到对应平台默认include路径下的项目专属子目录中,避免和其他库的头文件重名冲突。
内容的提问来源于stack exchange,提问作者PetrasVestartasEPFL
相关产品推荐
相关产品推荐

