如何在CMake列表中查找并返回匹配子串或正则的首个元素?
在CMake中查找包含指定子串的首个目标对象文件路径
实现思路
CMake原生的列表查找接口仅支持严格匹配,要实现子串匹配查找首个元素,需通过「遍历列表+字符串匹配」的方式实现:
- 遍历
$<TARGET_OBJECTS>展开后的所有对象文件路径 - 对每个路径,检查是否包含目标子串(比如
myfile.c.obj) - 找到第一个匹配的元素后立即终止遍历,保存结果
具体代码示例
假设目标名为MyTarget,要查找的目标文件名是myfile.c.obj,可参考以下代码:
# 获取目标的对象文件列表(需CMake 3.12+,且目标已通过add_executable/add_library定义) get_target_property(_obj_files MyTarget OBJECTS) # 定义要查找的目标文件名子串 set(_target_filename "myfile.c.obj") # 初始化结果变量 set(_found_obj_path "") # 遍历所有对象文件路径 foreach(_obj IN LISTS _obj_files) # 检查当前路径是否包含目标子串 string(FIND "${_obj}" "${_target_filename}" _pos) if(NOT _pos EQUAL -1) set(_found_obj_path "${_obj}") break() # 找到首个匹配项后退出循环 endif() endforeach() # 输出结果 if(_found_obj_path) message(STATUS "找到匹配的对象文件:${_found_obj_path}") else() message(WARNING "未找到包含${_target_filename}的对象文件") endif()
进阶:正则表达式匹配
如果需要更灵活的匹配逻辑(比如匹配所有包含myfile且以.obj结尾的文件),可将string(FIND)替换为正则匹配:
# 替换循环内的判断逻辑 string(MATCH ".*myfile.*\\.obj$" _match "${_obj}") if(_match) set(_found_obj_path "${_obj}") break() endif()
注意事项
$<TARGET_OBJECTS>是生成器表达式,需在get_target_property或add_custom_command等支持生成器表达式的上下文使用,CMake会自动展开- 多配置生成器(如Visual Studio)下,对象文件路径会包含
Debug/Release等配置目录,上述代码会自动适配完整路径的匹配
内容的提问来源于stack exchange,提问作者sdbbs
相关产品推荐
相关产品推荐

