2013-09-05 2 views
0

내가 g의 ++에서지고있어 컴파일러 오류가이 함수의 서명은 어떻게 추론 되었습니까?

./Debug_gcc_lin64_5610_ST/tom.o: In function `process_P2T_CUST(IPC*)': 
/mxhome/charrison/git/libs/tom.cpp:512: undefined reference to `memorize_block(boost::unordered_map<...>&, Block const&)' 

(줄임표 광산)입니다.

void 
process_P2T_CUST(IPC *client_ipc) { 

    // Get list of record types in block                         
    Block& block = client_ipc->get_block(); 
    block.get_record_types(input_record_set); 

    // Reset associative memory                           
    memory.clear(); 

    // Add all field=value pairs from P2T_CUST into memory                   
    memorize_block(memory, block); 

그리고 memorize_block의 헤더의 정의는 다음과 같습니다 :

정의되지 않은 참조를 포함하는 소스 코드는

void memorize_block(MemoryBank&, Block&); 

자 : 여기에 내가 오류 메시지 해석 방법 - 링커 (또는 실제로 컴파일러)는 memorize_block()의 ​​필수 서명이 parm1 = unordered_map& 및 parm2 = Block const&을 가져야한다고 추측합니다.

그러나 블록이 const이어야한다고 생각하는 이유는 무엇입니까?

충분한 소스 코드를 제공하지 않은 경우 의견을 보내 주시면 그에 따라이 질문을 수정하겠습니다.

UPDATE 여기서 1 레퍼런스와 같은 컴파일 부에 memorize_block위한 코드이다. 다른 정의는 어디에도 없습니다.

void 
memorize_block(MemoryBank& memory, Block &block) { 
    D_RecordType_Vector record_types; 
    block.get_record_types(record_types);  
    BOOST_FOREACH(const D_RecordType_Set::value_type& rec_type, record_types) { 
      block.traverse_record(rec_type, add_to_memory(memory)); 
    } 
} 
+0

'memorize_block'에 대한 정의를 제공 했습니까? 그렇다면 정의가있는 소스 파일을 컴파일하고 링크하고 있습니까? – Mahesh

+0

ODR 위반과 같은 느낌입니다. 'memorize_block'의 또 다른 선언을 찾으십시오. 여기서 두 번째 매개 변수는 사실 const 참조입니다. –

+0

@Igor : ODR? 'memorize_block'에 대한 다른 선언은 없습니다. 소스 트리를 통해 재귀 적으로 grepping하여 확인합니다. @Mahesh : memorize_block()의 ​​소스는 정의되지 않은 ref와 같은 소스 파일에 있습니다. 또한 질문 1에 업데이트 1을 포함 시켰습니다. – Chap

답변

0

문제는 컴파일러가 아닙니다. 오류가 발생하면 컴파일이 완료됩니다. 서명의 정확성에 대해 걱정하지 마십시오. 여기에있는 문제는 링커가 함수의 "정의"를 찾을 수 없다는 것입니다. 그는 "선언"만을 알고 있습니다. 즉, 함수의 시작점을 가지고 있지만 구현이 아닙니다. 구현이 컴파일러에 제공되지 않은 cpp에 있다면, 그것을 추가해야합니다.

+0

위에서 언급 한 것처럼 정의는 참조와 같은 소스 파일에 있습니다. 내가 그것을 찾을 수없는 이유에 대해 생각할 수있는 유일한 설명은 const에 대한 불일치였다. – Chap

관련 문제