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

如何让CMake的PASS_REGULAR_EXPRESSION检查stderr输出?

让CMake的PASS_REGULAR_EXPRESSION检查stderr输出的方法

你遇到的问题核心在于:默认情况下PASS_REGULAR_EXPRESSION仅匹配stdout内容,且直接在add_test的COMMAND中添加2>&1不会生效——因为CMake默认不会通过shell执行测试命令,重定向符号会被当作普通参数传递给可执行文件。以下是两种可行的解决办法:

方法一:使用TEST_INCLUDE_STDERR属性(推荐,CMake 3.10+)

CMake 3.10及以上版本提供了TEST_INCLUDE_STDERR属性,开启后会将stderr输出合并到stdout中,让PASS_REGULAR_EXPRESSION可以同时匹配两者的内容。配置示例:

add_test(NAME test COMMAND executable)
set_tests_properties(test PROPERTIES
  WILL_FAIL true
  PASS_REGULAR_EXPRESSION "I was printed to stderr"
  TEST_INCLUDE_STDERR ON
)

注意:需确保你的可执行文件确实会返回非0值,否则WILL_FAIL true会导致测试判定为失败,即便正则匹配成功。

方法二:通过shell执行命令(兼容旧版CMake)

如果你的CMake版本低于3.10,可以让测试命令通过shell执行,让shell解析重定向符号。跨平台写法可借助生成器表达式指定shell路径:

add_test(NAME test COMMAND $<SHELL_PATH:sh> -c "$<TARGET_FILE:executable> 2>&1")
set_tests_properties(test PROPERTIES
  WILL_FAIL true
  PASS_REGULAR_EXPRESSION "I was printed to stderr"
)

针对Windows系统,也可直接指定cmd /c:

add_test(NAME test COMMAND cmd /c "$<TARGET_FILE:executable> 2>&1")

这种方式通过shell包裹命令,让2>&1生效,将stderr重定向到stdout,进而被正则表达式匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 17:20:34