【问题标题】:Fake Function Framework "one or more multiply defined symbold found"假函数框架“找到一个或多个多重定义的符号”
【发布时间】:2021-12-23 01:30:39
【问题描述】:

我正在使用 Fake Function Framework 在 .c 文件中伪造一个函数,并在我的 .cpp 单元测试文件中对其进行测试。

#include "..\fff.h"
extern "C"
{
    #include "ioDigitalInput.h"
}


DEFINE_FFF_GLOBALS;

FAKE_VALUE_FUNC(bool, ioFunc);

using namespace Microsoft::VisualStudio::CppUnitTestFramework;

namespace UnitTestfff
{
    TEST_CLASS(UnitTestfff)
    {
    public:
        
        TEST_METHOD(TestMethod1)
        {

        }
    };
}

函数 ioFunc 返回一个 bool 并将 void 作为输入。

当我尝试构建代码时,出现以下错误: “找到一个或多个多重定义的符号”和 "ioFunc 已在 ioDigitalInput.obj 中定义"

我做错了什么?

【问题讨论】:

  • 什么是fff.h
  • fff.h 是包含“fake function framework”函数的文件

标签: c visual-studio unit-testing mocking fake-function-framework


【解决方案1】:

线

FAKE_VALUE_FUNC(bool, ioFunc);

在您的 .cpp 单元测试文件中 定义了(假)函数ioFunc。目标文件 ioDigitalInput.obj 还包含 ioFunc 的(可能不是假的)定义,并且您尝试将此对象与编译的测试链接,因此 ioFunc多重定义的。要么不要尝试链接 ioDigitalInput.obj,要么按照fff README 中的描述使用弱属性标记假。

【讨论】:

  • 感谢您的回答。也许我不明白,我在 include "..\fff.h 行的上方添加了链接 "#define FFF_GCC_FUNCTION_ATTRIBUTES __attribute__((weak))" 但它现在告诉我“弱”标识符未定义。跨度>
  • 你在使用 GCC 吗?或许见GCC style weak linking in Visual Studio?
  • 我使用的是默认的 C++ 编译器。我在同一解决方案中的单独项目中构建生产代码。然后我在测试项目中使用这些库文件来编写单元测试。
  • 我不知道 默认的 C++ 编译器,但在我看来文件 ioDigitalInput.obj 没有用作 library 文件,不会从其中获取其他定义的函数,而是作为一个普通的目标文件,从中获取所有函数。您可能想研究如何使用您的编译系统生成真正的库文件。
  • 我最终将我的项目拆分为多个组件,而不是拥有一个大型项目。这使我能够使用假函数框架工作来伪造依赖关系。感谢您的帮助
猜你喜欢
  • 2011-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多