YY语音从4.0版本开始是基于Qt的开发过程,以及碰到的问题

时间:2022-06-15 04:20:20
作者:姚冬
链接:http://www.zhihu.com/question/21359230/answer/20127715
来源:知乎
著作权归作者所有,转载请联系作者获得授权。
YY语音从4.0版本开始是基于Qt framework开发的,而我正是这个项目的技术负责人。

决定是否采用某framework之前,首先要确定是不是有发布上的问题,毕竟YY语音作为一个服务于数千万用户的客户端软件,面临的用户软硬件环境是比较复杂的,而且一旦遇到无法安装或者安装后不能运行之类的兼容性问题会导致大量的用户流失。

我在预研阶段测试了很多不同的软硬件环境,Qt本身倒是没什么问题,问题比较多的反而是VC的运行时库 msvcrt。

我们采用的是动态链接Qt库,因为YY语音的代码规模比较大,需要多人协作开发,不同模块按DLL划分比较方便,采用静态链接是不现实的。

YY语音采用的是 Qt 4.7.1版本。
Qt库和调用它的 EXE DLL放在同一个目录就可以了,有个问题要注意,Qt的图片解码库比如jpeg gif解码等是以插件形式存在的发布时要带上 Qt的imageformats里面的几个dll,通常就是 qjpeg4.dll qgif4.dll qico4.dll ,另外为了让Qt可以找到这些插件需要设置下Qt插件的加载目录

在程序启动时调用 QCoreApplication::setLibraryPaths(libPaths); 把 imageformats所在的目录放到 libPaths里。

VC运行时库的安装是个麻烦问题,YY语音采用的是VC2008编译器,从vc2005开始微软加入了manifest机制控制运行时库的加载,不再像vc2003及之前的版本那样只要放到exe目录就行了。如果用户机器上安装过msvcrt的分发包则没问题,否则程序不能运行。
简单的处理方法是 把 Microsoft.VC90.CRT 目录及目录下的文件放到exe相同的目录即可。
这样的话,应用程序如果找不到系统安装的msvcrt,就会加载自己带的那份。
Microsoft.VC90.CRT这个目录可以在vc安装的目录找到,搜索下吧。

假设 你的 app安装到 <app install dir>目录下,那么这个应用安装后的目录下的结构可能是这样的。

<app install dir>
yourapp.exe
yourdll1.dll
yourdll2.dll
QtCore4.dll
QtGui4.dll
<imageformats>
qgif4.dll
qjpeg4.dll
qico4.dll
<Microsoft.VC90.CRT>
Microsoft.VC90.CRT.manifest
msvcr90.dll
msvcp90.dll

大家也可以下载安装YY语音参考下安装目录下的文件。