CMake报错:明明是绝对路径却被识别为相对路径
你遇到的这个问题属于CMake路径解析的常见误判或小bug,明明是绝对路径却被识别为相对,可按以下步骤排查解决:
移除路径末尾的冗余斜杠
把代码里的$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/>改成$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>,末尾的斜杠可能干扰CMake的路径解析逻辑,导致它错误判定路径为相对。修改后的代码如下:# Headers target_include_directories(${PROJECT_NAME} PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include> $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}> $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}> PRIVATE ${CMAKE_CURRENT_LIST_DIR} )验证变量的绝对路径属性
在CMakeLists.txt中添加调试输出,确认变量展开后确实是绝对路径:message(STATUS "CMAKE_CURRENT_BINARY_DIR: ${CMAKE_CURRENT_BINARY_DIR}") message(STATUS "CMAKE_CURRENT_LIST_DIR: ${CMAKE_CURRENT_LIST_DIR}")执行CMake配置命令,查看控制台输出,如果其中某个变量显示为相对路径,那就是问题根源——正常情况下
CMAKE_CURRENT_BINARY_DIR和CMAKE_CURRENT_LIST_DIR都应该是绝对路径,若出现相对路径,说明项目配置中存在变量赋值异常。升级CMake版本
部分旧版本CMake(尤其是3.14之前的版本)在处理BUILD_INTERFACE这类generator表达式中的绝对路径时存在解析bug,升级到3.14及以上版本后,这类误判问题大多会被修复。检查目标类型
如果${PROJECT_NAME}对应的是INTERFACE库,CMake对其INCLUDE目录的检查更严格:INSTALL_INTERFACE段的路径必须是相对路径(相对于CMAKE_INSTALL_PREFIX),而BUILD_INTERFACE段可以是绝对路径。如果是普通的STATIC/SHARED库,则不存在这个限制,可排除此因素。
为什么绝对路径会被报错?
CMake的这个报错大概率是路径解析逻辑的误判:当路径末尾有冗余斜杠、路径包含特殊目录结构,或是旧版本CMake处理generator表达式时的bug,都可能导致它把绝对路径错误识别为相对路径。另外,若你使用了install(EXPORT)导出目标,CMake在配置导出阶段可能会错误地尝试转换BUILD_INTERFACE路径,也会触发这个报错。
内容的提问来源于stack exchange,提问作者glades

