2013-06-28 61 views
3

我正在寫一個測試用例,將有一個SetUpTestCase()方法,將分配共享資源雖然我收到未定義的參考鏈接器錯誤。谷歌測試undefined參考使用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 allocation

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() {} 
}; 
+0

我看不到'eventXml'的定義。你把它放在哪裏? –

+0

@TadeuszKopec它在'xml'類型的代碼中 - 'static xml eventXml;' – Patryk

+0

[爲什麼我的C++程序不會鏈接到我的類有靜態成員時?](http://stackoverflow.com/questions/1976983/why-wont-my-c-program-link-when-my-class-has-static-members) –

回答

9

您只聲明字段eventXml。你需要在某個地方定義它。在某些cpp文件你必須把線像

xml ParsingEventsTest::eventXml; 

編輯
至於爲什麼需要它的理由:靜態成員的聲明中類不能定義它。如果是這樣,每個包含類定義的翻譯單元都會定義它。但是每個程序只需要一個定義,所以你必須選擇在類定義之外定義成員的位置(通常在一些.cpp文件中,最好是具有成員函數定義的成員)。語法如上所示。

+0

好吧,它現在可以工作。你能解釋一下爲什麼這不足以在testcase體中定義變量嗎? – Patryk

+0

@Patryk爲了增加原因,我擴展了我的答案 –

+0

+1。謝謝 – Strubbl