cmake_path的PARENT_PATH处理带尾斜杠路径异常:Bug还是特性?
CMake
cmake_path(GET PARENT_PATH) 尾斜杠问题:Bug还是特性? 问题描述
使用CMake 3.27.1时,调用cmake_path(GET ... PARENT_PATH)解析目录父路径时发现:当输入路径末尾带有/时,返回结果是去掉尾斜杠的原路径,而非预期的父目录。这一行为是Bug还是特性?若为特性,设计合理性何在?
测试代码
# cmake_path is available since CMake 3.20 cmake_minimum_required(VERSION 3.20) project(DemoParentPath CXX) set(path_in "/absolute/path/parent/child") cmake_path(GET path_in PARENT_PATH path_out) message(STATUS " in: \"${path_in}\", out: \"${path_out}\"") set(path_in "/absolute/path/parent/child/") cmake_path(GET path_in PARENT_PATH path_out) message(STATUS " in: \"${path_in}\", out: \"${path_out}\"") set(path_in "relative/path/parent/child") cmake_path(GET path_in PARENT_PATH path_out) message(STATUS " in: \"${path_in}\", out: \"${path_out}\"") set(path_in "relative/path/parent/child/") cmake_path(GET path_in PARENT_PATH path_out) message(STATUS " in: \"${path_in}\", out: \"${path_out}\"")
输出结果
Selecting Windows SDK version 10.0.19041.0 to target Windows 10.0.22621. in: "/absolute/path/parent/child", out: "/absolute/path/parent" in: "/absolute/path/parent/child/", out: "/absolute/path/parent/child" in: "relative/path/parent/child", out: "relative/path/parent" in: "relative/path/parent/child/", out: "relative/path/parent/child" Configuring done (0.0s)
结论:这是特性,而非Bug
设计合理性分析
- 严格遵循路径分量解析逻辑:CMake的
cmake_path命令基于「路径分量」拆分处理路径。末尾的/会被解析为一个空路径分量,调用PARENT_PATH时优先移除这个空分量,因此返回去掉尾斜杠的原路径;不带尾斜杠的路径最后一个分量是目录名,移除后自然得到父目录。 - 保障操作一致性:这种设计让路径操作可预测。例如对
/a/b/c/d/执行PARENT_PATH,第一次得到/a/b/c/d,第二次执行才会得到/a/b/c,完全符合「逐步移除最后一个路径分量」的逻辑。 - 匹配文件系统语义:在文件系统中,
/a/b/c和/a/b/c/虽指向同一目录,但语义有细微差别——尾斜杠强调「目录作为容器」。CMake的处理方式明确了这种差别对应的操作结果,避免歧义。
参考资料
- CMake官方文档:
cmake_path()分解操作(PARENT_PATH章节) - 技术博客:CMake父目录与尾斜杠问题
- 示例代码:CMake父目录测试用例
内容的提问来源于Stack Exchange,提问作者Gael Lorieul
相关产品推荐
相关产品推荐

