zoukankan      html  css  js  c++  java
  • Qt 程序打包发布总结

    1.  概述

     当我们用QT写好了一个软件,要把你的程序分享出去的时候,不可能把编译的目录拷贝给别人去运行。编译好的程序应该是一个主程序,加一些资源文件,再加一些动态链接库,高大上一些的还可以做一个安装文件。

    QT开发的程序发布的时候经常采用两种方式:

    l  静态编译,可生成单一的可执行文件。

    l  动态编译,需同时附上需要的dll文件。

    2.  发布准备

    不管采用哪种方式,首先我们要把项目的发布做一些准备,例如:准备程序的图标,将项目编译成release等。  

    2.1. 设置程序图标

    应用程序的图标分两种:

    l  主窗口图标,主要在程序运行时显示在主窗口左上角,或在任务栏上显示。

    l  运行程序图标,一般在桌面或文件夹中显示的缩略图标,可以点击后运行程序。

    2.1.1.   设置主窗口图标

    首先在绘图工具(例如Photoshop)中设计好图标,图标的分辨率最好大于32*32。图标需要用*ico或*png的文件。如果想偷懒一点,直接去这里(http://www.iconfinder.com/)下载,大量好看免费的图标。

    将刚才的生成的图标文件放到yourProjectFolder/Resources/images目录下,或者任意一个程序可以找到的位置。最好将图标文件添加到qrc中统一管理,qrc文件的格式如下:

    <RCC>

        <qresourceprefix="/background">

            <filealias="mainlogo">christmas_stocking.png</file>

        </qresource>

    </RCC>

    然后再主窗口中使用,代码如下,代码很简单,不过记住这句代码一定要放到Mainwindow的构造函数里去,不然不会work。

      /*setwindowicon*/

       setWindowIcon(QIcon(QStringLiteral(":/background/mainlogo")));

    程序运行后的效果如下:

    2.1.2.   设置运行程序的图标

    设置运行程序的图标在各个平台是各不相同的,下面分别介绍。首先准备分辨率最好大于32*32的图标文件。图标需要用*ico的文件。

    1)       Windows平台

    A)使用Visual Studio IDE开发工具

    如果使用的是VisualStudio IDE开发工具,例如在VS2015中,项目上右击,添加,资源,选择icon,然后将之前准备的*ico图标文件导入,确定之后项目中就会出现一个 projectname.rc 的文件。

     

    B)使用QTCreator的IDE开发工具

    如果你是使用qmake生成makefile文件或使用QT Creator IDE,那么按下面三步实施:

    l  第一步:创建一个包含图标图像的ICO文件,并将其保存在资源文件目录下,例如命名为:myapp.ico;

    l  第二步:创建一个.rc文件,包含如下内容:

    IDI_ICON1               ICON    DISCARDABLE     "myapp.ico"  

    l  第三步:在工程文件myapp.pro文件中写入如下内容:

    RC_FILE = myapp.rc  

    再次编译程序,即可达到效果,效果图如下:

     

    2)       Mac OS X平台

    虽然许多程序可以创建图标文件(.icns),推荐的方法是使用由苹果公司提供的程序iconutil。Iconutil是一个命令行工具,它允许您导入多个不同大小的图标(在不同的上下文中使用),并能压缩文件。在您的项目目录中将所有一系列的图标保存在一个文件中。

    如果您正使用qmake生成makefile文件,您只需要将一个单一的行添加到您的.pro工程文件。例如,如果您的图标文件的名称是myapp.icns,并且您的项目文件名称是myapp.pro,加入这一行到myapp.pro:

    ICON = myapp.icns  

    这将确保qmake把你的图标放在适当的位置并为图标创建一个Info.plist条目。

    如果你不使用qmake,你必须手动执行以下几点:

    1)   为您的应用程序(使用PropertyListEditor,在Developer/Applications中可以找到)创建一个Info.plist文件。

    2)   在Info.plist文件(同样,使用PropertyListEditor)关联您的.icns记录和CFBundleIconFile记录。

    3)   将Info.plist文件复制到你的应用程序包的Contents目录。

    4)   复制.icns文件到你的应用程序包的Contents/Resoures目录。

    3)       通用的Linux平台

    在本节中,我们简要地介绍一下在两种常见的Linux桌面环境:KDE和GNOME,为应用程序提供图标的相关问题 。为这两种桌面,用来描述应用程序图标的核心技术是相同的,也可以适用于其他,但具体到每一个来讲也有各自的细节。对使用这些Linux桌面系统的标准信息的主要来源是freedesktop.org。有关其他Linux桌面的信息,请参阅您感兴趣的桌面文档。

    通常情况下,用户不直接使用可执行文件,而是通过点击桌面上的图标来启动应用程序。这些图标是包含带有关于它的图标信息的应用程序的描述表示的“桌面项” 文件。这两种桌面环境都能够在这些文件中检索信息,并且可以用它们来生成应用程序的快捷方式到桌面上,在开始菜单中,或者在面板上。

    有关桌面项文件的更多信息,可以在Desktop EntrySpecification中找到。

    虽然桌面项文件可以有效地封装应用程序的详细信息,我们仍然需要将图标存储在每个桌面环境中的常规位置。用于图标的一些位置在Icon ThemeSpecification中给出了。

    虽然用于定位图标的路径依赖于在桌面上的使用和它的配置,下面所有这些目录结构应该遵循相同的模式:子目录都按照主题,图标大小和应用程序类型进行组织。 通常,应用程序图标被添加到高彩主题,因此方形的应用程序图标的大小为32像素,它将被存储在hicolor/32x32/apps目录的图标路径的下方。

    1、   K桌面环境(KDE)

    应用程序图标可以被所有用户或者一个单一的用户安装使用。当前登录到他们的KDE桌面的用户可以通过使用kde-config发现这些位置,例如,通过在终端窗口中键入执行下列操作:

    kde-config --pathicon

    通常情况下,被输出到stdout的以冒号分隔的路径列表中包含了用户特定的图标路径和全系统的路径。下面这些目录中,可以根据在Icon ThemeSpecification中描述的约定来定位并安装图标。

    如果您正在专门为KDE开发,你不妨利用KDE build system的优势来配置您的应用程序。这可以确保你的图标被安装在KDE的适当位置。

    KDE的开发者网站是http://developer.kde.org/

    2、   GNOME

    应用程序图标都存储在包含与体系结构无关文件的一个标准全系统目录下。这个位置可以通过使用gnome-config来确定,例如,通过在一个终端窗口中键入以下命令:

    gnome-config--datadir

    输出在标准输出stdout的路径指的是包含一个名为pixmaps目录的位置;这个pixmaps目录中的目录结构中在Icon ThemeSpecification中进行了描述。

    如果您正在专门为GNOME开发,你可能希望使用一组标准的GNU Build Tools,在GTK+/GnomeApplication Development book的相关章节也作了说明。这可以确保你的图标被安装在为GNOME中的适当位置。

    2.2. 编译release版本

    注意将运行程序编译方式设置成Release,因为debug版本的程序中包含了调试信息,可以用来调试。而真正要发布程序时,要使用release版本,这样可以减少发布程序的体积同时增加软件的安全。

    上图演示在Qt Creator中的设置方式,选中IDE左边的侧边栏的项目,然后再构建设置中将构建配置设置为Release。

    上图演示在VS2015中的设置方式,选中IDE右边的解决方案管理器中的项目,然后在IDE上边的工具栏中将构建配置设置为Release。

    3.  发布程序

    安装QT SDK 后,默认采用的是动态链接库的编译方式,如果需要发布程序,需要在可执行的文件中添加必须的动态链接库,然而有些动态链接库文件很大,这并不是我们想要的结果。

    最好的办法是提交一个静态链接的程序。但是安装的Qt是动态编译的,要生成静态的版本,就需要自己重新进行编译。

    3.1. 静态编译

    l  优点,发布简单,单一文件。

    l  缺点,库文件很大,更新程序版本不方便。每次升级,都要重新分发所有的内容。

    静态发布虽然不需要较多的dll,发布简单、方便,但是往往会牵扯到授权问题(详情请查看Qt LGPL授权),动态发布则可以避免。。。如果附带了Qt的dll,就相当于发布了Qt的dll,而這些库是属于Qt的,这足以保证使用者知道程序使用了LGPL版本的Qt。

    1)       Windows平台静态编译

             静态编译首先需要将

    mingw平台静态编译,在编译Qt的时候,有个configure.exe程序,

    configure.exe-static -platform win32-g++

    可以产生静态编译项目文件。然后,

    mingw32-makesub-src

    就可以编译出静态库。如果只是用来分发程序,也可以mingw32-makerelease sub-src只编译一个静态库。

    VC2015平台,在编译Qt的时候,configure.exe-static-platform win32-msvc2015

    然后nmakesub-src或者nmake release sub-src完成静态编译。

    再然后,就是把你的程序重新用静态编译的Qt再编译一次。

    你会得到一个非常大的可执行程序。推荐使用AspPack压缩一下。就可以发给用户了。

    2)       linux平台静态编译

    1、下载源安装程序,如 qt-everywhere-opensource-src-5.5.1.tar.gz

    2、解压到某一目录

    3、cd 进入解压后的目录,命令:

    ./configure-static -release -qt-zlib -qt-gif -qt-libpng -qt-libmng -qt-libjpeg -nomakedemos -nomake examples -qt-sql-sqlite -prefix /usr/local/Trolltech/Qt-5.5.1_static

    参数-static 指的是要采用静态编译Qt的方法

    参数-release指的是只编译release版本的库

    参数-qt-zlib -qt-gif-qt-libpng -qt-libmng -qt-libjpeg 是更好确定Qt编译出的程序能在目前不知的系统下运行。

    参数-nomake demos-nomake examples 指的是不编译demos和examples

    参数-qt-sql-sqlite 如果没有这个参数,configure的时候,可能会提示sqlite 有问题而中止。

    参数 -prefix/usr/local/Trolltech/Qt-5.5.1_static 指明静态编译的Qt安装的目录,命名Qt-5.5.1_static是为了区别动态编译安装的Qt,因为如果没有这个参数,安装时会覆盖之前动态编译安装的Qt(如果有的话)。

    u  注:  如果出现错误:Basic XLibfunctionality test failed!

    You might need to modify theinclude and library search paths by editing

    QMAKE_INCDIR_X11 andQMAKE_LIBDIR_X11

    解决办法:yum installlibX*  

    (如果是Ubuntu也可运行sudo apt-getinstall libx11-dev libxext-dev libxtst-dev)

    4、没问题后

    make

    5、make没问题后再 

    sudo make install

    6、增加(或改变)环境变量: (也可以不添加环境变量,使用绝对路径进行编译),在你home目录下你的的名字的目录中,在.profile文件中追加(或改变)如下环境变量:(为Qt设置一些特定的环境变量,这个很重要!.profile文件是隐藏的,可在你的名字目录下,按Ctrl+H显示所有文件查看到)

    QTDIR=/usr/local/Trolltech/Qt-5.5.1_static/   

    PATH=$QTDIR/bin:$PATH 

    MANPATH=$QTDIR/doc/man:$MANPATH   

    LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH

    export QTDIR PATHMANPATH LD_LIBRARY_PATH  

    7、重启

    8、在终端测试一下qmake

    3)       MAC OS X系统平台静态编译

    在MAC OS X系统平台下静态编译QT应用还是比较麻烦的,首先需要静态编译QT应用依赖的各个库,然后再进行连接生成运行文件,具体步骤参看链接:http://doc.qt.io/qt-5/osx-deployment.html

    3.2.  附加Dll文件

    l  优点,更新方便,发布多个产品时,可以统一使用一个库。

    l  缺点,文件多、杂。

    Qt官方开发环境默认使用动态链接库方式,在发布生成的可执行程序时,我们需要复制一大堆动态库,如果自己去复制动态库,很可能丢三落四,导致程序在别的电脑里无法正常运行。 因此 Qt 官方开发环境里自带了一个部署工具来帮助开发者自动拷贝大部分的依赖库。在不同的平台使用方式也有所不同。

    1)       Windows平台

    Windows开发环境下windeployqt工具 (如果你已经将Qt的bin目录加入PATH环境,那么你可以直接在命令行使用windeployqt调用.)。首先,将项目中的release文件中的可执行文件拷到一个新建的文件夹中,例如project.exe,用Qt自带的生成必备的dll文件的程序windeployqt,来把必要的动态库拷到该文件夹中,打开命令行,输入windeployqtproject.exe,这时候大部分的dll文件都自动拷贝过来了,但是如果项目还用了一些其他的SDK,比如OpenCV,Chartdir51等等,就需要手动将所需dll拷贝过来,如果不知道还需要哪些软件,可以用Dependency Walker来查看缺少哪些dll文件。

    拷贝完成后文件夹下的文件清单如下:

    注意:如果发布的应用是Qt Quick Application应用,那么命令行需要加上QML的安装目录。命令中的D:QtQt5.5.1qml是qml的安装目录,请换成你自己的qml安装目录!!!!!

    windeployqt hello.exe--qmldir D:QtQt5.5.1qml

    接下来要高大上的朋友就可以用Enigma VirtualBox软件虚拟化工具将多个文件封装到应用程序主文件,从而制作成为单执行文件的绿色软件。

    2)       linux平台

    在X11平台下qt程序,首先准备好程序中需要使用的资源,库和插件...,比如你的可运行程序取名叫作panel,那把你的panel,那些libQt*.so.4和libQt*.so.4.6.0(链接和共享库都要)放在同一目录下(也可以不同,只要小小修改下shell文件).plugins就不多说了。

    在程序的同目录下,新建一個空文档,取名panel.sh (文件名与程序名同名,扩展名为sh,shell文件)。在panel.sh中原封不动的写入以下语句:  

    #!/bin/sh

    appname=`basename $0 | sed s,/.sh$,,`

      dirname=`dirname$0`

      tmp="${dirname#?}"

      if ["${dirname%$tmp}" != "/" ]; then

       dirname=$PWD/$dirname

     fi

       LD_LIBRARY_PATH=$dirname

    export LD_LIBRARY_PATH

       $dirname/$appname$*

    保存文件,退出。在终端給文件+x属性: 切换到程序的目录,输入

       chmod +x panel.sh

    然后运行shell文件就行了(确保panel程序具备X属性),它会自动更改环境变量,运行程序。

    如果要调试shell文件,只需要在终端输入:

       sh -x panel.sh

    这样就ok了。

    如果需要把执行程序制作成DEB或RPM包的话请参考链接:

    Deploying aQt5 Application Linux: https://wiki.qt.io/Deploying_a_Qt5_Application_Linux

     

    3)       MAC OS X系统平台

    由于Qt的库并不是OS X标配的,所以我们要自己去复制库到app包里,才可以让app在其他未安装Qt的电脑上运行。

    比较幸运的是,Qt为我们提供了macdeployqt工具,借助于此,在OS X上发布Qt写的程序几乎是所有平台中最简单的。

    注:我电脑配置了Qt的bin环境,所以可以直接使用macdeployqt,如果没配置,可以用绝对路径去找。

    1.发布widgets程序

    a)       这个比较方便。选择Release模式,编译

    b)       运行macdeployqt

         对于我的工程,命令是:

    macdeployqt /Users/Ocean/Desktop/build-untitled-Desktop_5_5_1_64bit-Release/untitled.app-dmg

    然后回车,就打包好了。之后我们会发现,app目录下多了一个dmg文件

    此dmg文件,里面的app就是我们发布的app了。把dmg拷贝给别人,别人就可以直接使用了。

    l  注:如果直接拷贝app文件给别人,别人是无法直接运行的,会有权限问题(要用chmod给可执行文件加上x权限才可以运行)。而压缩过(zip或者dmg)后,拷贝给别人,别人是可以直接运行,没有权限问题。

    l  注:-dmg的意思就是在拷贝好库后,生成一个dmg文件,可以不加这个参数。

    2.发布quick2程序

        这个相对麻烦一点

    a)       选择Release模式,编译

    b)       打开终端,先切换编译的目标目录下

            对于我的工程,命令是:

               cd /Users/Ocean/Desktop/build-untitled-Desktop_5_5_1_64bit-Release

        

    c)       运行macdeployqt

            对于我的工程,命令是:

                macdeployqt untitled.app-qmldir=../untitled -dmg

            然后回车,就打包好了。

    l  注1:和widgets发布程序不同,untitled.app 这个名字,要直接输入,不要写 ./untitled.app 或者是其他的 绝对/相对 路径,不然打包出来的文件无法使用!!会报错!!!

    l  注2:-qmldir=../untitled的意思就是说在../untitled 目录下有qml文件,让macdeployqt去分析它们,把要用的库找过来。

     

     转自:http://blog.csdn.net/liuyez123/article/details/50462637
     
    qt5.5程序打包发布以及依赖
    玩qt5也有一段时间了,惭愧的是一直没有好好的发布过程序,因为写的都是小程序没啥需要用到发布,而且qt也说不上很熟悉,本来打算到基本掌握qt之后再来研究研究怎么打包程序,最近晚上的空闲时间多了,闲着也是闲着,于是便来试试。
    在网上搜索了一下资料,发现资料比较少,qt5打包的也只看见几篇博文,也不是很详细,所以当我成功的打包了我的第一个程序之后心里想着的就是一定要把经验共享出来,这方法不一定是最好的,而且可能也还存在很多问题,这都有待我以后慢慢挖掘,也望大家多多指点,共同进步。
    打包:
    (1)首先程序要想发布,在编译器编译一定要选择“release”而不是“debug”,编译成release版本;
    qt5.5程序打包发布以及依赖
     
      (2)编译成release之后,找到目录:
    qt5.5程序打包发布以及依赖

    其实如果直接在这里双击“chat.exe”也是会提示缺少的dll文件,然后在qt的安装目录找对应的dll文件,将dll复制到该目录即可,dll在下面的路径:(VS版本可能有点不一样,不过都是bin目录下的)
    qt5.5程序打包发布以及依赖但是这样我试过很多次,即使提示的dll都复制进来了,双击也可以运行了,可是放到其他电脑还是无法运行,这是因为依旧缺少文件,如plugins下的一些插件,因此这样还是无法打包成功的。
    于是为了更加方便快捷的解决这个问题,我们使用qt自带的windeployqt.exe寻找依赖的文件,我们使用批处理bat,在当前目录(即编译成release后的可执行程序所在目录)新建个bat文件:
    qt5.5程序打包发布以及依赖
    使用记事本打开或者其他编辑工具亦可,然后把下面的代码复制进去保存;
    如果使用的msvc版本的:
    C:QtQt5.4.25.4msvc2013_64inwindeployqt.exe myexe.exe
     
    pause
     
     
    如果使用的是mingw版本的:
    C:QT55.5mingw492_32inwindeployqt.exe myexe.exe
     
    pause
     
    代码解析:C:QtQt5.4.25.4msvc2013_64inwindeployqt.exe这个是windeployqt.exe工具的路径,要根据自己的qt安装情况进行修改,首先在这里看能不能找到windeployqt.exe,找到了直接把其路径复制过来即可;myexe.exe则是你的可执行程序的名称,不要照抄这里的。
     
    (3)上面步骤完成之后直接双击这个bat文件就会把需要用到的所有dll文件自动复制到当前目录下:
    qt5.5程序打包发布以及依赖
    很便捷。
    这个时候再去双击你的可执行程序应该就可以运行了。
     
    (4)接着就需要把这些文件打包成一个exe文件了,我们可以用Enigma Virtual Box这款软件, 现在最新的版本已经是7.4了,百度一搜索就有,然后就开始添加文件打包了:
    qt5.5程序打包发布以及依赖

    qt5.5程序打包发布以及依赖
    最后点击“执行封包”就能生成一个exe文件,如图示:
    qt5.5程序打包发布以及依赖于是这个打包好的程序就可以放到其他电脑上运行啦。
     
    (5)如果有需要制作成安装包程序可以使用Inno setup这款软件制作安装包,当然网上还有很多其他类似的,就需要大家自己去尝试啦,制作安装包的方法也是类似的,准备所需要的文件之后添加进去就可以了,网上很多这样的教程,大家参考这篇博文:http://blog.csdn.net/ruifangcui7758/article/details/6662646。
     
     
    总结,我测试过很多次打包成exe在其他电脑上运行都是没有问题的,但是在群里跟他人讨论的时候他们说在某些情况还是会遇到问题,比如用到OpenGL库,一些第三方库如opencv等这样打包运行时就会出问题,我估计是
    qt自带的windeployqt.exe这款工具有些库还是找不到的,尤其是外部的库,也就是说还是有一定的局限性,当然这只是我的猜测,我现在还没遇到,等遇到这种情况的时候我会再去寻找解决方法的,到时会继续更新这篇博文。
     
    转自:http://blog.sina.com.cn/s/blog_66cd08930102w74s.html
     

    Qt程序打包发布方法(使用官方提供的windeployqt工具)

    在集成开发环境 QtCreator 中可选择 “Qt Widgets Application” 或 “Qt Quick Application” 两种方式生成图形界面应用程序。

    下面介绍第两种方式创建应用的发布方式。

    2. Qt Quick Application

    首先用 QtCreator 新建一个 Qt Quick Application 项目,直接用默认的项目模版,点击下一步生成项目,项目名字假定是 helloqml。
    然后以 Release 方式编译生成 exe 程序:

    然后找到项目的构建目录,比如项目源码目录 C:QtProshelloqml 。
    它的构建目录是:C:QtProsuild-helloqml-Desktop_Qt_5_4_0_MinGW_32bit-Release 。
    进入这个目录,再进入 release 子文件夹,找到 helloqml.exe ,复制到一个新的单独的文件夹里面,比如 D:helloqml 文件夹里面。

    然后从开始菜单打开 Qt 命令行,进入D:helloqml文件夹:cd /d D:helloqml
    然后使用 windeployqt 工具命令:windeployqt helloqml.exe --qmldir C:QtQt5.4.05.4mingw491_32qml

    注意不要跟完全一样照抄上条命令!--qmldir 是指出 Qt 库里面的 qml 文件夹位置,上面命令里 C:QtQt5.4.0 是 Qt 官方开发环境安装的文件夹,C:QtQt5.4.05.4mingw491_32 是Qt类库的目录(QTDIR),因此使用的 --qmldir 后面写的是 C:QtQt5.4.05.4mingw491_32qml ,读者Qt环境安装路径不一样,要根据实际情况修改!

    然后可以看到 D:helloqml 文件夹里有一大堆文件,就是 QtQuick程序需要的依赖文件。将整个 D:helloqml 文件夹 打包就可以发布出去,在别的电脑上使用。

    这个 D:helloqml 文件夹里的东西很多,看不懂就不要删,老老实实打包发布就行了。


    上面是最简单的程序发布,实际复杂程序可能还带一些图片文件、数据库文件、配置文件之类的,可以按自己需要添加这些文件到发布文件夹里面。

    转自:http://blog.csdn.net/qq_21792169/article/details/56848407

  • 相关阅读:
    Java的静态块与实例块(转)
    Programming Ability Test学习 1031. Hello World for U (20)
    Programming Ability Test学习 1011. World Cup Betting (20)
    Programming Ability Test学习 1027. Colors in Mars (20)
    Programming Ability Test学习 1064. Complete Binary Search Tree (30)
    Programming Ability Test学习 1008. Elevator (20)
    【maven详解-生命周期】Maven的生命周期和插件
    【maven详解-插件】maven插件学习之源码插件Source Xref
    $(document).ready(){}、$(fucntion(){})、(function(){})(jQuery)onload()的区别
    你还没真的努力过,就轻易输给了懒惰
  • 原文地址:https://www.cnblogs.com/liushui-sky/p/7852361.html
Copyright © 2011-2022 走看看