为什么我不能使用gcc链接具有C接口的混合C/C++静态库?

Mat*_*att 4 c c++ gcc g++

我有一个混合的C/C++库.

在外部它提供了一个使用extern C的C接口.在内部有模板和类.用"ar"创建库没有任何问题.该文件名为libo-client.a.

但是,当.a使用gcc(而不是g ++)链接文件时,我会收到许多看起来像这样的错误:

libo-client.a(mysocket.o):(.rodata._ZTV7mStream[vtable for mStream]+0x10): undefined reference to `__cxa_pure_virtual'
...
mysocket.cpp:(.text+0x15ad): undefined reference to `operator new[](unsigned long)'
mysocket.cpp:(.text+0x15c1): undefined reference to `operator delete(void*)'
mysocket.cpp:(.text+0x167a): undefined reference to `__cxa_allocate_exception'
mysocket.cpp:(.text+0x16a6): undefined reference to `__cxa_throw'
...
Run Code Online (Sandbox Code Playgroud)

我的编译/链接行如下所示:

gcc $(CFLAGS) $(INCLUDES) test2.c libo-client.a -o test2 
Run Code Online (Sandbox Code Playgroud)

test2是我的测试工具.

当我使用g ++时,不会发生此问题.但是,我打算将这个库连接到用gcc编译的C项目中.我该如何解决这个问题?它的原因是什么?

编辑:

即使我没有使用标准C++库,显然还需要一些诸如operator new/delete等内容,并且内部存在异常.

我将这个东西与Xen管理程序相关联,所以我不确定我有什么选择,但要完全改写这个东西,或者尝试用G ++编译Xen?

Jon*_*ler 9

解决问题的最简单方法是链接g++; 这将获得正确的库.

问题是C++有很多要求,C没有,并且在调用之前做了更多工作main()以确保事情被正确初始化.

如果您坚持使用C编译器进行链接,那么至少您必须使用link命令包含C++支持库.

  • 它通常用宏"$ {CXX}"表示.你的C编译器是`gcc`,C++编译器通常是`g ++`.在使用不同编译器的地方,您仍然可以使用用于构建C++对象模块的C++编译器进行链接. (2认同)