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

如何从Makefile向Gtest传递命令行参数?

解决Makefile中Gtest参数不生效的问题

问题根源

直接运行debug/ut "--gtest-filter=*simple*"时,引号会阻止shell解析*通配符;但通过Make传递参数时,Make会先剥离外层引号,再将参数交给shell执行,此时shell会把*simple*当作文件名通配符,尝试匹配当前目录下的文件(无匹配时部分shell会保留原字符串,但行为不稳定),导致Gtest无法收到预期的过滤规则。

可行解决思路

1. 转义通配符避免shell展开

在执行make命令时,对*进行转义,让shell不解析它:

make ut-run -- --gtest-filter=\*simple\*

此时传递给Gtest的参数就是--gtest-filter=*simple*,能正常触发测试过滤。

2. 修改Makefile为参数添加引号

修改ut-run目标,将每个参数用引号包裹,强制shell不解析通配符:

ut-run: ut-link
	@debug/ut $(foreach arg,$(filter-out $@,$(MAKECMDGOALS)),"$(arg)")

执行命令时无需额外添加引号:

make ut-run -- --gtest-filter=*simple*

3. 使用环境变量传递参数

这种方式完全避开shell通配符解析问题,是最可靠的方案:

  • 修改Makefile:
ut-run: ut-link
	@debug/ut $(if $(GTEST_FILTER),--gtest-filter=$(GTEST_FILTER))
  • 执行命令时通过环境变量传递过滤规则:
make ut-run GTEST_FILTER="*simple*"

4. 禁用shell的通配符扩展

在Makefile的命令中添加set -f,临时禁用shell的文件名扩展功能:

ut-run: ut-link
	@set -f; debug/ut $(filter-out $@,$(MAKECMDGOALS))

执行命令时直接传递参数即可:

make ut-run -- "--gtest-filter=*simple*"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 18:56:10