标题:QT调用VC开发的动态链接库
作者:jasonhit
日期:2009-08-11 17:12
内容:
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'。
这个是何问题呢?
#1 [80437 08-11 23:47]
好像在VC编译时加上 extern "C" {...} 会解决这个问题. 但我也不清楚在不编译VC库的情况下如何来处理.
关注...
#2 [dbzhang800 08-12 00:27]
简单的办法可能就属:你的Qt程序也采用vc编译
#3 [jasonhit 08-12 09:35]
试了一下,在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之间的命名方式不一样了。
#4 [jasonhit 08-12 09:38]
引用第2楼dbzhang800于2009-08-12 00:27发表的:
简单的办法可能就属:你的Qt程序也采用vc编译
能否详细说明一下,如何把这个QT程序用VC编译? 我是新手,不太明白,谢谢。
#5 [浪漫天使 08-12 14:01]
方便上dll h 和lib么 偶玩玩。