使用Fake Function Framework做单元测试出现多重定义符号报错如何解决
重定义报错原因
你遇到的报错是典型的全局函数多重定义问题,触发原因如下:
FAKE_VALUE_FUNC(bool, ioFunc)宏会在当前单元测试文件中生成一个完整的ioFunc假函数实现,作为全局符号存在- 你编译链接单元测试项目时,同时加入了包含真实
ioFunc实现的ioDigitalInput.c文件,其编译产物ioDigitalInput.obj中也存在一个同名的全局ioFunc符号 - 链接器遇到两个相同的全局符号时无法判定优先级,因此抛出重定义错误。
对应解决方法
- 最推荐方案:排除真实实现的编译链接
单元测试项目中只引入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
相关产品推荐
相关产品推荐

