如何在CMake的file(GLOB...)中结合$<CONFIG>查找目标文件?
解决CMake中file(GLOB)无法结合$的问题
问题根源在于:file(GLOB)是在CMake配置阶段执行的,而$<CONFIG>属于生成阶段的生成器表达式,配置阶段无法解析这个表达式,导致路径中保留了$<CONFIG>字面量,通配匹配自然失败。
以下是两种推荐的解决方案,覆盖单配置和多配置生成器场景:
方法1:使用CMake脚本实现生成阶段的文件查找与复制(跨配置兼容)
这种方法通过将文件查找逻辑放到单独的CMake脚本中,在add_custom_command里调用该脚本——此时生成器表达式已被解析,路径正确。
- 编写一个名为
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()
- 在主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
相关产品推荐
相关产品推荐

