• 25090阅读
  • 15回复

QT调用VC开发的动态链接库 [复制链接]

上一主题 下一主题
离线jasonhit
 

只看楼主 倒序阅读 楼主  发表于: 2009-08-11
VC开发的动态链接库,是用作客户端与服务器之间的数据通信。这个动态链接库是第三方提供的,提供了.h, .lib, .dll文件。这个dll只export出一个类。现在客户端需要用QT来做开发。在调用这个DLL的类的静态方法的时候,出现了 undefined reference to 错误。由于DLL是第三方提供的,所以不能修改。 用reimp重新生成.def,.a文件,问题依然。

QT提示的错误是: undefined reference to `_imp___ZN19CThostFtdcTraderApi19CreateFtdcTraderApiEPKc'

在.a 或 .lib文件中,确实没有找到那个  `_imp___ZN19CThostFtdcTraderApi19CreateFtdcTraderApiEPKc'

这个是何问题呢?
离线80437
只看该作者 1楼 发表于: 2009-08-11
好像在VC编译时加上 extern "C" {...} 会解决这个问题. 但我也不清楚在不编译VC库的情况下如何来处理.
关注...
离线dbzhang800

只看该作者 2楼 发表于: 2009-08-12
简单的办法可能就属:你的Qt程序也采用vc编译
离线jasonhit

只看该作者 3楼 发表于: 2009-08-12
试了一下,在DLL增加一个extern "c"  __declspec(dllexport) int fnADD(int i, int j)的函数是可以正常在QT中调用的。 但class __declspec(dllexport) classA 的方式就没办法在QT中使用这个导出类classA。 出现undefined reference to 的问题。 怀疑是c与c++在命名方式的不同。可能VC用C++方式编译,而QT用C方式编译,这样需要把VC的导出函数用 extern "c" 标明,在QT中才可以使用。 但要是导出类如何标明为 extern "c" 呢。这应该不可能的,导出类只能用c++方式编译吧。那么在QT中就应该按照C++命名方式调用导出类。如何知道QT是按照c或者c++去编译的呢。看到过.pro文件中加 language = c++ 的。但在QT4.5.2加进去没有效果。

困惑中。既然 extern "c"方式可以调用VC的DLL,那么如何调用它的导出类呢? 总是提示 undefined reference to,但DLL中确实有此类,可能就是QT与编译出来的DLL之间的命名方式不一样了。
离线jasonhit

只看该作者 4楼 发表于: 2009-08-12
引用第2楼dbzhang800于2009-08-12 00:27发表的  :
简单的办法可能就属:你的Qt程序也采用vc编译



能否详细说明一下,如何把这个QT程序用VC编译? 我是新手,不太明白,谢谢。
离线浪漫天使
只看该作者 5楼 发表于: 2009-08-12
方便上dll h 和lib么 偶玩玩。
离线jasonhit

只看该作者 6楼 发表于: 2009-08-12
引用第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里面的一个函数而已。
描述:VC生成的DLL
附件: dll2.zip (150 K) 下载次数:68
离线jasonhit

只看该作者 7楼 发表于: 2009-08-12
把QT当做插件安装在VS2005上,用vs2005来编译,正常了。

看来就是QT与VC编译器之间的差异造成的。

但如何配置文件,使得可以消除编译器之间的差异?
离线浪漫天使
只看该作者 8楼 发表于: 2009-08-13
我用g++做主程序 也认不出vc编译出来的dll啊

你的dll是不是没有实现虚函数啊,
我用dumpbin 没看到虚函数,
反而看到了一个=的操作符。头文件却没有
怎么回事?
离线jasonhit

只看该作者 9楼 发表于: 2009-08-13
DLL中没有虚函数。

应该就是g++与VC编译器对C++的函数、类的命名方式不一样造成的。因为用extern c 输出的函数就能互相访问。
离线浪漫天使
只看该作者 10楼 发表于: 2009-08-13
既然dll中没有虚函数,但是你的头文件中有虚函数的声明,就是说你没有实现虚函数,这样的dll是不完整的。
编译时候link阶段出问题了,没有编译通过,
就先别说什么extern c先,方便编译一个完整的库出来给我么??

我是这样写的
  1. #include <qapplication.h>
  2. #include <qmessagebox.h>
  3. #include "dll2.h"
  4. /********
  5. // This class is exported from the dll2.dll
  6. class DLL2_API Cdll2 {
  7. public:
  8.     Cdll2(void);
  9.     // TODO: add your methods here.
  10.     ~Cdll2();
  11.     static Cdll2 *createSelf();
  12.     int add(int a, int b);
  13. };
  14. ******/
  15. int main(int argc, char *argv[])
  16. {
  17.     QApplication app(argc,argv);
  18.     Cdll2 dllobj;
  19.     int value = dllobj.add(1,2);
  20.     QMessageBox::information(0,"debug",QString::number(value));
  21.     return app.exec();
  22. }
离线ningfeng8899

只看该作者 11楼 发表于: 2011-12-10
我有试过导出VC的dll 给 QT使用。 只要记住你导出的类中 是标准C/C++的数据类型就可以了。别使用MFC中的CString 或者。Net的String 或者托管的那些数据类型,不然数据类型的不兼容,或导致你程序出问题。
离线harbour_1

只看该作者 12楼 发表于: 2012-08-30
楼主,我也遇到了和你一样的问题,能问一下怎么解决引入别的动态库导出的类么?
离线gjk576238725

只看该作者 13楼 发表于: 2015-12-15
我和大家的问题一样,自己设计一个简单的dll 可以在qt中,但是用第三方做好的就是不行。
离线yanwuyue

只看该作者 14楼 发表于: 2015-12-15
Qt本身又没有编译器,何来差异
离线lvkui

只看该作者 15楼 发表于: 2017-05-01
回 gjk576238725 的帖子
gjk576238725:我和大家的问题一样,自己设计一个简单的dll 可以在qt中,但是用第三方做好的就是不行。 (2015-12-15 19:55) 

我自己编的dll都在qt或者vs2013中无法使用,出现
错误    2    error LNK1120: 1 个无法解析的外部命令    F:\Lvkui1993\Qt\AddressBook\x64\Release\\AddressBook.exe    AddressBook
错误    1    error LNK2019: 无法解析的外部符号 __imp_add,该符号在函数 main 中被引用    F:\Lvkui1993\Qt\AddressBook\AddressBook\main.obj    AddressBook
你能说说你是怎么解决的么?
快速回复
限100 字节
 
上一个 下一个