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
相关产品推荐
相关产品推荐

