2013-12-18 38 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”的调用却出现链接器错误,“undefined reference”等等。导致不同行为的两个函数之间有什么区别?

我尝试添加“外部C”到“的#include”指令,所以main.cpp中写道:

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

和职能的声明之前添加关键字“外部”,而这一次调用“foo()”也会出现同样的错误。

我明白从你们那里

+0

你应该发布确切的错误消息,而不是等等等等。 –

回答

3

你将extern "C"放错了地方的任何帮助。

如果main.c是一个真正的C文件,并mleak_cpp.cpp是真正的C++函数,那么你就需要把extern "C"提前__memory_malloc()的定义,像这样:

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

如果你把extern "C"mleak_cpp.h文件,它需要谨慎:

#ifdef __cplusplus 
    extern "C" { 
#endif 

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

#ifdef __cplusplus 
    } 
#endif 

而且,目前还不清楚为什么foo作品在你上面的例子,如果一个文件调用__foo(),但其他文件定义为foo()。我假设更多的是在玩,比如你的问题中的编辑错误。

+0

“主”应该是一个cpp文件,以防万一。对不起,错字。是什么导致“foo”和“memory_malloc”的行为有所不同呢? – user3109672

+0

更新:好吧..然后忘了关于富。同事建议说“__”可能是原因。尽管我怀疑它,但我确实尝试了一下,这就解释了主要调用“__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代码中包含标题的情况,所以建议按照我指出的方式进行在上面。