You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CMake REGEX REPLACE正则编译失败问题求助

问题根源

你的CMake正则表达式报错,是因为CMAKE_SOURCE_DIR路径里包含C++,其中的+是正则表达式的特殊元字符(用于表示匹配前面字符一次或多次),直接代入STRING(REGEX REPLACE)的模板时,会导致正则语法解析失败。

解决方案

推荐两种修复方式,优先选第二种(更安全、专门适配路径场景):

方案1:转义正则特殊字符

用string(ESCAPE)把路径中的正则特殊字符转义后再使用:

# add modules and dependencies
CU_SUBDIRLIST(sub_DIRS  "${CMAKE_SOURCE_DIR}/modules" FALSE FALSE)
FOREACH(subdir ${sub_DIRS})

    get_filename_component(MODULENAME ${subdir} NAME)

    if (";;${DISABLED_AC_MODULES};;" MATCHES ";;${MODULENAME};;")
        continue()
    endif()

    # 转义CMAKE_SOURCE_DIR中的正则特殊字符
    string(ESCAPE REGEX "${CMAKE_SOURCE_DIR}/" escaped_source_dir)
    STRING(REGEX REPLACE "^${escaped_source_dir}" "" subdir_rel ${subdir})

    if(EXISTS "${subdir}/CMakeLists.txt")
        add_subdirectory("${subdir_rel}")
    endif()
ENDFOREACH()

方案2:使用CMake原生相对路径命令

放弃正则,改用file(RELATIVE_PATH)——这是CMake专门设计用来获取相对路径的函数,完全规避正则特殊字符的问题:

# add modules and dependencies
CU_SUBDIRLIST(sub_DIRS  "${CMAKE_SOURCE_DIR}/modules" FALSE FALSE)
FOREACH(subdir ${sub_DIRS})

    get_filename_component(MODULENAME ${subdir} NAME)

    if (";;${DISABLED_AC_MODULES};;" MATCHES ";;${MODULENAME};;")
        continue()
    endif()

    # 直接获取相对路径,无需正则
    file(RELATIVE_PATH subdir_rel "${CMAKE_SOURCE_DIR}" "${subdir}")

    if(EXISTS "${subdir}/CMakeLists.txt")
        add_subdirectory("${subdir_rel}")
    endif()
ENDFOREACH()
补充说明

移除模块后CMake正常,是因为此时sub_DIRS为空,循环不会执行到正则替换的代码,因此不会触发正则语法错误。清理缓存无效,因为问题本质是路径中的特殊字符导致正则解析失败,与缓存无关。

内容的提问来源于stack exchange,提问作者AnchyDev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 05:25:50