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

