CMake多行生成器表达式如何正确使用?拆分写法导致头文件无法访问
CMake多行生成器表达式错误原因
你的改写版本存在两个核心错误:
- 生成器表达式配对错误:
$<BUILD_INTERFACE:与结尾>必须一一对应,你在第一个路径末尾额外加了>,导致生成器表达式提前闭合,第二个路径被拼接了多余的>字符,形成了不存在的非法路径。 - 参数解析错误:最后单独的
>会被CMake识别为无效的独立参数,进一步干扰编译配置的生成。
正确的多行生成器表达式写法
如果要将多个路径合并到同一个$<BUILD_INTERFACE>中,写法如下:
target_include_directories(application-smth PRIVATE $<BUILD_INTERFACE: ${CMAKE_CURRENT_SOURCE_DIR}/data ${CMAKE_CURRENT_SOURCE_DIR}/include/application-smth > PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> )
如果你想保留原有的两个独立$<BUILD_INTERFACE>结构,也可以单独换行,不会出现异常:
target_include_directories(application-smth PRIVATE $<BUILD_INTERFACE: ${CMAKE_CURRENT_SOURCE_DIR}/data > $<BUILD_INTERFACE: ${CMAKE_CURRENT_SOURCE_DIR}/include/application-smth > PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> )
使用注意事项
- 生成器表达式的起始标记
$<XXX:和结束标记>必须严格配对,中间参数部分不要额外添加>。 - 同一个生成器表达式内的多个路径直接换行书写即可,CMake会自动将空白分隔的内容识别为独立的列表项。
- 常规缩进字符不会影响路径解析,保持代码可读性即可。
内容的提问来源于stack exchange,提问作者Pierwiastek
相关产品推荐
相关产品推荐

