QT--以共享的方式发布应用,QT依赖库
Building Qt as a Shared Library
因为:QT基本上都是采用动态编译的(被安装的OS中的),(如安装包往往都是默认动态编译处理好的动态库),所以我们采用动态连接的方式进行发布应用。
如果采用静态的方式发布,则需要重新通过对QT的源码进行“静态编译”后形成lib,或者obj的形式。然后安装在开发的系统中。
《1》采用QTCreater继承开发环境编译,以及发布处理。
总体来说非常方便,
(1)选择器以Debug或者Release形式构建
(2)先编译通过,完成bug修复
(3)然后构建成功,发布响应的版本
注意:根据缺少的dll,与exe一同打包处理,其次,需要根据QT安装目录中的plugins插件,添加响应的插件。
说明:
QT应用总的各种资源,图片等,都已经被编译仅exe可执行文件中。所以不需要对此类文件打包处理。
《2》采用命令行的形式发布
(1)进入当前目录位置,执行以下命令,
qmake -config release
nmake
发布应用:把要部署的应用环境中:
(1)与QT相关的DLL(项目总用到的)
(2)系统OS平台相关的插件,如Qwindows.dll
(3)QTPulgins部分的,QT需要寻找借助这些文件,处理。
1. ICU DLLs :QT需要使用ICU库来进行UNICODE编码支持,要与版本保持一致。
2. 如果使用了QtWebEngine, 需要
<Qt install path>/bin/QtWebEngineProcess.exe放在应用相同的位置。 If you chose to deploy the binary to a different path, set theQTWEBENGINEPROCESS_PATHenvironment variable to the binary's absolute path (including its file name).因为QT在开发WebKit应用时,需要通过在安装的时候,通过此环境变量直接执行:此插件QtWebEngineProcess.exe,这样可以更有效率,体验更好。3. 如果支持HTML5视频, 需要
ffmpegsumo.dll(WebM codec plugin网络视频编解码插件) 放在exe应用当先目录的子目录qtwebengine文件夹下面,或者 or under the path that thePluginsPathvariable was set to in<Qt install path>/<Qt version>/msvc2013/qt.conf.qt.conf是Qt库的配置文件,其中应该有变量:PluginsPath配置。4. 如果项目应用需要依赖“当前编译器”中的执行库,则同样这些库需要随应用一同发布。包括直接依赖的库,以及“间接插件”间接依赖的库。
可以采用depends tool工具查看Qt依赖的库有哪些。
把执行文件exe以及所有依赖的dll共同放置在一起。确保部署环境没有QT安装的文件,以及QT的环境变量没有QT。如果应用可以正常运行,则至此应该可以部署成功。但是,如果QT的项目中需要依赖的QT插件,则如果没有插件依赖的DLL,则相应的功能不能正常使用。
QtWebEngine引擎支持依赖的“文件”:
QT库中的qt.conf配置文件
QT提供的依赖查询工具 Dependency Walker Tool (QT提供)
(1)查看应用XXXX.exe依赖的数据包,如下图。
(2)查询项目中qT采用的插件所依赖的dll
Qt 插件的处理方式与正常的DLL不同,不能简单的把插件plugs dll拷贝到与exe相同的位置。QT中插件的应用会寻找exe当前目录的目录“plugins”,在这个子目录中寻找相应的插件文件库等。
所以,如果确保我们的exe应用完全正常运行,需要在当前exe目录下新建子目录“plugins”,然后把插件的dll拷贝进去。
整个exe当前的文件应该如下形式:
插件问题的说明:
(1) the Qt Platform Abstraction (QPA) layer,QT5中的QT抽象平台层,QTGUI应用需要在特定的子目录下默认platform,下面配置 qwindows.dll.
(2)QT可能需要多种插件支持:打印插件, JPEG图像格式插件, SQL驱动插件爱你等。一定要把响应的插件与应用一同发布。这些插件往往也需要配置特定的目录中。 printsupport, imageformats or sqldrivers。
如果需要采用WEbKit开发网页视图,则需要包含l text codec plugins来支持网页的多种编码 的解析。
这些插件都是通过“硬编码”(默认)进了QTCore库中。默认,QT安装目录下的“plugin”目录是其搜索目录。这样的弊端,要求目的部署环境PC需要和QT安装的目录一样,这样才能找到使用的插件文件。通过以下方式来做应用开发的插件问题支持:
- Using qt.conf. This approach is the recommended if you have executables in different places sharing the same plugins.
- Using QApplication::addLibraryPath() or QApplication::setLibraryPaths(). This approach is recommended if you only have one executable that will use the plugin.
- Using a third party installation utility to change the hard-coded paths in the QtCore library.
using QApplication::addLibraryPath ,则 qApp->libraryPaths().返回相同的顺序the same order as the QStringList 先添加的会被QT首先寻找。如果使用qApp->setLibraryPaths(),则这样可以决定被寻找的顺序。
这些插件都可以直接在QT安装目录下的插件文件目录中拷贝:
如果还需要执行编译器特定动态库(依赖于响应的开发VS版本):
如果项目中需要ICU支持,则需要包含特定的如下库
如果需要ANGLE支持,则需要包含如下库
综上:
按照上述的顺序,将项目应用exe,以及所有相关的文件以响应的配置目录方式处理。则可以确保你的应用在(1)没有QT库,(2)没有编译器安装 的部署环境下运行正常运行!!!
其他说明:
(1)对于插件需要特殊的子目录配置,则可以替代的方案;
在可以在项目应用的main函数中,便捷的通过以下方式,在QApplication对象创建之前,把响应的目录添加进QT的应用中,这样当QT项目中在执行寻找插件时:首先在应用中的路劲寻找,然后在特定的插件默认位置寻找。 using QApplication::addLibraryPath() or QApplication::setLibraryPaths().
qApp->addLibraryPath("C:\some\other\path");
通过这种方式,所有任意位置的插件都可以被包含。在最终部署时也可以将插件dll与其他一般dll放置在一起,方便管理配置。
《3》当QT项目采用VS2010等IDE开发部署情况
需要做的额外操作:
(1)如果VisualC++库需要准备的配置编译器版本以及相关的C运行时库版本,这样可以避免因为C运行时库不同而报的异常。
参考http://www.cnblogs.com/icmzn/p/5935361.html
end;
QT--以共享的方式发布应用,QT依赖库的更多相关文章
- [Qt Creator 快速入门] 第1章 Qt Creator简介
Qt Creator 是一个跨平台的.完整的 Qt 集成开发环境,其中包括了高级C++代码编辑器.项目和生成管理工具.集成的上下文相关的帮助系统.图形化调试器.代码管理和浏览工具等.这一章先对 Qt ...
- QT中共享库的生成与使用
一. 静态库的生成1. 测试目录: lib2. 源码文件名: mywindow.h, mywindow.cpp, 类MyWindow继承于QPushButton, 并将文字设置为"I'm i ...
- Qt入门之基础篇 ( 二 ) :Qt项目建立、编译、运行和发布过程解析
转载请注明出处:CN_Simo. 题解: 本篇内容主讲Qt应用从创建到发布的整个过程,旨在帮助读者能够快速走进Qt的世界. 本来计划是讲解Qt源码静态编译,如此的话读者可能并不能清楚地知道为何要静态编 ...
- 回归Qt——写在Qt5.10发布之日
今天偶然看到一条关于Qt5.10发布的消息,发现Qt经历了诺基亚风波之后发展得依然良好,感到很欣慰.回头看上次关注Qt技术还是2011年,那时候用Qt4.7做一个小项目,对于一个写Win32界面和MF ...
- 发布利用 Qt Assistant来做帮助系统的程序遇到的问题
最近,一直在做反演初始模型可视化建模的软件 model Constraint,最后的步骤就是利用 Qt Assistant为自己的程序制作帮助系统. 1.<Qt Creator快速入门>和 ...
- 解析 Qt 程序在Windows 下发布
原文请看:http://www.cnblogs.com/elect-fans/archive/2012/03/15/2408579.html Qt 程序在Windows下发布是本文要介绍的内容,不多说 ...
- Linux下Qt创建共享库与链接共享库详解
随着程序写的逐渐变多,或多或少的我们都会使用别人写好的库:或者我们不想让别人看到我们的一些核心程序,可以将核心程序封装成库.本次和大家分享的是在Ubuntu下使用Qt生成共享库以及在Qt中链接共享库的 ...
- ubuntu14.04 + cocos2d-x-2.2.6 + eclipse发布android + Qt Creator4
先把需要的东西准备好,打开控制台,执行以下语句: sudo apt--jdk lib32z1 lib32ncurses5 lib32bz2- 接下来,准备好cocos2d-x-2.2.6和 andro ...
- Qt国际化(Q_DECLARE_TR_FUNCTIONS() 宏给非Qt类添加翻译支持,以前没见过QTextEncoder和QTextDecoder和QLibraryInfo::location()和QEvent::LanguageChange)
Internationalization with Qt 应用程序的国际化就是使得程序能在国际间可用而不仅仅是在本国可用的过程. Relevant Qt Classes andAPIs 以下的类支持Q ...
随机推荐
- oracle分配权限:一个用户访问另一个用户的表
相当于alias(别名),比如把user1.table1在user2中建一个同义词table1 create synonym table1 for user1.table1; 这样当你在user2中查 ...
- 搭建nexus后,进入首页的时候出现warning: Could not connect to Nexus.错误
nexus出现这种问题,一般是版本太旧,换一个高版本的nexus就能解决了.
- windows2008r2环境双实例安装mysql5.6
windows2008r2环境双实例安装mysql5.6 环境:windows2008 r2 标准版 1.默认安装了一个mysql5.6端口为3306 2.使用msi文件安装需要.net4.0支持,安 ...
- asp.net web api 测试帮助页面建立并测试
asp.net web api 测试帮助页面建立并测试 现在使用WEB API来开发,越来越流行. 在开发过程中的测试调试,可以使用Fiddler等工具来帮助测试外,还有: 在asp.net 中有种方 ...
- [转载] Android中Xposed框架篇---利用Xposed框架实现拦截系统方法
本文转载自: http://www.wjdiankong.cn/android%E4%B8%ADxposed%E6%A1%86%E6%9E%B6%E7%AF%87-%E5%88%A9%E7%94%A8 ...
- The certificate used to sign “AppName” has either expired or has been revoked. An updated certificate is required to sign and install the application解决
问题 The certificate used to sign "AppName" has either expired or has been revoked. An updat ...
- grep 和 wc命令 --- !管道命令!
Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来.grep全称是Global Regular Expr ession Print,表示全局正则表 ...
- java异常与处理
1:Java中的所有不正常类都继承于Throwable类.Throwable主要包括两个大类,一个是Error类,另一个是Exception类: 2:其中Error类中包括虚拟机错误和线程死锁,一旦E ...
- python 文件拷贝
用python实现了一个小型的自动发版本的工具.这个“自动发版本”有点虚, 只是简单地把debug 目录下的配置文件复制到指定目录,把Release下的生成文件复制到同一指定,过滤掉不需要的文件夹(. ...
- weblogic myeclipse小知识
新建域 http://jingyan.baidu.com/article/f7ff0bfc72904e2e27bb136f.html svn 上down下来一些新项目的时候没法添加到weblogic ...