“未定义的引用”的错误使用C联静态C库时++代码“未定义的引用”的错误使用C联静态C库时++代码(“

2019-05-08 19:19发布

我有,我过载测试文件(只为链路测试) new / delete运营商与我自己malloc / free库调用libxmalloc.a 。 不过,我不断收到“未定义的引用”的错误作为连接静态库时以下,即使我改变的顺序test.o-lxmalloc 。 但是,一切都与其他C程序链接这个库工作得很好。 我这个问题很困惑和欣赏任何线索。

错误信息:

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

CFLAGS += -m64 -O3 -I/usr/include/ethos -I/usr/include/nacl/x86_64
CXXFLAGS += -m64 -O3
LIBDIR += -L.
LIBS += -lxmalloc
all: demo
demo: test.o
    $(CXX) $(CXXFLAGS) $(LIBDIR) -o demo test.o $(LIBS)
test.o: test.cpp
$(CXX) $(CFLAGS) -c -o $@ $<
clean:
- rm -f *.o demo

Answer 1:

但是,一切都与其他C程序链接这个库工作得很好。

你有没有注意到C和C ++编译创建目标文件级别不同的符号的名字呢? 这就是所谓的“ 名字粉碎 ”。
在(C ++)链接会显示未定义的引用作为错误信息demangled符号,这可能会迷惑你。 如果您检查您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


文章来源: “undefined reference to” errors when linking static C library with C++ code