2013-12-18 2 views
0

GCC 컴파일러로 신비한 상황에 처했습니다. 그래서이있어 다음과 같은 파일 :GCC : 이전 C 코드로 작업 할 때 링커 오류가 발생했습니다.

//main.cpp

#include "mleak_cpp.h" 
int main(int argc, char* argv[]) 
{ 
    foo(); 
    __memory_malloc(10,"hello",5); 
return 0; 
} 

//mleak_cpp.h

...... 
void foo(void); 
void* __memory_malloc(size_t size, const char* file, int line); 

//mleak_cpp.cpp

//definitions of the functions; 
void foo(void){printf("foo\n"); 

void* __memory_malloc(size_t size, const char* file, int line){ 
    printf("%s,%d\n",file,line); 
    InitDoubleLinkList(); 

    void* p = malloc(size); 
    if(p == NULL) 
    return NULL; 

    __DuLinkList* pListNode; 
    pListNode = (__DuLinkList*)malloc(sizeof(__DuLinkList)); 

    pListNode->address = p; 
    pListNode->memorysize = size; 
    pListNode->file = file; 
    pListNode->line = line; 
    InsertBlockToList(pListNode); 
    return p; 
} 

들어 어떤 이유로, void foo (void)에 대한 호출은 괜찮지 만 "__memory_malloc"에 대한 호출은 링커 오류 인 "정의되지 않은 참조"로 중단됩니다. 서로 다른 행동을 일으키는 두 기능의 차이점은 무엇입니까?

는 내가 "#INCLUDE"지시문에 '통근 C "를 추가하는 시도, 그래서 MAIN.CPP 읽

extern "C"{ 
    #include "mleak_cpp.h" 
} 

와 함수의 선언하기 전에"통근 "키워드를 추가하고,이 시간을 동일한 오류로 "foo()"에 대한 호출도 실패합니다.

나는 당신이 잘못된 위치에 extern "C"을 배치하고 너희들

+0

정확한 오류 메시지 대신 뚜렷한 오류 메시지를 게시해야합니다. –

답변

3

에서 어떤 도움을 주셔서 감사합니다. main.c 만약

진정으로 C 파일이며, mleak_cpp.cpp는 진정으로 C++ 함수 다음과 같이 __memory_malloc()의 정의에 앞서 extern "C"을 넣어해야합니다

extern "C" void* __memory_malloc(size_t size, const char* file, int line){ 
    // ... 
} 

을 당신이 mleak_cpp.hextern "C"을 넣으면

#ifdef __cplusplus 
    extern "C" { 
#endif 

    /* ... body of header ... */ 

#ifdef __cplusplus 
    } 
#endif 

또한, 그것은 분명하지 않다 위의 예에서 foo 작품, 하나 개의 파일이를 호출 할 때 이유 : 파일이 보호 될 필요가이지만 다른 파일은 foo()을 정의합니다. 귀하의 질문에 편집 오류와 같은 더 많은 것이 있다고 생각됩니다.

+0

"main"은 중요한 경우에 cpp 파일로 간주됩니다. 미안해, 오타. "foo"와 "memory_malloc"의 동작이 다른 이유는 무엇입니까? – user3109672

+0

업데이트 : 음 .. 그때 foo에 대해 잊어 버려. 동료는 "__"이 원인이라고 제안했습니다. 내가 그것을 의심하는만큼, 나는 그것을 시험해 보았다. 그것은 main에서 "__foo"에 대한 호출을 설명한다. – user3109672

1

extern "C"은 C가 아니며 C가 아니며 함수의 이름을 맹 글링해서는 안됩니다. C 코드에서는 이것을 결코 보지 않아야합니다. 일반적으로, 당신은 헤더 파일에 넣어, 당신은 다음과 같이 그것을 보호 :

#ifdef __cplusplus 
extern "C" { 
#endif 

/* C and C++ compatible header file body here */ 

#ifdef __cplusplus 
} /* end extern "C" */ 
#endif 

당신은 그것을 있도록, 당신은 모두 당신의 C 및 C++ 파일의 헤더 파일을 포함해야하지만이 방법을 수행하는 경우 C++ 컴파일러는 C 링키지를 사용하는 것을 알고 있습니다.

extern "C"을 C++의 함수 정의 앞에 놓고 머리글에서 제외 할 수 있지만 헤더를 C 코드에만 포함하는 경우에만 작동합니다. 따라서 포인터를 가리키는 방식으로 수행하는 것이 좋습니다 밖으로.

관련 문제