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

如何在CMake的file(GLOB...)中结合$<CONFIG>查找目标文件?

解决CMake中file(GLOB)无法结合$的问题

问题根源在于:file(GLOB)是在CMake配置阶段执行的,而$<CONFIG>属于生成阶段的生成器表达式,配置阶段无法解析这个表达式,导致路径中保留了$<CONFIG>字面量,通配匹配自然失败。

以下是两种推荐的解决方案,覆盖单配置和多配置生成器场景:

方法1:使用CMake脚本实现生成阶段的文件查找与复制(跨配置兼容)

这种方法通过将文件查找逻辑放到单独的CMake脚本中,在add_custom_command里调用该脚本——此时生成器表达式已被解析,路径正确。

  1. 编写一个名为copy_vc_libs.cmake的脚本文件(放在项目源码目录):
# copy_vc_libs.cmake
file(GLOB LIB_FILES "${SRC_DIR}/vc*-mtd.lib")
foreach(lib IN LISTS LIB_FILES)
    file(COPY_IF_DIFFERENT "${lib}" DESTINATION "${DST_DIR}")
endforeach()
  1. 在主CMakeLists.txt中调用该脚本:
add_custom_command(
    TARGET MyTarget POST_BUILD
    COMMAND ${CMAKE_COMMAND} 
        -D SRC_DIR="${BINARY_DIR}/lib/$<CONFIG>"
        -D DST_DIR="${CMAKE_BINARY_DIR}/lib/$<CONFIG>"
        -P "${CMAKE_CURRENT_SOURCE_DIR}/copy_vc_libs.cmake"
)

方法2:针对单配置生成器直接使用CMAKE_BUILD_TYPE

如果你的项目只使用单配置生成器(如Makefile、Ninja),可以直接用CMAKE_BUILD_TYPE变量替代$<CONFIG>,因为该变量在配置阶段就已确定:

file(GLOB LIB "${BINARY_DIR}/lib/${CMAKE_BUILD_TYPE}/vc*-mtd.lib")
add_custom_command(
    TARGET MyTarget POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E copy_if_different
        ${LIB}
        ${CMAKE_BINARY_DIR}/lib/${CMAKE_BUILD_TYPE}
)

注意:这种方法不适用于Visual Studio等多配置生成器,因为CMAKE_BUILD_TYPE在多配置环境下为空。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 03:54:58