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

CMake生成器表达式逗号后空格致LIST:GET返回异常双路径

$LIST:GET生成器表达式返回两个路径的原因及解决方法

问题根源

在MS Visual Studio这类多配置生成器下,$<TARGET_OBJECTS:MyTarget>的行为并非简单返回已生成的目标文件列表:

  • CMake处理多配置项目时,TARGET_OBJECTS返回的每个元素是包含$<CONFIG>这类配置占位符的生成器表达式形式路径,而非直接展开的实际路径。
  • 在PRE_LINK阶段,CMake尚未完全确定当前构建配置,此时TARGET_OBJECTS会同时输出占位符形式的路径模板和临时根构建目录路径,导致$<LIST:GET, ..., 0>取出的“第一个元素”实际是两个以空格分隔的路径内容。

正确解决方案

不要通过提取目标文件路径的方式获取中间目录,直接使用CMake提供的OBJECT_DIR目标属性来获取目标的对象文件存放目录,这是更可靠的官方方式:

ADD_LIBRARY(MyTarget SHARED ${MY_SRC})
add_custom_command(TARGET MyTarget PRE_LINK 
                  COMMAND ${BINARY_EXE} ARGS -o myargs ${CMAKE_CURRENT_SOURCE_DIR}/file  
                  WORKING_DIRECTORY "$<TARGET_PROPERTY:MyTarget, OBJECT_DIR>" 
                  COMMENT "Build started" 
                  VERBATIM)

$<TARGET_PROPERTY:MyTarget, OBJECT_DIR>会直接返回对应目标的中间对象文件目录,无需处理目标文件列表,完全适配多配置生成器的行为,避免路径解析错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 19:01:08