作者:姚冬
链接: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语音参考下安装目录下的文件。

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

  1. Jeecg-Boot 2.0 版本发布,基于Springboot+Vue 前后端分离快速开发平台

    目录 Jeecg-Boot项目简介 源码下载 升级日志 Issues解决 v1.1升级到v2.0不兼容地方 系统截图 Jeecg-Boot项目简介 Jeecg-boot 是一款基于代码生成器的智能开发 ...

  2. Volcano社区v1.6.0版本正式发布

    摘要:Volcano社区v1.6.0版本正式发布.此次版本增加了弹性作业管理.基于真实负载的动态调度. 基于真实负载的重调度.Volcano Job插件--MPI等多个新特性. 本文分享自华为云社区& ...

  3. 多玩YY语音的面试题:C++中如何在main()函数之前执行操作?

    多玩YY语音的面试题:C++中如何在main()函数之前执行操作? 第一反应main()函数是所有函数执行的开始.但是问题是main()函数执行之前如何执行呢? 联想到MFC里面的 C**App类的t ...

  4. 支持边云协同终身学习特性,KubeEdge子项目Sedna 0.3.0版本发布!

    摘要:随着边缘设备数量指数级增长以及设备性能的提升,边云协同机器学习应运而生,以期打通机器学习的最后一公里. 本文分享自华为云社区<支持边云协同终身学习特性,KubeEdge子项目Sedna 0 ...

  5. .NET Core 2.0版本预计于2017年春季发布

    英文原文: NET Core 2.0 Planned for Spring 2017 微软项目经理 Immo Landwerth 公布了即将推出的 .NET Core 2.0 版本的细节,该版本预计于 ...

  6. 纪念BLives 1.0版本发布

    历时两个多月的时间,BLives程序1.0发布,在开发程序期间自己经历了很多,考试,恋爱,学业,自己很纠结 很伤心,有时候很无助,为了让自己有事干,我在考试备考期间去设计程序- -#,虽然程序设计的一 ...

  7. 【vuejs小项目——vuejs2.0版本】单页面搭建

    http://router.vuejs.org/zh-cn/essentials/nested-routes.html 使用嵌套路由开发,这里会出错主要把Vue.use(VueRouter);要进行引 ...

  8. geotrellis使用(二十)geotrellis1.0版本新功能及变化介绍

    目录 前言 变化情况介绍 总结 一.前言        之前版本是0.9或者0.10.1.0.10.2,最近发现更新成为1.0.0-2077839.1.0应该也能称之为正式版了吧.发现其中有很多变化, ...

  9. 【原】迎接微信winphone 5.0 版本的IE10样式兼容

    微信 Android 5.1 和 iPhone 5.1 已正式发布了,据说本12月底,微信将推出 Winphone 5.0版本,全面支持微信支付,它绑定 IE10 浏览器,那么做微信公众号的 H5 页 ...

随机推荐

  1. find之exec和args

    本来以为以前的差不多够用了.呵呵,看到很多高手用高技巧,心痒痒的觉得我自己还可以提升啊..哈哈哈. 这个实践起来之后,,SED,AWK也得深化一下,,,SHELL和PYTHON,作运维的两样都不能废. ...

  2. ubuntu12中设置PATH环境变量的几种方法(三种办法)

    如果在Ubuntu12系统中自行安装了一些软件,特别是使用tar.gz文件包安装的软件,通常会放在/usr/local或者/opt,甚至放在/home下,但是如果要调用或执行时,必须加上完整的路径才可 ...

  3. C语音--static变量

    static变量大概是两种情况 在函数里的static变量意味着这个变量的生存期是全局的,你可以想象它实际上就是在函数外声明的, 当然因为可见范围的原因其他函数不能访问它 在函数外的static变量意 ...

  4. VS2010使用静态编译的qt库(Qt 5)

    Qt 5引入了一种新的编写方式. Qt开发界面很方便,但发布程序就不那么方便了,你的把引用到的dll一起发布才行,要是能静态编译就好了,发布的时候只有一个exe多方便. 虽然以前为了方便,直接安装的q ...

  5. Android Listview异步动态加载网络图片

    1.定义类MapListImageAndText管理ListViewItem中控件的内容 package com.google.zxing.client.android.AsyncLoadImage; ...

  6. Maven自定义Archetype

    Maven提供了archetype帮助我们快速构建项目骨架,很便捷.但是,中央仓库中的archetype版本过于陈旧,构建好项目后,需要修改很多信息,甚是麻烦,那么如何自定义个archetype就显得 ...

  7. nodejs学习笔记之包、模块实现

        简单了解了node的安装和一些基本的常识之后,今天学习了node中很重要的包和模块的一些知识点.       首先学习一下包的规范,它由包结构和包描述两部分组成.包结构用于组织包的各种文件,包 ...

  8. eq,neq,gt,lt等表达式缩写

    eq 等于neq 不等于gt 大于egt 大于等于lt 小于elt 小于等于like LIKEbetween BETWEENnotnull IS NUT NULLnull IS NULL

  9. [RxJS] Reactive Programming - What is RxJS?

    First thing need to understand is, Reactive programming is dealing with the event stream. Event stre ...

  10. STL中map,set的基本用法示例

    本文主要是使用了STL中德map和set两个容器,使用了它们本身的一些功能函数(包括迭代器),介绍了它们的基本使用方式,是一个使用熟悉的过程. map的基本使用: #include "std ...