gpt4 book ai didi

c++ - 将静态 C 库与 C++ 代码链接时出现 "undefined reference to"错误

转载 作者:太空宇宙 更新时间:2023-11-04 13:25:17 25 4
gpt4 key购买 nike

我有一个测试文件(仅用于链接测试),我在其中重载了 new/delete我自己的运营商malloc/free库名为 libxmalloc.a .但是在链接静态库时,我不断收到“ undefined reference ”错误,即使我更改了 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

最佳答案

But everything works well with other C programs linking this library.

您是否注意到 C 和 C++ 编译在目标文件级别创建不同的符号名称?它叫做' name mangling '.
(C++) 链接器会将 undefined reference 显示为错误消息中的 demangled 符号,这可能会使您感到困惑。如果您使用 nm -u 检查您的 test.o 文件,您会发现引用的符号名称与您的库中提供的名称不匹配。

如果你想使用作为使用普通 C 编译器编译的外部链接的函数,你需要将它们的函数声明包含在 extern "C"{} block 中,该 block 禁止 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

关于c++ - 将静态 C 库与 C++ 代码链接时出现 "undefined reference to"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33584136/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com