• 7511阅读
  • 8回复

请教关于Qt编译得到的Dll兼容性问题 [复制链接]

上一主题 下一主题
离线magicpu
 

只看楼主 倒序阅读 楼主  发表于: 2010-09-26
— 本帖被 XChinux 执行加亮操作(2010-10-20) —
本人用 Qt SDK by Nokia v2010.05 (open source) 编译得到一个简单的算法的 dll(无界面,仅仅为计算内容),想将生成的 dll 导入到早先用 qt4.3 编写的界面程序中,发现无法工作。用同版本 Qt 调用时 该dll 可以正常工作,因此可以排除程序本身错误。


请问各位 Qt 高手,用低版本Qt 调用高版本生成的 dll 是否可行?有何解决的办法?非常感谢!
离线magicpu

只看该作者 1楼 发表于: 2010-09-26
希望能得到解答!
离线dbzhang800

只看该作者 2楼 发表于: 2010-09-26
高版本的dll替代低版本的是没问题了(比如Qt4.7的动态库替代Qt4.3的).

但是你的问题描述的很不明确,比如你的新的dll,肯定依赖新版本的QtCore4.dll ,而你程序中用的是这个版本的QtCore4么?是用同一个编译器编译的么?
离线magicpu

只看该作者 3楼 发表于: 2010-09-27
首先谢谢 dbzhang800。dll 是用最新的 Qt Creator 编译的,采用动态编译方式,需要用到新版本的 QtCore4.dll,而原来的界面程序则是用 VC 2005+Qt 4.3 插件 编译的,也采用动态编译方式。这样是否不可行?需要都采用同样的编译器吗?
离线dbzhang800

只看该作者 4楼 发表于: 2010-09-27
1. 编译器要一样,C++用户对此应该都了解这一点吧。(当然,如果你的dll导出的都是C的接口,这又是另外一回事)

2.你提VC2005容易猜到你的编译器时 cl,可是你提Qt Creator 别人是不可能知道猜出你的编译器的(msvc? mingw?)

题外:
1. 你不能用新版的Qt重新编译你的程序么? 为什么?
2. 你不能直接用新的Qt的动态库替代你程序中用的QT4.3的动态库么?为什么?
离线magicpu

只看该作者 5楼 发表于: 2010-09-27
不好意思,我没有详细说明我的问题,给dbzhang800带来困扰。

我的 dll 中导出的都是C的接口,也就是说,接口没有类,只有函数,dll 却无法在老版本的程序中调用。这是我想问的核心问题。另外,我们采用Qt Creator 中默认的用mingwm 作为编译器。

程序是不同的单位联合开发的,其中大部分包括界面是其它单位在较早的时候用老的4.3版本开发的。我们则想向其中添加新的模块,由于手中仅有较新版本QT,没有4.3版本的,因此想将一些新的算法(无界面)编译成 dll,然后集成到大的程序中,所以有了这个问题。


离线paranoid
只看该作者 6楼 发表于: 2010-09-27
dll导出的是c接口,dll中有没有用到qt库?如果有,那么生成的dll还是依赖mingw版的qt库
如果是纯c算法的dll应该没有问题
离线magicpu

只看该作者 7楼 发表于: 2010-09-27
dll 中用到 Qt 的一些数据类型(QArray、QMap等)了,依赖mingw的库,问题应该就出在这了。我现在打算用qt4.3 编译试试。谢谢paranoid!
离线magicpu

只看该作者 8楼 发表于: 2010-09-29
dll用QT4.3+VC2005编译生成,也在相同的环境下调用,只有静态编译的lib可用,dll仍不可用,请问为什么?是否因为调用dll还需要什么其它库?

libssd.dll文件在根目录、debug、release目录下都有,用Depends查看了一下,似乎没有调用其它特别的dll。

dll调用源码如下:
        QLibrary lib("libssd.dll");
        if (!lib.load()) return 0;
        typedef void(*Func)(struct bcPara in);
        Func binCalc=(Func)lib.resolve("binCalc");
        binCalc(in);
        lib.unload();
快速回复
限100 字节
 
上一个 下一个