2011-08-23 6 views
0

직장에서 C++ 프로젝트의 특이한 오류가 발생했습니다.이상한 '정의되지 않은 참조'오류

수정 사항을 발견했지만 실제로 만족스러운 결과를 얻었습니다. 실제로 오류의 원인을 이해하고 싶습니다.

이 코드 조각을 구축 : SW_Agent_PP이 주석 것을

#include <iostream> 
#include "snmp/snmp/SW_SNMP_Values.hpp" 
#include "snmp/agent/SW_Agent.hpp" 
#include "snmp/agent/SW_Agent_PP.hpp" 

int main() 
{ 
    //SW_Agent_PP agent; 

    return 0; 
} 

공지 사항! 이것을 구축 할 때 SW_Agent_PP 객체에서 사용중인 클래스에 대해 정의되지 않은 참조 오류가 발생합니다.

FIX는 실제로 개체를 만드는 것입니다! 그래서 이렇게하면 :

#include <iostream> 
#include "snmp/snmp/SW_SNMP_Values.hpp" 
#include "snmp/agent/SW_Agent.hpp" 
#include "snmp/agent/SW_Agent_PP.hpp" 

int main() 
{ 
    SW_Agent_PP agent; 

    return 0; 
} 

모든 것이 잘 작동합니다.

무언가를 사용하지 않아서 링커 오류를 어떻게 잡을 수 있습니까? 이전에 비슷한 경험을 한 사람이 있는지, 그리고 그 원인을 발견 한 사람이 있는지 알고 싶습니다.

죄송하지만 회사 속성이므로 더 많은 코드를 공개 할 수 없습니다. 미리 감사드립니다.

+1

'SW_Agent_PP'의 정의는 무엇입니까? 매크로입니까? –

+0

.hpp 파일 중 하나의 버그와 같습니다. 아마도 누락 된 세미콜론. –

+0

전체 수업. 머리글 및 .cpp 파일로 분할 – Daniel

답변

3

링커가 복잡하고이 동작이 결코 드문 경우는 아닙니다. 가능한 설명은 다음과 같습니다.

  1. 정적 라이브러리 libfoo.a으로 연결 중입니다.
  2. libfoo.a은 과 다른 기능이 포함 된 foo.o을 포함합니다.
  3. 링크 라이브러리에서 libfoo.a 뒤에 나열된 다른 라이브러리 libbar.alibfoo.a에서 다른 기능을 사용합니다.

링커는 정적 라이브러리를 순서대로 처리하고 절대로 돌아 가지 않습니다. 따라서 libbar.a의 참조는 libfoo.a에서 해당 객체를 가져온 경우에만 main()으로 만족할 수 있습니다.

해결 방법은 링크 행의 라이브러리를 재정렬하는 것입니다.

다른 가능한 설명이 있습니다. 실제 코드를 보지 않고도 말하기는 어렵습니다.