+ -
当前位置:首页 → 问答吧 → 诡异的linux编译问题

诡异的linux编译问题

时间:2011-08-25

来源:互联网

在linux下,我使用gcc编译了库,最后生成一个.a的文件。自己写的demo进行测试。但在编译时遇到了如下问题。

1. 如果demo使用g++编译,没有问题。
2. 如果使用gcc编译,则出现了诸如“undefined reference to `__cxa_pure_virtual'”的N多link错误,开始我以为是编译库时有顺序的问题,调整了之后还是存在这种link 错误。

我是期望使用gcc编译,但不知道如何解决这种link错误,请高手指点。

作者: duanhjlt   发布时间: 2011-08-25

你到底是C还是C++呢?


作者: feiyinzilgd   发布时间: 2011-08-25

没怎么用g++,一直都用的gcc
主要还是符号解析问题
在引用外部变量的时候,比如__cxa_pure_virtual,在所有没有定义却尝试引用的文件中使用extern关键字
貌似c++中不加这个关键字也默认允许对外部变量进行引用

作者: jn1158359135   发布时间: 2011-08-25

引用 1 楼 feiyinzilgd 的回复:

你到底是C还是C++呢?


库的实现用c++, 因为某些原因,在库之上封装一层纯C的接口。demo是基于纯C的结构写的C的程序。

作者: duanhjlt   发布时间: 2011-08-25

能否告诉我你是如何#include C++库的头文件的?

最好能贴点代码。我估计是C封装C++的时候出问题了。

作者: feiyinzilgd   发布时间: 2011-08-25

引用 4 楼 feiyinzilgd 的回复:

能否告诉我你是如何#include C++库的头文件的?

最好能贴点代码。我估计是C封装C++的时候出问题了。


头文件是直接#include的。即#include "XXX.h"

纯C的接口实现时,使用了

#ifdef __cplusplus
extern "C" {
#endif

..........


#ifdef __cplusplus
};
#endif

作者: duanhjlt   发布时间: 2011-08-25

在C文件的头文件中 把你的C++接口重新extern下:extern Type interface();

作者: feiyinzilgd   发布时间: 2011-08-25

引用 6 楼 feiyinzilgd 的回复:

在C文件的头文件中 把你的C++接口重新extern下:extern Type interface();


C++的接口是纯虚的类,很多。这样做,不太现实,而且增加了大量的维护工作。还要想别的办法。

我看错误提示,好像是虚表的问题。不知道能不能解释一下。

作者: duanhjlt   发布时间: 2011-08-25