CMake宏定义中$<SEMICOLON>导致编译定义解析异常是什么原因?
问题原因
这不是CMake的bug,属于使用方式有误。
CMake中target_compile_definitions的参数本质是分号分隔的列表,你编写的\\$<SEMICOLON>在CMake预处理阶段会被解析为实际的分号,触发列表拆分逻辑:原本的单条编译定义会被从分号位置拆分为两个独立的列表项,后续的TEST_INFRASTRUCTURE_ENABLED等其他编译定义就会被错误拼接进前一个宏的展开内容中。
正确实现方案
有两种稳妥的写法可以避免这个问题:
方案1:双重转义分号+引号包裹
set(OPTIONAL_DEFINE_VALUE "template <typename T> using optional = nonstd::optional<T>\\;") target_compile_definitions(magic_enum INTERFACE "MAGIC_ENUM_USING_ALIAS_OPTIONAL=${OPTIONAL_DEFINE_VALUE}" )
用\\;转义分号,同时把整段定义用双引号包裹,避免CMake将分号识别为列表分隔符。
方案2:使用CMake原始字符串(更推荐)
# 用[==[]==]包裹的原始字符串不会处理内部转义,分号会被识别为普通字符 set(OPTIONAL_DEFINE_VALUE [==[template <typename T> using optional = nonstd::optional<T>;]==]) target_compile_definitions(magic_enum INTERFACE MAGIC_ENUM_USING_ALIAS_OPTIONAL=${OPTIONAL_DEFINE_VALUE} )
原始字符串会完全保留内部的字符格式,不需要额外转义,也不会触发列表拆分逻辑,更适合传递包含特殊字符的宏定义。
内容的提问来源于stack exchange,提问作者user2209008
相关产品推荐
相关产品推荐

