2013-06-28 8 views
3

정의되지 않은 참조 링커 오류가 발생하지만 공유 리소스를 할당하는 SetUpTestCase() 메서드가있는 테스트 사례를 작성 중입니다.SetUpTestCase 정적 변수를 사용하여 Google 테스트 정의되지 않은 참조

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

필드 만 선언했습니다. 그것을 어딘가에 정의해야합니다. 정적 멤버의 선언 클래스를 정의 할 수 없습니다 : 일부 .cpp 파일에서 당신은

xml ParsingEventsTest::eventXml; 

편집이 필요한 이유에 관해서는
같은 줄을 추가해야합니다. 그렇다면 클래스 정의를 포함하는 모든 번역 단위가이를 정의합니다. 그러나 각 프로그램에는 정확히 하나의 정의가 필요하므로 클래스 정의 외부에서 멤버가 정의 된 위치를 선택해야합니다 (일반적으로 일부 .cpp 파일에서, 멤버 함수 정의가있는 파일이 가장 좋습니다). 구문은 위와 같습니다.

+0

이제 작동합니다. 왜 이것이 테스트 케이스의 변수를 정의하는 것이 적절하지 않은지 조금 설명 할 수 있습니까? – Patryk

+0

@ Patryk 이유를 추가하기 위해 내 대답 –

+0

+1을 연장했습니다. 감사 – Strubbl