首页 > 解决方案 > 未解析的 Add_Test 符号,即使文件中包含测试夹具类

问题描述

突然之间,在我的测试工作了几个小时后,我收到了错误,它找不到我的文本固定功能(SetUp/TearDown)。我已经在一个单独的文件中定义了夹具,所以作为一个快速修复我将类移动到测试文件,但我仍然遇到同样的问题!

这是当前文件。为了简洁起见,我不仅省略了代码,我还尝试以这种形式构建它,以确保问题不是由测试中的代码引起的。我已经离开了include

#include "memory"
#include "../TestUtility/TestUtility.h"
#include "DependencyInjector.h"
#include "gtest/gtest.h"
#include "RecoverableErrorException.h"

namespace Test
{
    class DependencyInjectorTest : public testing::Test
    {
        public:
            DependencyInjectorTest();
            virtual ~DependencyInjectorTest();

        protected:
            virtual void SetUp() { Framework::DependencyInjector::Destroy(); };
            virtual void TearDown() override;
    };

    TEST_F ( DependencyInjectorTest, FindEmpty )
    { 
        // content ommitted 
    }

    TEST_F ( DependencyInjectorTest, Add )
    { 
        // content ommitted 
    }

    TEST_F ( DependencyInjectorTest, Find )
    { 
        // content ommitted 
    }
} // namespace Test

以下是错误:

1>DependencyInjectorUnitTests.obj : error LNK2019: unresolved external symbol "public: __thiscall Test::DependencyInjectorTest::DependencyInjectorTest(void)" (??0DependencyInjectorTest@Test@@QAE@XZ) referenced in function "public: __thiscall Test::DependencyInjectorTest_Add_Test::DependencyInjectorTest_Add_Test(void)" (??0DependencyInjectorTest_Add_Test@Test@@QAE@XZ)
1>DependencyInjectorUnitTests.obj : error LNK2019: unresolved external symbol "public: virtual __thiscall Test::DependencyInjectorTest::~DependencyInjectorTest(void)" (??1DependencyInjectorTest@Test@@UAE@XZ) referenced in function "public: virtual __thiscall Test::DependencyInjectorTest_Add_Test::~DependencyInjectorTest_Add_Test(void)" (??1DependencyInjectorTest_Add_Test@Test@@UAE@XZ)
1>DependencyInjectorUnitTests.obj : error LNK2001: unresolved external symbol "protected: virtual void __thiscall Test::DependencyInjectorTest::TearDown(void)" (?TearDown@DependencyInjectorTest@Test@@MAEXXZ)

更新:错误在某个时候消失了。然后几个小时后,同样神秘而沮丧地回来了。即使是我没有处理过的文件,因为它很好。

标签: c++visual-studiogoogletest

解决方案


你需要定义构造函数、析构函数和TearDown方法DependencyInjectorTest。即使它们是虚拟的,编译器也需要基本方法来初始化vtable.

https://en.cppreference.com/w/cpp/language/virtual

通过在类定义中声明它们,宏会隐式使用它们,并且需要对其进行定义。因为它们不是,链接会导致未定义的符号错误。

您可以删除声明或定义函数。


推荐阅读