链接静态C库和C ++代码时出现“未定义的引用”错误

时间:2013-09-18 16:23:48

标签: c++ c static-libraries

我有一个测试文件(仅用于链接测试),我使用我自己的new / delete库{{1}重载malloc / free个运算符}}。但是,当链接静态库时,我一直得到“未定义的引用”错误,即使我改变了libxmalloc.atest.o的顺序。但是一切都适用于连接这个库的其他C程序。我对这个问题很困惑,并且感谢任何线索。

错误消息:

-lxmalloc

我的g++ -m64 -O3 -I/usr/include/ethos -I/usr/include/nacl/x86_64 -c -o test.o test.cpp g++ -m64 -O3 -L. -o demo test.o -lxmalloc test.o: In function `operator new(unsigned long)': test.cpp:(.text+0x1): undefined reference to `malloc(unsigned long)' test.o: In function `operator delete(void*)': test.cpp:(.text+0x11): undefined reference to `free(void*)' test.o: In function `operator new[](unsigned long)': test.cpp:(.text+0x21): undefined reference to `malloc(unsigned long)' test.o: In function `operator delete[](void*)': test.cpp:(.text+0x31): undefined reference to `free(void*)' test.o: In function `main': test.cpp:(.text.startup+0xc): undefined reference to `malloc(unsigned long)' test.cpp:(.text.startup+0x19): undefined reference to `malloc(unsigned long)' test.cpp:(.text.startup+0x24): undefined reference to `free(void*)' test.cpp:(.text.startup+0x31): undefined reference to `free(void*)' collect2: ld returned 1 exit status make: *** [demo] Error 1 文件:

test.cpp

我的#include <dual/xalloc.h> #include <dual/xmalloc.h> void* operator new (size_t sz) { return malloc(sz); } void operator delete (void *ptr) { free(ptr); } void* operator new[] (size_t sz) { return malloc(sz); } void operator delete[] (void *ptr) { free(ptr); } int main(void) { int *iP = new int; int *aP = new int[3]; delete iP; delete[] aP; return 0; }

Makefile

1 个答案:

答案 0 :(得分:57)

  

但是一切都适用于连接这个库的其他C程序。

您是否注意到C和C ++编译在目标文件级别创建了不同的符号名称?它被称为“name mangling” (C ++)链接器会在错误消息中显示未定义的引用作为解码符号,这可能会使您感到困惑。如果您使用test.o检查nm -u文件,则会看到引用的符号名称与库中提供的符号名称不匹配。

如果你想使用以普通C编译器编译的外部链接的函数,你需要将它们的函数声明包含在extern "C" {}块中,它禁止对内部声明或定义的所有内容进行C ++名称修改,例如:

extern "C" 
{
    #include <dual/xalloc.h>
    #include <dual/xmalloc.h>
}

更好的是,您可以在头文件中包装函数声明,如下所示:

#if defined (__cplusplus)
extern "C" {
#endif

/*
 * Put plain C function declarations here ...
 */ 

#if defined (__cplusplus)
}
#endif