我尝试使用 CMake 构建来查找特定文件,file(GLOB ...)
同时考虑到$<CONFIG>
确保根据构建配置选择了正确的文件版本。具体来说,我需要找到文件vc*-mtd.lib
,其中*
表示一个不同的版本号。
file(GLOB LIB "${BINARY_DIR}/lib/$<CONFIG>/vc*-mtd.lib")
add_custom_command(
TARGET MyTarget POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different
${LIB}
${CMAKE_BINARY_DIR}/lib/$<CONFIG>
)
但是,这种方法不起作用,因为$<CONFIG>
似乎在 中不存在file(GLOB ...)
。因此,glob 无法正确解析,我找不到直接的解决方案来使其工作。
如果file(GLOB ...)
无法处理$<CONFIG>
,在 CMake 中动态实现此目的的推荐方法是什么?
file(GLOB)
当命令由 CMake 内部处理时,该命令会立即搜索文件CMakeLists.txt
。但是,$<CONFIG>
(以及任何其他生成器表达式)仅在配置过程结束时解析,因此file(GLOB)
不能使用配置名称。对于您想要支持的每种配置,您可以
file(GLOB)
多次调用:并在自定义命令中使用生成器表达式来选择特定配置所需的库
假设 GLOB 可能返回多个文件,则无法将结果列表与
$<CONFIG>
生成器表达式组合起来而不使用引号。带引号的变体将生成一个带有分号分隔路径的字符串,因此COMMAND_EXPAND_LIST
需要使用附加选项将此类字符串转换为正确的列表(请参阅该答案)。另一种方法是准备一个脚本,该脚本接受配置名称并自行搜索所有库并将其复制到相应位置。可以从 调用该脚本
add_custom_command
。例如,您可以为此目的编写一个 CMake 脚本:
并这样称呼它:
只想添加您可以用来
CMAKE_CONFIGURATION_TYPES
列出所有可用配置的参考:https ://cmake.org/cmake/help/latest/variable/CMAKE_CONFIGURATION_TYPES.html
附言:我也会使用
而不是
${BINARY_DIR}/lib/${OutputConfig}
ref: https: //cmake.org/cmake/help/latest/prop_tgt/LIBRARY_OUTPUT_DIRECTORY_CONFIG.html