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

使用Fake Function Framework做单元测试出现多重定义符号报错如何解决

重定义报错原因

你遇到的报错是典型的全局函数多重定义问题,触发原因如下:

  1. FAKE_VALUE_FUNC(bool, ioFunc) 宏会在当前单元测试文件中生成一个完整的ioFunc假函数实现,作为全局符号存在
  2. 你编译链接单元测试项目时,同时加入了包含真实ioFunc实现的ioDigitalInput.c文件,其编译产物ioDigitalInput.obj中也存在一个同名的全局ioFunc符号
  3. 链接器遇到两个相同的全局符号时无法判定优先级,因此抛出重定义错误。
对应解决方法
  • 最推荐方案:排除真实实现的编译链接
    单元测试项目中只引入ioDigitalInput.h头文件做函数声明,不要把ioDigitalInput.c加入到单元测试的编译/链接列表里,所有对ioFunc的调用会自动绑定到FFF生成的假实现上,完全不会触发冲突。
  • 支持弱符号的编译器(GCC/Clang)可选方案
    将打桩声明修改为FAKE_VALUE_FUNC_WEAK(bool, ioFunc),弱符号属性的假实现优先级低于真实实现,适合只需要在部分测试用例中替换函数的场景。
  • MSVC环境临时兼容方案
    如果必须同时链接真实实现文件,可以在单元测试项目的「链接器-命令行」配置中添加 /FORCE:MULTIPLE 参数,强制链接器优先使用先被加载的FFF假实现,该方案属于强制配置,非必要不推荐使用。

额外注意:DEFINE_FFF_GLOBALS 宏在整个单元测试项目中只能定义一次,如果你有多个测试文件,只需要在其中一个文件中声明该宏即可,否则会触发FFF框架内部全局变量的重定义错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 16:06:04