回复: QT调用VC开发的动态链接库
#6 [jasonhit 08-12 15:32]
引用第5楼浪漫天使于2009-08-12 14:01发表的:
方便上dll h 和lib么 偶玩玩。
可以的,但这个DLL是我用VC随便生成的DLL,export出一个class和一个函数,其中函数加了extern c。现在的情况是函数在QT中没问题,但引入DLL的class的话,编译就失败。
对比了一下lib的class名字,跟QT 提示的错误引用的名字是不一样的。
undefined reference to `_imp___ZN5Cdll23addEii' 这个就是调用class里面的一个函数而已。
#7 [jasonhit 08-12 16:51]
把QT当做插件安装在VS2005上,用vs2005来编译,正常了。
看来就是QT与VC编译器之间的差异造成的。
但如何配置文件,使得可以消除编译器之间的差异?
#8 [浪漫天使 08-13 11:22]
我用g++做主程序 也认不出vc编译出来的dll啊
你的dll是不是没有实现虚函数啊,
我用dumpbin 没看到虚函数,
反而看到了一个=的操作符。头文件却没有
怎么回事?
#9 [jasonhit 08-13 12:15]
DLL中没有虚函数。
应该就是g++与VC编译器对C++的函数、类的命名方式不一样造成的。因为用extern c 输出的函数就能互相访问。
#10 [浪漫天使 08-13 13:52]
既然dll中没有虚函数,但是你的头文件中有虚函数的声明,就是说你没有实现虚函数,这样的dll是不完整的。
编译时候link阶段出问题了,没有编译通过,
就先别说什么extern c先,方便编译一个完整的库出来给我么??
我是这样写的
#include
#include
#include "dll2.h"
/********
// This class is exported from the dll2.dll
class DLL2_API Cdll2 {
public:
Cdll2(void);
// TODO: add your methods here.
~Cdll2();
static Cdll2 *createSelf();
int add(int a, int b);
};
******/
int main(int argc, char *argv[])
{
QApplication app(argc,argv);
Cdll2 dllobj;
int value = dllobj.add(1,2);
QMessageBox::information(0,"debug",QString::number(value));
return app.exec();
}