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

如何在CMake列表中查找并返回匹配子串或正则的首个元素?

在CMake中查找包含指定子串的首个目标对象文件路径

实现思路

CMake原生的列表查找接口仅支持严格匹配,要实现子串匹配查找首个元素,需通过「遍历列表+字符串匹配」的方式实现:

  1. 遍历$<TARGET_OBJECTS>展开后的所有对象文件路径
  2. 对每个路径,检查是否包含目标子串(比如myfile.c.obj)
  3. 找到第一个匹配的元素后立即终止遍历,保存结果

具体代码示例

假设目标名为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 01:49:53