CMake中正确转义分号与引号设置CMAKE_CROSSCOMPILING_EMULATOR
解决CMake中CMAKE_CROSSCOMPILING_EMULATOR的WINEPATH设置问题
正确设置方式
推荐使用env命令配合CMake生成器表达式$<SEMICOLON>规避分号被解析为列表分隔符的问题:
set(CMAKE_CROSSCOMPILING_EMULATOR "env" "WINEPATH=/usr/x86_64-w64-mingw32/lib$<SEMICOLON>/usr/lib/gcc/x86_64-w64-mingw32/9.3-posix" "wine")
如果路径需要复用,也可以先定义变量再转义处理:
# 定义原始分号分隔的路径 set(WINE_LIB_PATHS "/usr/x86_64-w64-mingw32/lib;/usr/lib/gcc/x86_64-w64-mingw32/9.3-posix") # 将分号替换为生成器表达式,避免CMake解析为列表分隔符 string(REPLACE ";" "$<SEMICOLON>" WINE_LIB_PATHS_ESCAPED "${WINE_LIB_PATHS}") # 最终设置模拟器变量 set(CMAKE_CROSSCOMPILING_EMULATOR "env" "WINEPATH=${WINE_LIB_PATHS_ESCAPED}" "wine")
之前写法的问题分析
- 直接写分号:CMake会将分号识别为列表元素分隔符,把
WINEPATH="..."拆成两个参数,导致分号被替换为空格,同时引号被转义; - 单反斜杠转义分号:CMake解析时会自动吃掉反斜杠,分号仍被当作列表分隔符,结果和第一种写法一致;
- 三重反斜杠转义分号:虽然保留了分号,但CMake会为包含特殊字符的参数自动添加额外引号,导致WINEPATH的值被多余引号包裹,wine无法正确识别该环境变量。
内容的提问来源于stack exchange,提问作者Rémi
相关产品推荐
相关产品推荐

