Google使用SetUpTestCase静态变量测试未定义的引用

Google test undefined reference using SetUpTestCase static variable

本文关键字:未定义 引用 测试 变量 使用 SetUpTestCase 静态 Google      更新时间:2023-10-16

我正在编写一个测试用例,该用例将具有SetUpTestCase()方法,该方法将分配共享资源,尽管我收到了未定义的引用链接器错误。

class ParsingEventsTest: public ::testing::Test {
    protected:
        static xml eventXml;
        static void SetUpTestCase() {
            ManagedObjectManagerSingleton::GET_SINGLETON().initializeTestEnvironment(PATH_TO_FILE);
            eventXml= *ManagerSingleton::GET_SINGLETON().parse(PATH_TO_INPUT_FILES);
        }
        virtual void SetUp() {}
        virtual void TearDown() {}
};

这将导致:

../test/ParsingEventsTest.o: In function `ParsingEventsTest::SetUpTestCase()':
ParsingEventsTest.cpp:(.text._ZN17ParsingEventsTest13SetUpTestCaseEv[ParsingEventsTest::SetUpTestCase()]+0xa1): undefined reference to `ParsingEventsTest::eventXml'
ParsingEventsTest.cpp:(.text._ZN17ParsingEventsTest13SetUpTestCaseEv[ParsingEventsTest::SetUpTestCase()]+0xb0): undefined reference to `ParsingEventsTest::eventXml'
ParsingEventsTest.cpp:(.text._ZN17ParsingEventsTest13SetUpTestCaseEv[ParsingEventsTest::SetUpTestCase()]+0xbd): undefined reference to `ParsingEventsTest::eventXml'
ParsingEventsTest.cpp:(.text._ZN17ParsingEventsTest13SetUpTestCaseEv[ParsingEventsTest::SetUpTestCase()]+0xc2): undefined reference to `ParsingEventsTest::eventXml'
ParsingEventsTest.cpp:(.text._ZN17ParsingEventsTest13SetUpTestCaseEv[ParsingEventsTest::SetUpTestCase()]+0xce): undefined reference to `ParsingEventsTest::eventXml'
../test/ParsingEventsTest.o:ParsingEventsTest.cpp:(.text._ZN17ParsingEventsTest13SetUpTestCaseEv[ParsingEventsTest::SetUpTestCase()]+0xdd): more undefined references to `ParsingEventsTest::eventXml' follow
collect2: ld returned 1 exit status

编辑

这也适用于非常简单的情况,例如int分配

class ParsingEventsTest: public ::testing::Test {
    protected:
        static int *x;
        static void SetUpTestCase() {
            x = new int [30];
        }
        static void TearDownTestCase() {
            delete [] x;
        }
        virtual void SetUp() {}
        virtual void TearDown() {}
};

您只声明了字段eventXml。你需要在某个地方定义它。在一些.cpp文件中,您必须放置类似的行

xml ParsingEventsTest::eventXml;

编辑
至于需要它的原因:类中静态成员的声明不能定义它。如果定义了它,每个包含类定义的翻译单元都会定义它。但每个程序只需要一个定义,所以你必须选择在类定义之外定义成员的位置(通常在一些.cpp文件中。最好是有成员函数定义的)。语法如上图所示。