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 the QTWEBENGINEPROCESS_PATH environment 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 the PluginsPath variable 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驱动插件爱你等。一定要把响应的插件与应用一同发布。这些插件往往也需要配置特定的目录中。 printsupportimageformats 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;

时间: 2024-10-27 01:03:08

QT--以共享的方式发布应用,QT依赖库的相关文章

Qt程序在Windows上发布

最近写好了一个Qt5的小程序,并且已经配置好了所有的依赖库,需要发布. 这个主要是讲发布的 查找依赖库请看我的另一篇博客 Qt的程序在其他电脑上使用 http://blog.csdn.net/homechao/article/details/9113531 因为所有的文件比较大约70M左右,直接复制比较慢,也容易丢失文件 在网上看了很多使用第三方的软件进行打包,倒也是可以使用就是比较麻烦点 其实Windows上都已经有现成的打包软件啦,大家可能天天用,都没想到吧 那就是RAR,用起来非常简单,我

Qt 开发程序后的发布问题

Qt 开发程序后的发布问题 Qt 是一套跨平台 C++ 图形用户界面应用程序开发框架,利用它可以非常方便的开发各种类型的应用程序.但是随着 Qt 的发展,功能越来越强大,发布时需要文件也越来越多.发布时把需要的文件挑出来就变得有些难度,好多初学者花费了几天时间也没能让他的程序在别人的电脑上顺利的运行起来. 百度 "qt 程序发布" 可以找到一些文章.里面给出的方法都是自己一个个的把需要的文件找出来.其实不需要这么费劲,Qt 里早就提供了一个小工具帮我们发布程序. 打开Qt 的安装路径,

Qt入门之基础篇 ( 二 ) :Qt项目建立、编译、运行和发布过程解析

转载请注明出处:CN_Simo. 题解: 本篇内容主讲Qt应用从创建到发布的整个过程,旨在帮助读者能够快速走进Qt的世界. 本来计划是讲解Qt源码静态编译,如此的话读者可能并不能清楚地知道为何要静态编译,所以借此篇内容说明一下原由并为之后文章的学习做准备. 即使本片内容只是在围绕一个小小的HelloWorld程序开展,但还是希望朋友们不要急于求成,"欲速则不达". 文章整体思路: 我们循序渐进地来看,一个Qt应用的完成有以下一个重要的步骤: 项目创建->源码编译->程序运行

QT中共享库的生成与使用

一. 静态库的生成1. 测试目录: lib2. 源码文件名: mywindow.h, mywindow.cpp, 类MyWindow继承于QPushButton, 并将文字设置为"I'm in class MyWindow";3. 编写项目文件: mywindow.pro注意两点:TEMPLATE = libCONFIG += staticlib4. 生成Makefile:qmake5. 编译生成静态库libmywindow.amake 二. 静态库的使用1. 测试目录: test2.

Qt Mac 下软件Release 发布dmg

1.首先当然是用Qt Creator,编译一个Release版本的软件 注意到编译出来的大小非常小,才420KB,因为一些类库还没包含进去的原因.现在还只能在你本地运行,拷贝到其他Mac电脑就不能运行了. 2.生成最终版的app Qt安装目录的bin目录下有个工具叫macdeployqt就是供程序打包用的,使用非常简单,切换到该bin目录,执行 ./macdeployqt yourappname.app 就可以了.就会自动在yourappname.app所在目录重新生成一个新的比较大的app了.

发布利用 Qt Assistant来做帮助系统的程序遇到的问题

最近,一直在做反演初始模型可视化建模的软件 model Constraint,最后的步骤就是利用 Qt Assistant为自己的程序制作帮助系统. 1.<Qt Creator快速入门>和网上大部分的资料在介绍利用Qt Assistant为自己的程序制作帮助系统时,制作的帮助系统里都没有图片,都是全文字的.而我写的用户手册里面含有一些操作图示,所以需要图片.并且用户手册是用 WPS写的,一些图片就是浮与文字上方.之后转成 HTML文件后,会生成一个 html文件和同名文件夹,里面存放着 png

QT隐含共享类 QSharedData QSharedDataPointer

QT中很多类都实现了隐含共享例如QString,QByteArray等,(这两个并没有使用QSharedData和QSharedDataPointer来实现隐含共享),但是QT的确提供了一套隐含共享机制的类QSharedData和QSharedDataPointer.核心原理是隐含共享数据指针(QSharedDataPointer重载->操作来控制所有对QSharedData数据对象的访问,确保统一的访问接口,来控制数据变化的时候,将QSharedData的原子引用计数清零.如下是我编写的示例代

qt学习2——qt在window下的发布

很多时候,我们在用qt creator编译运行我们所写的程序时,程序能正常启动,但是当我们直接点击debug下面的exe文件时,程序却启动失败,会提示缺少某些dll文件,这是为什么呢? 是这样的,我们所写的qt程序,需要用到很多qt库,但这些库是以动态链接库的形式,加载在程序中的,如果用qt creator,则它会帮助我们将那些所需要的动态链接库链接到程序中去,但如果是我们手动去点击exe文件,则那些dll文件无法加载.如何解决呢? 解决方法有2: 1. 以环境变量的形式,将所需要的dll文件放

QT开发(二十五)——QT模板库

QT开发(二十五)--QT模板库 一.QTL模板库简介 QT模板库(QT Template Library 简称QTL)是一套提供对象容器的模板. QTL提供了对象的链表.对象的矢量(动态数组).从一个类型到另一个类型的映射(或称为字典)和相关的迭代器和算法.容器是包含和管理其它对象的一个对象,并且提供迭代器对被包含的对象进行访问. 1.QT容器类简介 容器是能够在内存中存储其他特定类型的对象的对象,一般是通用的模板类.QT提供了自己的一套容器类,即在QT的应用程序中,可以使用标准C++的STL