CMAKE_PREFIX_PATH环境变量与命令行参数的分隔符差异疑问
CMAKE_PREFIX_PATH环境变量与命令行参数分隔符差异的原因
环境变量:遵循Unix shell的路径分隔规则
在Unix系统中,所有环境变量的字符串解析都受shell规则约束,PATH类路径列表变量的标准分隔符是:。CMake读取环境变量时,会自动识别当前系统的路径分隔符,将其转换为CMake内部使用的;列表分隔符。
- 用
export CMAKE_PREFIX_PATH="/path/to/prefix1:/path/to/prefix2"时,shell传递给CMake的是带:分隔的字符串,CMake会自动拆分并转为内部的分号列表,因此生效。 - 用
export CMAKE_PREFIX_PATH="/path/to/prefix1;/path/to/prefix2"时,CMake会把整个带;的字符串视为单个路径项,无法匹配目标前缀,所以不生效。
命令行参数:直接遵循CMake内部列表规则
通过-D参数传递CMAKE_PREFIX_PATH时,字符串直接由CMake解析,不经过shell的路径分隔处理。CMake内部的列表分隔符是;,因此:
- 用
cmake .. -D CMAKE_PREFIX_PATH="/path/to/prefix1;/path/to/prefix2"时,CMake会按;拆分字符串为多个路径项,正常生效。 - 若用
:分隔,CMake会将整个字符串视为单一路径,无法识别为多个前缀路径,因此不生效。
文档未明确说明的原因
CMake文档中提到CMAKE_PREFIX_PATH是分号分隔的列表,指的是该变量在CMake内部的存储和使用格式,而非环境变量的输入格式。环境变量的输入需遵循操作系统的shell约定,这属于跨工具的通用规则,因此文档未特意单独标注这个例外情况。
内容的提问来源于stack exchange,提问作者rafoo
相关产品推荐
相关产品推荐

