doc/src/deployment/deployment.qdoc
branchRCL_3
changeset 7 3f74d0d4af4c
equal deleted inserted replaced
6:dee5afe5301f 7:3f74d0d4af4c
       
     1 /****************************************************************************
       
     2 **
       
     3 ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
       
     4 ** All rights reserved.
       
     5 ** Contact: Nokia Corporation (qt-info@nokia.com)
       
     6 **
       
     7 ** This file is part of the documentation of the Qt Toolkit.
       
     8 **
       
     9 ** $QT_BEGIN_LICENSE:LGPL$
       
    10 ** No Commercial Usage
       
    11 ** This file contains pre-release code and may not be distributed.
       
    12 ** You may use this file in accordance with the terms and conditions
       
    13 ** contained in the Technology Preview License Agreement accompanying
       
    14 ** this package.
       
    15 **
       
    16 ** GNU Lesser General Public License Usage
       
    17 ** Alternatively, this file may be used under the terms of the GNU Lesser
       
    18 ** General Public License version 2.1 as published by the Free Software
       
    19 ** Foundation and appearing in the file LICENSE.LGPL included in the
       
    20 ** packaging of this file.  Please review the following information to
       
    21 ** ensure the GNU Lesser General Public License version 2.1 requirements
       
    22 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
       
    23 **
       
    24 ** In addition, as a special exception, Nokia gives you certain additional
       
    25 ** rights.  These rights are described in the Nokia Qt LGPL Exception
       
    26 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
       
    27 **
       
    28 ** If you have questions regarding the use of this file, please contact
       
    29 ** Nokia at qt-info@nokia.com.
       
    30 **
       
    31 **
       
    32 **
       
    33 **
       
    34 **
       
    35 **
       
    36 **
       
    37 **
       
    38 ** $QT_END_LICENSE$
       
    39 **
       
    40 ****************************************************************************/
       
    41 
       
    42 /*!
       
    43     \page deployment.html
       
    44     \title Deploying Qt Applications
       
    45 
       
    46     Deploying an Qt application does not require any C++
       
    47     programming. All you need to do is to build Qt and your
       
    48     application in release mode, following the procedures described in
       
    49     this documentation. We will demonstrate the procedures in terms of
       
    50     deploying the \l {tools/plugandpaint}{Plug & Paint} application
       
    51     that is provided in Qt's examples directory.
       
    52 
       
    53     \section1 Static vs. Shared Libraries
       
    54 
       
    55     There are two ways of deploying an application:
       
    56 
       
    57     \list
       
    58         \o Static Linking
       
    59         \o Shared Libraries (Frameworks on Mac)
       
    60     \endlist
       
    61 
       
    62     Static linking results in a stand-alone executable. The advantage
       
    63     is that you will only have a few files to deploy. The
       
    64     disadvantages are that the executables are large and with no
       
    65     flexibility (i.e a new version of the application, or of Qt, will
       
    66     require that the deployment process is repeated), and that you
       
    67     cannot deploy plugins.
       
    68 
       
    69     To deploy plugin-based applications, you can use the shared
       
    70     library approach. Shared libraries also provide smaller, more
       
    71     flexible executables. For example, using the shared library
       
    72     approach, the user is able to independently upgrade the Qt library
       
    73     used by the application.
       
    74 
       
    75     Another reason why you might want to use the shared library
       
    76     approach, is if you want to use the same Qt libraries for a family
       
    77     of applications. In fact, if you download the binary installation
       
    78     of Qt, you get Qt as a shared library.
       
    79 
       
    80     The disadvantage with the shared library approach is that you
       
    81     will get more files to deploy. For more information, see
       
    82     \l{sharedlibrary.html}{Creating Shared Libraries}.
       
    83 
       
    84     \section1 Deploying Qt's Libraries
       
    85 
       
    86     \table
       
    87     \header
       
    88         \o {4,1} Qt's Libraries
       
    89     \row
       
    90         \o \l {QtAssistant}
       
    91         \o \l {QAxContainer}
       
    92         \o \l {QAxServer}
       
    93         \o \l {QtCore}
       
    94     \row
       
    95         \o \l {QtDBus}
       
    96         \o \l {QtDesigner}
       
    97         \o \l {QtGui}
       
    98         \o \l {QtHelp}
       
    99     \row
       
   100         \o \l {QtNetwork}
       
   101         \o \l {QtOpenGL}
       
   102         \o \l {QtScript}
       
   103         \o \l {QtScriptTools}
       
   104     \row
       
   105         \o \l {QtSql}
       
   106         \o \l {QtSvg}
       
   107         \o \l {QtWebKit}
       
   108         \o \l {QtXml}
       
   109     \row
       
   110         \o \l {QtXmlPatterns}
       
   111         \o \l {Phonon Module}{Phonon}
       
   112         \o \l {Qt3Support}
       
   113         \o
       
   114     \endtable
       
   115 
       
   116     Since Qt is not a system library, it has to be redistributed along
       
   117     with your application; the minimum is to redistribute the run-time
       
   118     of the libraries used by the application.  Using static linking,
       
   119     however, the Qt run-time is compiled into the executable.
       
   120 
       
   121     In general, you should deploy all plugins that your build of Qt uses,
       
   122     excluding only those that you have identified as being unnecessary
       
   123     for your application and its users.
       
   124 
       
   125     For instance, you may need to deploy plugins for JPEG support and
       
   126     SQL drivers, but you should also deploy plugins that your users may
       
   127     require, including those for accessibility.
       
   128     For more information about plugins, see the
       
   129     \l{plugins-howto.html}{How to Create Qt Plugins} documentation.
       
   130 
       
   131     When deploying an application using the shared library approach
       
   132     you must ensure that the Qt libraries will use the correct path to
       
   133     find the Qt plugins, documentation, translation etc. To do this you
       
   134     can use a \c qt.conf file. For more information, see the \l {Using
       
   135     qt.conf} documentation.
       
   136 
       
   137     Depending on configuration, compiler specific libraries must be
       
   138     redistributed as well. For more information, see the platform
       
   139     specific Application Dependencies sections: \l
       
   140     {deployment-x11.html#application-dependencies}{X11}, \l
       
   141     {deployment-windows.html#application-dependencies}{Windows}, \l
       
   142     {deployment-mac.html#application-dependencies}{Mac}.
       
   143 
       
   144     \section1 Licensing
       
   145 
       
   146     Some of Qt's libraries are based on third party libraries that are
       
   147     not licensed using the same dual-license model as Qt. As a result,
       
   148     care must be taken when deploying applications that use these
       
   149     libraries, particularly when the application is statically linked
       
   150     to them.
       
   151 
       
   152     The following table contains an inexhaustive summary of the issues
       
   153     you should be aware of.
       
   154 
       
   155     \table
       
   156     \header \o Qt Library \o Dependency
       
   157             \o Licensing Issue
       
   158     \row    \o QtHelp     \o CLucene
       
   159     \o The version of clucene distributed with Qt is licensed
       
   160     under the GNU LGPL version 2.1 or later. This has implications for
       
   161     developers of closed source applications. Please see
       
   162     \l{QtHelp Module#License Information}{the QtHelp module documentation}
       
   163     for more information.
       
   164 
       
   165     \row    \o QtNetwork  \o OpenSSL
       
   166     \o Some configurations of QtNetwork use OpenSSL at run-time. Deployment
       
   167     of OpenSSL libraries is subject to both licensing and export restrictions.
       
   168     More information can be found in the \l{Secure Sockets Layer (SSL) Classes}
       
   169     documentation.
       
   170 
       
   171     \row    \o QtWebKit   \o WebKit
       
   172     \o WebKit is licensed under the GNU LGPL version 2 or later.
       
   173     This has implications for developers of closed source applications.
       
   174     Please see \l{QtWebKit Module#License Information}{the QtWebKit module
       
   175     documentation} for more information.
       
   176 
       
   177     \row    \o \l{Phonon Module}{Phonon}     \o Phonon
       
   178     \o Phonon relies on the native multimedia engines on different platforms.
       
   179     Phonon itself is licensed under the GNU LGPL version 2. Please see
       
   180     \l{Phonon Module#License Information}{the Phonon module documentation}
       
   181     for more information on licensing and the
       
   182     \l{Phonon Overview#Backends}{Phonon Overview} for details of the backends
       
   183     in use on different platforms.
       
   184     \endtable
       
   185 
       
   186     \section1 Platform-Specific Notes
       
   187 
       
   188     The procedure of deploying Qt applications is different for the
       
   189     various platforms:
       
   190 
       
   191     \list
       
   192         \o \l{Deploying an Application on X11 Platforms}{Qt for X11 Platforms}
       
   193         \o \l{Deploying an Application on Windows}{Qt for Windows}
       
   194         \o \l{Deploying an Application on Mac OS X}{Qt for Mac OS X}
       
   195         \o \l{Deploying Qt for Embedded Linux Applications}{Qt for Embedded Linux}
       
   196         \o \l{Deploying an Application on the Symbian platform}{Qt for the Symbian platform}
       
   197     \endlist
       
   198 
       
   199     \sa Installation {Platform-Specific Documentation}
       
   200 */
       
   201 
       
   202 /*!
       
   203     \page deployment-x11.html
       
   204     \contentspage Deploying Qt Applications
       
   205 
       
   206     \title Deploying an Application on X11 Platforms
       
   207 
       
   208     Due to the proliferation of Unix systems (commercial Unices, Linux
       
   209     distributions, etc.), deployment on Unix is a complex
       
   210     topic. Before we start, be aware that programs compiled for one
       
   211     Unix flavor will probably not run on a different Unix system. For
       
   212     example, unless you use a cross-compiler, you cannot compile your
       
   213     application on Irix and distribute it on AIX.
       
   214 
       
   215     Contents:
       
   216 
       
   217     \tableofcontents
       
   218 
       
   219     This documentation will describe how to determine which files you
       
   220     should include in your distribution, and how to make sure that the
       
   221     application will find them at run-time. We will demonstrate the
       
   222     procedures in terms of deploying the \l {tools/plugandpaint}{Plug
       
   223     & Paint} application that is provided in Qt's examples directory.
       
   224 
       
   225     \section1 Static Linking
       
   226 
       
   227     Static linking is often the safest and easiest way to distribute
       
   228     an application on Unix since it relieves you from the task of
       
   229     distributing the Qt libraries and ensuring that they are located
       
   230     in the default search path for libraries on the target system.
       
   231 
       
   232     \section2 Building Qt Statically
       
   233 
       
   234     To use this approach, you must start by installing a static version
       
   235     of the Qt library:
       
   236 
       
   237     \snippet doc/src/snippets/code/doc_src_deployment.qdoc 0
       
   238 
       
   239     We specify the prefix so that we do not overwrite the existing Qt
       
   240     installation. The example above only builds the Qt libraries,
       
   241     i.e. the examples and Qt Designer will not be built.  When \c make
       
   242     is done, you will find the Qt libraries in the \c /path/to/Qt/lib
       
   243     directory.
       
   244 
       
   245     When linking your application against static Qt libraries, note
       
   246     that you might need to add more libraries to the \c LIBS line in
       
   247     your project file. For more information, see the \l {Application
       
   248     Dependencies} section.
       
   249 
       
   250     \section2 Linking the Application to the Static Version of Qt
       
   251 
       
   252     Once Qt is built statically, the next step is to regenerate the
       
   253     makefile and rebuild the application. First, we must go into the
       
   254     directory that contains the application:
       
   255 
       
   256     \snippet doc/src/snippets/code/doc_src_deployment.qdoc 1
       
   257 
       
   258     Now run qmake to create a new makefile for the application, and do
       
   259     a clean build to create the statically linked executable:
       
   260 
       
   261     \snippet doc/src/snippets/code/doc_src_deployment.qdoc 2
       
   262 
       
   263     You probably want to link against the release libraries, and you
       
   264     can specify this when invoking \c qmake. Note that we must set the
       
   265     path to the static Qt that we just built.
       
   266 
       
   267     To check that the application really links statically with Qt, run
       
   268     the \c ldd tool (available on most Unices):
       
   269 
       
   270     \snippet doc/src/snippets/code/doc_src_deployment.qdoc 3
       
   271 
       
   272     Verify that the Qt libraries are not mentioned in the output.
       
   273 
       
   274     Now, provided that everything compiled and linked without any
       
   275     errors, we should have a \c plugandpaint file that is ready for
       
   276     deployment. One easy way to check that the application really can
       
   277     be run stand-alone is to copy it to a machine that doesn't have Qt
       
   278     or any Qt applications installed, and run it on that machine.
       
   279 
       
   280     Remember that if your application depends on compiler specific
       
   281     libraries, these must still be redistributed along with your
       
   282     application. For more information, see the \l {Application
       
   283     Dependencies} section.
       
   284 
       
   285     The \l {tools/plugandpaint}{Plug & Paint} example consists of
       
   286     several components: The core application (\l
       
   287     {tools/plugandpaint}{Plug & Paint}), and the \l
       
   288     {tools/plugandpaintplugins/basictools}{Basic Tools} and \l
       
   289     {tools/plugandpaintplugins/extrafilters}{Extra Filters}
       
   290     plugins. Since we cannot deploy plugins using the static linking
       
   291     approach, the executable we have prepared so far is
       
   292     incomplete. The application will run, but the functionality will
       
   293     be disabled due to the missing plugins. To deploy plugin-based
       
   294     applications we should use the shared library approach.
       
   295 
       
   296     \section1 Shared Libraries
       
   297 
       
   298     We have two challenges when deploying the \l
       
   299     {tools/plugandpaint}{Plug & Paint} application using the shared
       
   300     libraries approach: The Qt runtime has to be correctly
       
   301     redistributed along with the application executable, and the
       
   302     plugins have to be installed in the correct location on the target
       
   303     system so that the application can find them.
       
   304 
       
   305     \section2 Building Qt as a Shared Library
       
   306 
       
   307     We assume that you already have installed Qt as a shared library,
       
   308     which is the default when installing Qt, in the \c /path/to/Qt
       
   309     directory. For more information on how to build Qt, see the \l
       
   310     {Installation} documentation.
       
   311 
       
   312     \section2 Linking the Application to Qt as a Shared Library
       
   313 
       
   314     After ensuring that Qt is built as a shared library, we can build
       
   315     the \l {tools/plugandpaint}{Plug & Paint} application. First, we
       
   316     must go into the directory that contains the application:
       
   317 
       
   318     \snippet doc/src/snippets/code/doc_src_deployment.qdoc 4
       
   319 
       
   320     Now run qmake to create a new makefile for the application, and do
       
   321     a clean build to create the dynamically linked executable:
       
   322 
       
   323     \snippet doc/src/snippets/code/doc_src_deployment.qdoc 5
       
   324 
       
   325     This builds the core application, the following will build the
       
   326     plugins:
       
   327 
       
   328     \snippet doc/src/snippets/code/doc_src_deployment.qdoc 6
       
   329 
       
   330     If everything compiled and linked without any errors, we will get
       
   331     a \c plugandpaint executable and the \c libpnp_basictools.so and
       
   332     \c libpnp_extrafilters.so plugin files.
       
   333 
       
   334     \section2 Creating the Application Package
       
   335 
       
   336     There is no standard package management on Unix, so the method we
       
   337     present below is a generic solution. See the documentation for
       
   338     your target system for information on how to create a package.
       
   339 
       
   340     To deploy the application, we must make sure that we copy the
       
   341     relevant Qt libraries (corresponding to the Qt modules used in the
       
   342     application) as well as the executable to the same
       
   343     directory. Remember that if your application depends on compiler
       
   344     specific libraries, these must also be redistributed along with
       
   345     your application. For more information, see the \l {Application
       
   346     Dependencies} section.
       
   347 
       
   348     We'll cover the plugins shortly, but the main issue with shared
       
   349     libraries is that you must ensure that the dynamic linker will
       
   350     find the Qt libraries. Unless told otherwise, the dynamic linker
       
   351     doesn't search the directory where your application resides. There
       
   352     are many ways to solve this:
       
   353 
       
   354     \list
       
   355     
       
   356     \o You can install the Qt libraries in one of the system
       
   357        library paths (e.g. \c /usr/lib on most systems).
       
   358 
       
   359     \o You can pass a predetermined path to the \c -rpath command-line
       
   360        option when linking the application. This will tell the dynamic
       
   361        linker to look in this directory when starting your application.
       
   362 
       
   363     \o You can write a startup script for your application, where you
       
   364        modify the dynamic linker configuration (e.g.  adding your
       
   365        application's directory to the \c LD_LIBRARY_PATH environment
       
   366        variable. \note If your application will be running with "Set
       
   367        user ID on execution," and if it will be owned by root, then
       
   368        LD_LIBRARY_PATH will be ignored on some platforms. In this
       
   369        case, use of the LD_LIBRARY_PATH approach is not an option).
       
   370 
       
   371     \endlist
       
   372 
       
   373     The disadvantage of the first approach is that the user must have
       
   374     super user privileges. The disadvantage of the second approach is
       
   375     that the user may not have privileges to install into the
       
   376     predetemined path. In either case, the users don't have the option
       
   377     of installing to their home directory. We recommend using the
       
   378     third approach since it is the most flexible. For example, a \c
       
   379     plugandpaint.sh script will look like this:
       
   380 
       
   381     \snippet doc/src/snippets/code/doc_src_deployment.qdoc 7
       
   382 
       
   383     By running this script instead of the executable, you are sure
       
   384     that the Qt libraries will be found by the dynamic linker. Note
       
   385     that you only have to rename the script to use it with other
       
   386     applications.
       
   387 
       
   388     When looking for plugins, the application searches in a plugins
       
   389     subdirectory inside the directory of the application
       
   390     executable. Either you have to manually copy the plugins into the
       
   391     \c plugins directory, or you can set the \c DESTDIR in the
       
   392     plugins' project files:
       
   393 
       
   394     \snippet doc/src/snippets/code/doc_src_deployment.qdoc 8
       
   395 
       
   396     An archive distributing all the Qt libraries, and all the plugins,
       
   397     required to run the \l {tools/plugandpaint}{Plug & Paint}
       
   398     application, would have to include the following files:
       
   399 
       
   400     \table 100%
       
   401     \header
       
   402         \o Component \o {2, 1} File Name
       
   403     \row
       
   404         \o The executable
       
   405         \o {2, 1} \c plugandpaint
       
   406     \row
       
   407         \o The script to run the executable
       
   408         \o {2, 1} \c plugandpaint.sh
       
   409     \row
       
   410         \o The Basic Tools plugin
       
   411         \o {2, 1} \c plugins\libpnp_basictools.so
       
   412     \row
       
   413         \o The ExtraFilters plugin
       
   414         \o {2, 1} \c plugins\libpnp_extrafilters.so
       
   415     \row
       
   416         \o The Qt Core module
       
   417         \o {2, 1} \c libQtCore.so.4
       
   418     \row
       
   419         \o The Qt GUI module
       
   420         \o {2, 1} \c libQtGui.so.4
       
   421     \endtable
       
   422 
       
   423     On most systems, the extension for shared libraries is \c .so. A
       
   424     notable exception is HP-UX, which uses \c .sl.
       
   425 
       
   426     Remember that if your application depends on compiler specific
       
   427     libraries, these must still be redistributed along with your
       
   428     application. For more information, see the \l {Application
       
   429     Dependencies} section.
       
   430 
       
   431     To verify that the application now can be successfully deployed,
       
   432     you can extract this archive on a machine without Qt and without
       
   433     any compiler installed, and try to run it, i.e. run the \c
       
   434     plugandpaint.sh script.
       
   435 
       
   436     An alternative to putting the plugins in the \c plugins
       
   437     subdirectory is to add a custom search path when you start your
       
   438     application using QApplication::addLibraryPath() or
       
   439     QApplication::setLibraryPaths().
       
   440 
       
   441     \snippet doc/src/snippets/code/doc_src_deployment.qdoc 9
       
   442 
       
   443     \section1 Application Dependencies
       
   444 
       
   445     \section2 Additional Libraries
       
   446 
       
   447     To find out which libraries your application depends on, run the
       
   448     \c ldd tool (available on most Unices):
       
   449 
       
   450     \snippet doc/src/snippets/code/doc_src_deployment.qdoc 10
       
   451 
       
   452     This will list all the shared library dependencies for your
       
   453     application. Depending on configuration, these libraries must be
       
   454     redistributed along with your application. In particular, the
       
   455     standard C++ library must be redistributed if you're compiling
       
   456     your application with a compiler that is binary incompatible with
       
   457     the system compiler. When possible, the safest solution is to link
       
   458     against these libraries statically.
       
   459 
       
   460     You will probably want to link dynamically with the regular X11
       
   461     libraries, since some implementations will try to open other
       
   462     shared libraries with \c dlopen(), and if this fails, the X11
       
   463     library might cause your application to crash.
       
   464 
       
   465     It's also worth mentioning that Qt will look for certain X11
       
   466     extensions, such as Xinerama and Xrandr, and possibly pull them
       
   467     in, including all the libraries that they link against. If you
       
   468     can't guarantee the presence of a certain extension, the safest
       
   469     approach is to disable it when configuring Qt (e.g. \c {./configure
       
   470     -no-xrandr}).
       
   471 
       
   472     FontConfig and FreeType are other examples of libraries that
       
   473     aren't always available or that aren't always binary
       
   474     compatible. As strange as it may sound, some software vendors have
       
   475     had success by compiling their software on very old machines and
       
   476     have been very careful not to upgrade any of the software running
       
   477     on them.
       
   478 
       
   479     When linking your application against the static Qt libraries, you
       
   480     must explicitly link with the dependent libraries mentioned
       
   481     above. Do this by adding them to the \c LIBS variable in your
       
   482     project file.
       
   483 
       
   484     \section2 Qt Plugins
       
   485 
       
   486     Your application may also depend on one or more Qt plugins, such
       
   487     as the JPEG image format plugin or a SQL driver plugin. Be sure
       
   488     to distribute any Qt plugins that you need with your application,
       
   489     and note that each type of plugin should be located within a
       
   490     specific subdirectory (such as \c imageformats or \c sqldrivers)
       
   491     within your distribution directory, as described below.
       
   492 
       
   493     \note If you are deploying an application that uses QtWebKit to display
       
   494     HTML pages from the World Wide Web, you should include all text codec
       
   495     plugins to support as many HTML encodings possible. 
       
   496 
       
   497     The search path for Qt plugins (as well as a few other paths) is
       
   498     hard-coded into the QtCore library. By default, the first plugin
       
   499     search path will be hard-coded as \c /path/to/Qt/plugins. As
       
   500     mentioned above, using pre-determined paths has certain
       
   501     disadvantages, so you need to examine various alternatives to make
       
   502     sure that the Qt plugins are found:
       
   503 
       
   504     \list
       
   505 
       
   506     \o \l{qt-conf.html}{Using \c qt.conf}. This is the recommended
       
   507     approach since it provides the most flexibility.
       
   508 
       
   509     \o Using QApplication::addLibraryPath() or
       
   510     QApplication::setLibraryPaths().
       
   511 
       
   512     \o Using a third party installation utility or the target system's
       
   513     package manager to change the hard-coded paths in the QtCore
       
   514     library.
       
   515 
       
   516     \endlist
       
   517 
       
   518     The \l{How to Create Qt Plugins} document outlines the issues you
       
   519     need to pay attention to when building and deploying plugins for
       
   520     Qt applications.
       
   521 */
       
   522 
       
   523 /*!
       
   524     \page deployment-windows.html
       
   525     \contentspage Deploying Qt Applications
       
   526 
       
   527     \title Deploying an Application on Windows
       
   528 
       
   529     This documentation will describe how to determine which files you
       
   530     should include in your distribution, and how to make sure that the
       
   531     application will find them at run-time. We will demonstrate the
       
   532     procedures in terms of deploying the \l {tools/plugandpaint}{Plug
       
   533     & Paint} application that is provided in Qt's examples directory.
       
   534 
       
   535     Contents:
       
   536 
       
   537     \tableofcontents
       
   538 
       
   539     \section1 Static Linking
       
   540 
       
   541     If you want to keep things simple by only having a few files to
       
   542     deploy, i.e. a stand-alone executable with the associated compiler
       
   543     specific DLLs, then you must build everything statically.
       
   544 
       
   545     \section2 Building Qt Statically
       
   546 
       
   547     Before we can build our application we must make sure that Qt is
       
   548     built statically. To do this, go to a command prompt and type the
       
   549     following:
       
   550 
       
   551     \snippet doc/src/snippets/code/doc_src_deployment.qdoc 11
       
   552 
       
   553     Remember to specify any other options you need, such as data base
       
   554     drivers, as arguments to \c configure. Once \c configure has
       
   555     finished, type the following:
       
   556 
       
   557     \snippet doc/src/snippets/code/doc_src_deployment.qdoc 12
       
   558 
       
   559     This will build Qt statically. Note that unlike with a dynamic build,
       
   560     building Qt statically will result in libraries without version numbers;
       
   561     e.g. \c QtCore4.lib will be \c QtCore.lib. Also, we have used \c nmake
       
   562     in all the examples, but if you use MinGW you must use
       
   563     \c mingw32-make instead.
       
   564 
       
   565     \note If you later need to reconfigure and rebuild Qt from the
       
   566     same location, ensure that all traces of the previous configuration are
       
   567     removed by entering the build directory and typing \c{nmake distclean}
       
   568     before running \c configure again.
       
   569 
       
   570     \section2 Linking the Application to the Static Version of Qt
       
   571 
       
   572     Once Qt has finished building we can build the \l
       
   573     {tools/plugandpaint}{Plug & Paint} application. First we must go
       
   574     into the directory that contains the application:
       
   575 
       
   576     \snippet doc/src/snippets/code/doc_src_deployment.qdoc 13
       
   577 
       
   578     We must then run \c qmake to create a new makefile for the
       
   579     application, and do a clean build to create the statically linked
       
   580     executable:
       
   581 
       
   582     \snippet doc/src/snippets/code/doc_src_deployment.qdoc 14
       
   583 
       
   584     You probably want to link against the release libraries, and you
       
   585     can specify this when invoking \c qmake. Now, provided that
       
   586     everything compiled and linked without any errors, we should have
       
   587     a \c plugandpaint.exe file that is ready for deployment. One easy
       
   588     way to check that the application really can be run stand-alone is
       
   589     to copy it to a machine that doesn't have Qt or any Qt
       
   590     applications installed, and run it on that machine.
       
   591 
       
   592     Remember that if your application depends on compiler specific
       
   593     libraries, these must still be redistributed along with your
       
   594     application. You can check which libraries your application is
       
   595     linking against by using the \c depends tool. For more
       
   596     information, see the \l {Application Dependencies} section.
       
   597 
       
   598     The \l {tools/plugandpaint}{Plug & Paint} example consists of
       
   599     several components: The application itself (\l
       
   600     {tools/plugandpaint}{Plug & Paint}), and the \l
       
   601     {tools/plugandpaintplugins/basictools}{Basic Tools} and \l
       
   602     {tools/plugandpaintplugins/extrafilters}{Extra Filters}
       
   603     plugins. Since we cannot deploy plugins using the static linking
       
   604     approach, the application we have prepared is incomplete. It will
       
   605     run, but the functionality will be disabled due to the missing
       
   606     plugins. To deploy plugin-based applications we should use the
       
   607     shared library approach.
       
   608 
       
   609     \section1 Shared Libraries
       
   610 
       
   611     We have two challenges when deploying the \l
       
   612     {tools/plugandpaint}{Plug & Paint} application using the shared
       
   613     libraries approach: The Qt runtime has to be correctly
       
   614     redistributed along with the application executable, and the
       
   615     plugins have to be installed in the correct location on the target
       
   616     system so that the application can find them.
       
   617 
       
   618     \section2 Building Qt as a Shared Library
       
   619 
       
   620     We assume that you already have installed Qt as a shared library,
       
   621     which is the default when installing Qt, in the \c C:\path\to\Qt
       
   622     directory. For more information on how to build Qt, see the \l
       
   623     {Installation} documentation.
       
   624 
       
   625     \section2 Linking the Application to Qt as a Shared Library
       
   626 
       
   627     After ensuring that Qt is built as a shared library, we can build
       
   628     the \l {tools/plugandpaint}{Plug & Paint} application. First, we
       
   629     must go into the directory that contains the application:
       
   630 
       
   631     \snippet doc/src/snippets/code/doc_src_deployment.qdoc 15
       
   632 
       
   633     Now run \c qmake to create a new makefile for the application, and
       
   634     do a clean build to create the dynamically linked executable:
       
   635 
       
   636     \snippet doc/src/snippets/code/doc_src_deployment.qdoc 16
       
   637 
       
   638     This builds the core application, the following will build the
       
   639     plugins:
       
   640 
       
   641     \snippet doc/src/snippets/code/doc_src_deployment.qdoc 17
       
   642 
       
   643     If everything compiled and linked without any errors, we will get
       
   644     a \c plugandpaint.exe executable and the \c pnp_basictools.dll and
       
   645     \c pnp_extrafilters.dll plugin files.
       
   646 
       
   647     \section2 Creating the Application Package
       
   648 
       
   649     To deploy the application, we must make sure that we copy the
       
   650     relevant Qt DLL (corresponding to the Qt modules used in
       
   651     the application) as well as the executable to the same directory
       
   652     in the \c release subdirectory.
       
   653 
       
   654     Remember that if your application depends on compiler specific
       
   655     libraries, these must be redistributed along with your
       
   656     application. You can check which libraries your application is
       
   657     linking against by using the \c depends tool. For more
       
   658     information, see the \l {Application Dependencies} section.
       
   659 
       
   660     We'll cover the plugins shortly, but first we'll check that the
       
   661     application will work in a deployed environment: Either copy the
       
   662     executable and the Qt DLLs to a machine that doesn't have Qt
       
   663     or any Qt applications installed, or if you want to test on the
       
   664     build machine, ensure that the machine doesn't have Qt in its
       
   665     environment.
       
   666 
       
   667     If the application starts without any problems, then we have
       
   668     successfully made a dynamically linked version of the \l
       
   669     {tools/plugandpaint}{Plug & Paint} application. But the
       
   670     application's functionality will still be missing since we have
       
   671     not yet deployed the associated plugins.
       
   672 
       
   673     Plugins work differently to normal DLLs, so we can't just
       
   674     copy them into the same directory as our application's executable
       
   675     as we did with the Qt DLLs.  When looking for plugins, the
       
   676     application searches in a \c plugins subdirectory inside the
       
   677     directory of the application executable.
       
   678 
       
   679     So to make the plugins available to our application, we have to
       
   680     create the \c plugins subdirectory and copy over the relevant DLLs:
       
   681 
       
   682     \snippet doc/src/snippets/code/doc_src_deployment.qdoc 18
       
   683 
       
   684     An archive distributing all the Qt DLLs and application
       
   685     specific plugins required to run the \l {tools/plugandpaint}{Plug
       
   686     & Paint} application, would have to include the following files:
       
   687 
       
   688     \table 100%
       
   689     \header
       
   690         \o Component \o {2, 1} File Name
       
   691     \row
       
   692         \o The executable
       
   693         \o {2, 1} \c plugandpaint.exe
       
   694     \row
       
   695         \o The Basic Tools plugin
       
   696         \o {2, 1} \c plugins\pnp_basictools.dll
       
   697     \row
       
   698         \o The ExtraFilters plugin
       
   699         \o {2, 1} \c plugins\pnp_extrafilters.dll
       
   700     \row
       
   701         \o The Qt Core module
       
   702         \o {2, 1} \c qtcore4.dll
       
   703     \row
       
   704         \o The Qt GUI module
       
   705         \o {2, 1} \c qtgui4.dll
       
   706     \endtable
       
   707 
       
   708     In addition, the archive must contain the following compiler
       
   709     specific libraries depending on your version of Visual Studio:
       
   710 
       
   711     \table 100%
       
   712     \header
       
   713         \o \o VC++ 6.0 \o VC++ 7.1 (2003) \o VC++ 8.0 (2005) \o VC++ 9.0 (2008)
       
   714     \row
       
   715         \o The C run-time
       
   716         \o \c msvcrt.dll
       
   717         \o \c msvcr71.dll
       
   718         \o \c msvcr80.dll
       
   719         \o \c msvcr90.dll
       
   720     \row
       
   721         \o The C++ run-time
       
   722         \o \c msvcp60.dll
       
   723         \o \c msvcp71.dll
       
   724         \o \c msvcp80.dll
       
   725         \o \c msvcp90.dll
       
   726     \endtable
       
   727 
       
   728     To verify that the application now can be successfully deployed,
       
   729     you can extract this archive on a machine without Qt and without
       
   730     any compiler installed, and try to run it.
       
   731 
       
   732     An alternative to putting the plugins in the plugins subdirectory
       
   733     is to add a custom search path when you start your application
       
   734     using QApplication::addLibraryPath() or
       
   735     QApplication::setLibraryPaths().
       
   736 
       
   737     \snippet doc/src/snippets/code/doc_src_deployment.qdoc 19
       
   738 
       
   739     One benefit of using plugins is that they can easily be made
       
   740     available to a whole family of applications.
       
   741 
       
   742     It's often most convenient to add the path in the application's \c
       
   743     main() function, right after the QApplication object is
       
   744     created. Once the path is added, the application will search it
       
   745     for plugins, in addition to looking in the \c plugins subdirectory
       
   746     in the application's own directory. Any number of additional paths
       
   747     can be added.
       
   748 
       
   749     \section2 Visual Studio 2005 Onwards
       
   750 
       
   751     When deploying an application compiled with Visual Studio 2005 onwards,
       
   752     there are some additional steps to be taken.
       
   753 
       
   754     First, we need to copy the manifest file created when linking the
       
   755     application. This manifest file contains information about the
       
   756     application's dependencies on side-by-side assemblies, such as the runtime
       
   757     libraries.
       
   758 
       
   759     The manifest file needs to be copied into the \bold same folder as the
       
   760     application executable. You do not need to copy the manifest files for
       
   761     shared libraries (DLLs), since they are not used.
       
   762 
       
   763     If the shared library has dependencies that are different from the
       
   764     application using it, the manifest file needs to be embedded into the DLL
       
   765     binary. Since Qt 4.1.3, the follwoing \c CONFIG options are available for
       
   766     embedding manifests:
       
   767 
       
   768     \snippet doc/src/snippets/code/doc_src_deployment.qdoc 20
       
   769 
       
   770     To use the options, add
       
   771 
       
   772     \snippet doc/src/snippets/code/doc_src_deployment.qdoc 21
       
   773 
       
   774     to your .pro file. The \c embed_manifest_dll option is enabled by default.
       
   775 
       
   776     You can find more information about manifest files and side-by-side
       
   777     assemblies at the
       
   778     \l {http://msdn.microsoft.com/en-us/library/aa376307.aspx}{MSDN website}.
       
   779 
       
   780     There are two ways to include the run time libraries: by bundling them
       
   781     directly with your application or by installing them on the end-user's
       
   782     system.
       
   783 
       
   784     To bundle the run time libraries with your application, copy the directory
       
   785 
       
   786     \snippet doc/src/snippets/code/doc_src_deployment.qdoc 22
       
   787 
       
   788     into the folder where your executable is, so that you are including a
       
   789     \c Microsoft.VC80.CRT directory alongside your application's executable. If
       
   790     you are bundling the runtimes and need to deploy plugins as well, you have
       
   791     to remove the manifest from the plugins (embedded as a resource) by adding
       
   792     the following line to the \c{.pro} file of the plugins you are compiling:
       
   793 
       
   794     \snippet doc/src/snippets/code/doc_src_deployment.qdoc 23
       
   795 
       
   796     \warning If you skip the step above, the plugins will not load on some
       
   797     systems.
       
   798 
       
   799     To install the runtime libraries on the end-user's system, you need to
       
   800     include the appropriate Visual C++ Redistributable Package (VCRedist)
       
   801     executable with your application and ensure that it is executed when the
       
   802     user installs your application.
       
   803 
       
   804     For example, on an 32-bit x86-based system, you would include the
       
   805     \l{http://www.microsoft.com/downloads/details.aspx?FamilyId=32BC1BEE-A3F9-4C13-9C99-220B62A191EE}{vcredist_x86.exe}
       
   806     executable. The \l{http://www.microsoft.com/downloads/details.aspx?familyid=526BF4A7-44E6-4A91-B328-A4594ADB70E5}{vcredist_IA64.exe}
       
   807     and \l{http://www.microsoft.com/downloads/details.aspx?familyid=90548130-4468-4BBC-9673-D6ACABD5D13B}{vcredist_x64.exe}
       
   808     executables provide the appropriate libraries for the IA64 and 64-bit x86
       
   809     architectures, respectively.
       
   810 
       
   811     \note The application you ship must be compiled with exactly the same
       
   812     compiler version against the same C runtime version. This prevents
       
   813     deploying errors caused by different versions of the C runtime libraries.
       
   814 
       
   815     \section2 Visual Studio 2008 And Manual Installs
       
   816 
       
   817     As well as the above details for VS 2005 and onwards, Visual Studio 2008
       
   818     applications may have problems when deploying manually, say to a USB
       
   819     stick.
       
   820 
       
   821     The recommended procedure is to configure Qt with the \c -plugin-manifests
       
   822     option using the 'configure' tool. Then follow the \l {http://msdn.microsoft.com/en-us/library/ms235291(VS.80).aspx}{guidelines}
       
   823     for manually deploying private assemblies.
       
   824 
       
   825     In brief the steps are
       
   826 
       
   827     \list 1
       
   828     
       
   829         \o create a folder structure on the development computer that will match the target USB stick directory structure, for example '\\app' and for your dlls, '\\app\\lib'.
       
   830         
       
   831         \o on the development computer, from the appropriate 'redist' folder copy over Microsoft.VC80.CRT and Microsoft.VC80.MFC to the directories '\\app' and '\\app\\lib' on the development PC.
       
   832         
       
   833         \o xcopy the \\app folder to the target USB stick.
       
   834     \endlist
       
   835 
       
   836     Your application should now run. Also be aware that even with a service
       
   837     pack installed the Windows DLLs that are linked to will be the defaults. See
       
   838     the information on \l {http://msdn.microsoft.com/en-us/library/cc664727.aspx}{how to select the appropriate target DLLs}.
       
   839 
       
   840     \section1 Application Dependencies
       
   841 
       
   842     \section2 Additional Libraries
       
   843 
       
   844     Depending on configuration, compiler specific libraries must be
       
   845     redistributed along with your application. You can check which
       
   846     libraries your application is linking against by using the
       
   847     \l{Dependency Walker} tool. All you need to do is to run it like
       
   848     this:
       
   849 
       
   850     \snippet doc/src/snippets/code/doc_src_deployment.qdoc 24
       
   851 
       
   852     This will provide a list of the libraries that your application
       
   853     depends on and other information.
       
   854 
       
   855     \image deployment-windows-depends.png
       
   856 
       
   857     When looking at the release build of the Plug & Paint executable
       
   858     (\c plugandpaint.exe) with the \c depends tool, the tool lists the
       
   859     following immediate dependencies to non-system libraries:
       
   860 
       
   861     \table 100%
       
   862         \header
       
   863             \o Qt
       
   864             \o VC++ 6.0
       
   865             \o VC++ 7.1 (2003)
       
   866             \o VC++ 8.0 (2005)
       
   867             \o MinGW
       
   868         \row
       
   869         \o \list
       
   870                \o QTCORE4.DLL - The QtCore runtime
       
   871                \o QTGUI4.DLL - The QtGui runtime
       
   872            \endlist
       
   873         \o \list
       
   874                \o MSVCRT.DLL - The C runtime
       
   875                \o MSVCP60.DLL - The C++ runtime (only when STL is installed)
       
   876            \endlist
       
   877         \o \list
       
   878                \o MSVCR71.DLL - The C runtime
       
   879                \o MSVCP71.DLL - The C++ runtime (only when STL is installed)
       
   880            \endlist
       
   881         \o \list
       
   882                \o MSVCR80.DLL - The C runtime
       
   883                \o MSVCP80.DLL - The C++ runtime (only when STL is installed)
       
   884            \endlist
       
   885         \o \list
       
   886                \o MINGWM10.DLL - The MinGW run-time
       
   887            \endlist
       
   888     \endtable
       
   889 
       
   890     When looking at the plugin DLLs the exact same dependencies
       
   891     are listed.
       
   892 
       
   893     \section2 Qt Plugins
       
   894 
       
   895     Your application may also depend on one or more Qt plugins, such
       
   896     as the JPEG image format plugin or a SQL driver plugin. Be sure
       
   897     to distribute any Qt plugins that you need with your application,
       
   898     and note that each type of plugin should be located within a
       
   899     specific subdirectory (such as \c imageformats or \c sqldrivers)
       
   900     within your distribution directory, as described below.
       
   901 
       
   902     \note If you are deploying an application that uses QtWebKit to display
       
   903     HTML pages from the World Wide Web, you should include all text codec
       
   904     plugins to support as many HTML encodings possible. 
       
   905 
       
   906     The search path for Qt plugins is hard-coded into the QtCore library. 
       
   907     By default, the plugins subdirectory of the Qt installation is the first 
       
   908     plugin search path. However, pre-determined paths like the default one 
       
   909     have certain disadvantages. For example, they may not exist on the target 
       
   910     machine. For that reason, you need to examine various alternatives to make 
       
   911     sure that the Qt plugins are found:
       
   912 
       
   913     \list
       
   914 
       
   915     \o \l{qt-conf.html}{Using \c qt.conf}. This approach is the recommended 
       
   916     if you have executables in different places sharing the same plugins.
       
   917 
       
   918     \o Using QApplication::addLibraryPath() or
       
   919     QApplication::setLibraryPaths(). This approach is recommended if you only 
       
   920     have one executable that will use the plugin. 
       
   921 
       
   922     \o Using a third party installation utility to change the
       
   923     hard-coded paths in the QtCore library.
       
   924 
       
   925     \endlist
       
   926 
       
   927     If you add a custom path using QApplication::addLibraryPath it could 
       
   928     look like this:
       
   929 
       
   930     \snippet doc/src/snippets/code/doc_src_deployment.qdoc 54
       
   931 
       
   932     Then qApp->libraryPaths() would return something like this:
       
   933 
       
   934     "C:/customPath/plugins " 
       
   935     "C:/Qt/%VERSION%/plugins" 
       
   936     "E:/myApplication/directory/"
       
   937 
       
   938     The executable will look for the plugins in these directories and 
       
   939     the same order as the QStringList returned by qApp->libraryPaths(). 
       
   940     The newly added path is prepended to the qApp->libraryPaths() which 
       
   941     means that it will be searched through first. However, if you use 
       
   942     qApp->setLibraryPaths(), you will be able to determend which paths 
       
   943     and in which order they will be searched.
       
   944 
       
   945     The \l{How to Create Qt Plugins} document outlines the issues you
       
   946     need to pay attention to when building and deploying plugins for
       
   947     Qt applications.
       
   948 
       
   949     \section1 Related Third Party Resources
       
   950 
       
   951     \list
       
   952     \o \l{http://silmor.de/29}{Cross compiling Qt/Win Apps on Linux} covers the
       
   953     process of cross-compiling Windows applications on Linux.
       
   954     \o \l{http://divided-mind.blogspot.com/2007/09/cross-compiling-qt4win-on-linux.html}
       
   955     {Cross-compiling Qt4/Win on Linux} provides another Linux-to-Windows
       
   956     cross-compilation guide.
       
   957     \endlist
       
   958 */
       
   959 
       
   960 /*!
       
   961     \page deployment-mac.html
       
   962     \contentspage Deploying Qt Applications
       
   963 
       
   964     \title Deploying an Application on Mac OS X
       
   965 
       
   966     Beginning with Qt 4.5, a \l {macdeploy}{deployment tool} is
       
   967     included that automates the prodecures described here.
       
   968 
       
   969     This document describes how to create a bundle and how to make
       
   970     sure that the application will find the resources it needs at
       
   971     run-time. We demonstrate the procedures in terms of deploying the
       
   972     \l {tools/plugandpaint}{Plug & Paint} application that is provided
       
   973     in Qt's examples directory.
       
   974     
       
   975     \tableofcontents
       
   976 
       
   977     \section1 The Bundle
       
   978 
       
   979     On the Mac, a GUI application must be built and run from a
       
   980     bundle. A bundle is a directory structure that appears as a single
       
   981     entity when viewed in the Finder. A bundle for an application
       
   982     typcially contains the executable and all the resources it
       
   983     needs. See the image below:
       
   984 
       
   985     \image deployment-mac-bundlestructure.png
       
   986 
       
   987     The bundle provides many advantages to the user. One primary
       
   988     advantage is that, since it is a single entity, it allows for
       
   989     drag-and-drop installation. As a programmer you can access bundle
       
   990     information in your own code. This is specific to Mac OS X and
       
   991     beyond the scope of this document. More information about bundles
       
   992     is available on \l
       
   993     {http://developer.apple.com/documentation/CoreFoundation/Conceptual/CFBundles/index.html}{Apple's Developer Website}.
       
   994 
       
   995     A Qt command line application on Mac OS X works similar to a
       
   996     command line application on Unix and Windows. You probably don't
       
   997     want to run it in a bundle: Add this to your application's .pro:
       
   998 
       
   999     \snippet doc/src/snippets/code/doc_src_deployment.qdoc 26
       
  1000 
       
  1001     This will tell \c qmake not to put the executable inside a
       
  1002     bundle. Please refer to the \l{Deploying an Application on
       
  1003     X11 Platforms}{X11 deployment documentation} for information about how
       
  1004     to deploy these "bundle-less" applications.
       
  1005 
       
  1006     \section1 Xcode
       
  1007 
       
  1008     We will only concern ourselves with command-line tools here. While
       
  1009     it is possible to use Xcode for this, Xcode has changed enough
       
  1010     between each version that it makes it difficult to document it
       
  1011     perfectly for each version. A future version of this document may
       
  1012     include more information for using Xcode in the deployment
       
  1013     process.
       
  1014 
       
  1015     \section1 Static Linking
       
  1016 
       
  1017     If you want to keep things simple by only having a few files to
       
  1018     deploy, then you must build everything statically.
       
  1019 
       
  1020     \section2 Building Qt Statically
       
  1021 
       
  1022     Start by installing a static version of the Qt library. Remember
       
  1023     that you will not be able to use plugins and you must build in all
       
  1024     the image formats, SQL drivers, etc..
       
  1025 
       
  1026     \snippet doc/src/snippets/code/doc_src_deployment.qdoc 27
       
  1027 
       
  1028     You can check the various options that are available by running \c
       
  1029     configure -help.
       
  1030 
       
  1031     \section2 Linking the Application to the Static Version of Qt
       
  1032 
       
  1033     Once Qt is built statically, the next step is to regenerate the
       
  1034     makefile and rebuild the application. First, we must go into the
       
  1035     directory that contains the application:
       
  1036 
       
  1037     \snippet doc/src/snippets/code/doc_src_deployment.qdoc 28
       
  1038 
       
  1039     Now run \c qmake to create a new makefile for the application, and do
       
  1040     a clean build to create the statically linked executable:
       
  1041 
       
  1042     \snippet doc/src/snippets/code/doc_src_deployment.qdoc 29
       
  1043 
       
  1044     You probably want to link against the release libraries, and you
       
  1045     can specify this when invoking \c qmake. If you have Xcode Tools
       
  1046     1.5 or higher installed, you may want to take advantage of "dead
       
  1047     code stripping" to reduce the size of your binary even more. You
       
  1048     can do this by passing \c {LIBS+= -dead_strip} to \c qmake in
       
  1049     addition to the \c {-config release} parameter. This doesn't have
       
  1050     as large an effect if you are using GCC 4, since Qt will then have
       
  1051     function visibility hints built-in, but if you use GCC 3.3, it
       
  1052     could make a difference.
       
  1053 
       
  1054     Now, provided that everything compiled and linked without any
       
  1055     errors, we should have a \c plugandpaint.app bundle that is ready
       
  1056     for deployment. One easy way to check that the application really
       
  1057     can be run stand-alone is to copy the bundle to a machine that
       
  1058     doesn't have Qt or any Qt applications installed, and run the
       
  1059     application on that machine.
       
  1060 
       
  1061     You can check what other libraries your application links to using
       
  1062     the \c otool:
       
  1063 
       
  1064     \snippet doc/src/snippets/code/doc_src_deployment.qdoc 30
       
  1065 
       
  1066     Here is what the output looks like for the static \l
       
  1067     {tools/plugandpaint}{Plug & Paint}:
       
  1068 
       
  1069     \snippet doc/src/snippets/code/doc_src_deployment.qdoc 31
       
  1070 
       
  1071     For more information, see the \l {Application Dependencies}
       
  1072     section.
       
  1073 
       
  1074     If you see \e Qt libraries in the output, it probably
       
  1075     means that you have both dynamic and static Qt libraries installed
       
  1076     on your machine. The linker will always choose dynamic over
       
  1077     static. There are two solutions: Either move your Qt dynamic
       
  1078     libraries (\c .dylibs) away to another directory while you link
       
  1079     the application and then move them back, or edit the \c Makefile
       
  1080     and replace link lines for the Qt libraries with the absolute path
       
  1081     to the static libraries. For example, replace
       
  1082 
       
  1083     \snippet doc/src/snippets/code/doc_src_deployment.qdoc 32
       
  1084 
       
  1085     with
       
  1086 
       
  1087     \snippet doc/src/snippets/code/doc_src_deployment.qdoc 33
       
  1088 
       
  1089     The \l {tools/plugandpaint}{Plug & Paint} example consists of
       
  1090     several components: The core application (\l
       
  1091     {tools/plugandpaint}{Plug & Paint}), and the \l
       
  1092     {tools/plugandpaintplugins/basictools}{Basic Tools} and \l
       
  1093     {tools/plugandpaintplugins/extrafilters}{Extra Filters}
       
  1094     plugins. Since we cannot deploy plugins using the static linking
       
  1095     approach, the bundle we have prepared so far is incomplete. The
       
  1096     application will run, but the functionality will be disabled due
       
  1097     to the missing plugins. To deploy plugin-based applications we
       
  1098     should use the framework approach.
       
  1099 
       
  1100     \section1 Frameworks
       
  1101 
       
  1102     We have two challenges when deploying the \l
       
  1103     {tools/plugandpaint}{Plug & Paint} application using frameworks:
       
  1104     The Qt runtime has to be correctly redistributed along with the
       
  1105     application bundle, and the plugins have to be installed in the
       
  1106     correct location so that the application can find them.
       
  1107 
       
  1108     When distributing Qt with your application using frameworks, you
       
  1109     have two options: You can either distribute Qt as a private
       
  1110     framework within your application bundle, or you can distribute Qt
       
  1111     as a standard framework (alternatively use the Qt frameworks in
       
  1112     the installed binary). These two approaches are essentially the
       
  1113     same. The latter option is good if you have many Qt applications
       
  1114     and you would prefer to save memory. The former is good if you
       
  1115     have Qt built in a special way, or want to make sure the framework
       
  1116     is there. It just comes down to where you place the Qt frameworks.
       
  1117 
       
  1118     \section2 Building Qt as Frameworks
       
  1119 
       
  1120     We assume that you already have installed Qt as frameworks, which
       
  1121     is the default when installing Qt, in the /path/to/Qt
       
  1122     directory. For more information on how to build Qt, see the \l
       
  1123     Installation documentation.
       
  1124 
       
  1125     When installing, the identification name of the frameworks will
       
  1126     also be set. The identification name is what the dynamic linker
       
  1127     (\c dyld) uses to find the libraries for your application.
       
  1128 
       
  1129     \section2 Linking the Application to Qt as Frameworks
       
  1130 
       
  1131     After ensuring that Qt is built as frameworks, we can build the \l
       
  1132     {tools/plugandpaint}{Plug & Paint} application. First, we must go
       
  1133     into the directory that contains the application:
       
  1134 
       
  1135     \snippet doc/src/snippets/code/doc_src_deployment.qdoc 34
       
  1136 
       
  1137     Now run qmake to create a new makefile for the application, and do
       
  1138     a clean build to create the dynamically linked executable:
       
  1139 
       
  1140     \snippet doc/src/snippets/code/doc_src_deployment.qdoc 35
       
  1141 
       
  1142     This builds the core application, the following will build the
       
  1143     plugins:
       
  1144 
       
  1145     \snippet doc/src/snippets/code/doc_src_deployment.qdoc 36
       
  1146 
       
  1147     Now run the \c otool for the Qt frameworks, for example Qt Gui:
       
  1148 
       
  1149     \snippet doc/src/snippets/code/doc_src_deployment.qdoc 37
       
  1150 
       
  1151     You will get the following output:
       
  1152 
       
  1153     \snippet doc/src/snippets/code/doc_src_deployment.qdoc 38
       
  1154 
       
  1155     For the Qt frameworks, the first line (i.e. \c
       
  1156     {path/to/Qt/lib/QtGui.framework/Versions/4/QtGui (compatibility
       
  1157     version 4.0.0, current version 4.0.1)}) becomes the framework's
       
  1158     identification name which is used by the dynamic linker (\c dyld).
       
  1159 
       
  1160     But when you are deploying the application, your users may not
       
  1161     have the Qt frameworks installed in the specified location. For
       
  1162     that reason, you must either provide the frameworks in an agreed
       
  1163     upon location, or store the frameworks in the bundle itself.
       
  1164     Regardless of which solution you choose, you must make sure that
       
  1165     the frameworks return the proper identification name for
       
  1166     themselves, and that the application will look for these
       
  1167     names. Luckily we can control this with the \c install_name_tool
       
  1168     command-line tool.
       
  1169 
       
  1170     The \c install_name_tool works in two modes, \c -id and \c
       
  1171     -change. The \c -id mode is for libraries and frameworks, and
       
  1172     allows us to specify a new identification name. We use the \c
       
  1173     -change mode to change the paths in the application.
       
  1174 
       
  1175     Let's test this out by copying the Qt frameworks into the Plug &
       
  1176     Paint bundle. Looking at \c otool's output for the bundle, we can
       
  1177     see that we must copy both the QtCore and QtGui frameworks into
       
  1178     the bundle. We will assume that we are in the directory where we
       
  1179     built the bundle.
       
  1180 
       
  1181     \snippet doc/src/snippets/code/doc_src_deployment.qdoc 39
       
  1182 
       
  1183     First we create a \c Frameworks directory inside the bundle. This
       
  1184     follows the Mac OS X application convention. We then copy the
       
  1185     frameworks into the new directory. Since frameworks contain
       
  1186     symbolic links, and we want to preserve them, we use the \c -R
       
  1187     option.
       
  1188 
       
  1189     \snippet doc/src/snippets/code/doc_src_deployment.qdoc 40
       
  1190 
       
  1191     Then we run \c install_name_tool to set the identification names
       
  1192     for the frameworks. The first argument after \c -id is the new
       
  1193     name, and the second argument is the framework which
       
  1194     identification we wish to change.  The text \c @executable_path is
       
  1195     a special \c dyld variable telling \c dyld to start looking where
       
  1196     the executable is located. The new names specifies that these
       
  1197     frameworks will be located "one directory up and over" in the \c
       
  1198     Frameworks directory.
       
  1199 
       
  1200     \snippet doc/src/snippets/code/doc_src_deployment.qdoc 41
       
  1201 
       
  1202     Now, the dynamic linker knows where to look for QtCore and
       
  1203     QtGui. Then we must make the application aware of the library
       
  1204     locations as well using \c install_name_tool's \c -change mode.
       
  1205     This basically comes down to string replacement, to match the
       
  1206     identification names that we set for the frameworks.
       
  1207 
       
  1208     Finally, since the QtGui framework depends on QtCore, we must
       
  1209     remember to change the reference for QtGui:
       
  1210 
       
  1211     \snippet doc/src/snippets/code/doc_src_deployment.qdoc 42
       
  1212 
       
  1213     After all this we can run \c otool again and see that the
       
  1214     application will look in the right locations.
       
  1215 
       
  1216     Of course, the thing that makes the \l {tools/plugandpaint}{Plug &
       
  1217     Paint} example interesting are its plugins. The basic steps we
       
  1218     need to follow with plugins are:
       
  1219 
       
  1220     \list
       
  1221         \o Put the plugins inside the bundle
       
  1222         \o Make sure that the plugins use the correct library using the
       
  1223            \c install_name_tool
       
  1224         \o Make sure that the application knows where to get the plugins
       
  1225     \endlist
       
  1226 
       
  1227     While we can put the plugins anywhere we want in the bundle, the
       
  1228     best location to put them is under Contents/Plugins. When we built
       
  1229     the Plug & Paint plugins, the \c DESTDIR variable in their \c .pro
       
  1230     file put the plugins' \c .dylib files in a \c plugins subdirectory
       
  1231     in the \c plugandpaint directory. So, in this example, all we need
       
  1232     to do is move this directory:
       
  1233 
       
  1234     \snippet doc/src/snippets/code/doc_src_deployment.qdoc 43
       
  1235 
       
  1236     If we run \c otool on for example the \l
       
  1237     {tools/plugandpaintplugins/basictools}{Basic Tools} plugin's \c
       
  1238     .dylib file we get the following information.
       
  1239 
       
  1240     \snippet doc/src/snippets/code/doc_src_deployment.qdoc 44
       
  1241 
       
  1242     Then we can see that the plugin links to the Qt frameworks it was
       
  1243     built against. Since we want the plugins to use the framework in
       
  1244     the application bundle we change them the same way as we did for
       
  1245     the application. For example for the Basic Tools plugin:
       
  1246 
       
  1247     \snippet doc/src/snippets/code/doc_src_deployment.qdoc 45
       
  1248 
       
  1249 
       
  1250     We must also modify the code in \c
       
  1251     tools/plugandpaint/mainwindow.cpp to \l {QDir::cdUp()}{cdUp()} one
       
  1252     directory since the plugins live in the bundle. Add the following
       
  1253     code to the \c mainwindow.cpp file:
       
  1254 
       
  1255     \snippet doc/src/snippets/code/doc_src_deployment.qdoc 46
       
  1256 
       
  1257     \table
       
  1258     \row
       
  1259     \o \inlineimage deployment-mac-application.png
       
  1260     \o
       
  1261     The additional code in \c tools/plugandpaint/mainwindow.cpp also
       
  1262     enables us to view the plugins in the Finder, as shown to the left.
       
  1263 
       
  1264     We can also add plugins extending Qt, for example adding SQL
       
  1265     drivers or image formats. We just need to follow the directory
       
  1266     structure outlined in plugin documentation, and make sure they are
       
  1267     included in the QCoreApplication::libraryPaths(). Let's quickly do
       
  1268     this with the image formats, following the approach from above.
       
  1269 
       
  1270     Copy Qt's image format plugins into the bundle:
       
  1271 
       
  1272     \snippet doc/src/snippets/code/doc_src_deployment.qdoc 47
       
  1273 
       
  1274     Use \c install_name_tool to link the plugins to the frameworks in
       
  1275     the bundle:
       
  1276 
       
  1277     \snippet doc/src/snippets/code/doc_src_deployment.qdoc 48
       
  1278 
       
  1279     Then we update the source code in \c tools/plugandpaint/main.cpp
       
  1280     to look for the new plugins. After constructing the
       
  1281     QApplication, we add the following code:
       
  1282 
       
  1283     \snippet doc/src/snippets/code/doc_src_deployment.qdoc 49
       
  1284 
       
  1285     First, we tell the application to only look for plugins in this
       
  1286     directory. In our case, this is what we want since we only want to
       
  1287     look for the plugins that we distribute with the bundle. If we
       
  1288     were part of a bigger Qt installation we could have used
       
  1289     QCoreApplication::addLibraryPath() instead.
       
  1290 
       
  1291     \endtable
       
  1292 
       
  1293     \warning When deploying plugins, and thus make changes to the
       
  1294     source code, the default identification names are reset when
       
  1295     rebuilding the application, and you must repeat the process of
       
  1296     making your application link to the Qt frameworks in the bundle
       
  1297     using \c install_name_tool.
       
  1298 
       
  1299     Now you should be able to move the application to another Mac OS X
       
  1300     machine and run it without Qt installed. Alternatively, you can
       
  1301     move your frameworks that live outside of the bundle to another
       
  1302     directory and see if the application still runs.
       
  1303 
       
  1304     If you store the frameworks in another location than in the
       
  1305     bundle, the technique of linking your application is similar; you
       
  1306     must make sure that the application and the frameworks agree where
       
  1307     to be looking for the Qt libraries as well as the plugins.
       
  1308 
       
  1309     \section2 Creating the Application Package
       
  1310 
       
  1311     When you are done linking your application to Qt, either
       
  1312     statically or as frameworks, the application is ready to be
       
  1313     distributed. Apple provides a fair bit of information about how to
       
  1314     do this and instead of repeating it here, we recommend that you
       
  1315     consult their \l
       
  1316     {http://developer.apple.com/documentation/DeveloperTools/Conceptual/SoftwareDistribution/index.html}{software delivery}
       
  1317     documentation.
       
  1318 
       
  1319     Although the process of deploying an application do have some
       
  1320     pitfalls, once you know the various issues you can easily create
       
  1321     packages that all your Mac OS X users will enjoy.
       
  1322 
       
  1323     \section1 Application Dependencies
       
  1324 
       
  1325     \section2 Qt Plugins
       
  1326 
       
  1327     Your application may also depend on one or more Qt plugins, such
       
  1328     as the JPEG image format plugin or a SQL driver plugin. Be sure
       
  1329     to distribute any Qt plugins that you need with your application,
       
  1330     and note that each type of plugin should be located within a
       
  1331     specific subdirectory (such as \c imageformats or \c sqldrivers)
       
  1332     within your distribution directory, as described below.
       
  1333 
       
  1334     \note If you are deploying an application that uses QtWebKit to display
       
  1335     HTML pages from the World Wide Web, you should include all text codec
       
  1336     plugins to support as many HTML encodings possible. 
       
  1337 
       
  1338     The search path for Qt plugins (as well as a few other paths) is
       
  1339     hard-coded into the QtCore library. By default, the first plugin
       
  1340     search path will be hard-coded as \c /path/to/Qt/plugins. But
       
  1341     using pre-determined paths has certain disadvantages. For example,
       
  1342     they may not exist on the target machine. For that reason you need
       
  1343     to examine various alternatives to make sure that the Qt plugins
       
  1344     are found:
       
  1345 
       
  1346     \list
       
  1347 
       
  1348     \o \l{qt-conf.html}{Using \c qt.conf}. This is the recommended
       
  1349     approach since it provides the most flexibility.
       
  1350 
       
  1351     \o Using QApplication::addLibraryPath() or
       
  1352     QApplication::setLibraryPaths().
       
  1353 
       
  1354     \o Using a third party installation utility to change the
       
  1355     hard-coded paths in the QtCore library.
       
  1356 
       
  1357     \endlist
       
  1358 
       
  1359     The \l{How to Create Qt Plugins} document outlines the issues you
       
  1360     need to pay attention to when building and deploying plugins for
       
  1361     Qt applications.
       
  1362 
       
  1363     \section2 Additional Libraries
       
  1364 
       
  1365     You can check which libraries your application is linking against
       
  1366     by using the \c otool tool. To use \c otool, all you need to do is
       
  1367     to run it like this:
       
  1368 
       
  1369     \snippet doc/src/snippets/code/doc_src_deployment.qdoc 50
       
  1370 
       
  1371     Unlike the deployment processes on \l {Deploying an Application on
       
  1372     X11 Platforms}{X11} and \l {Deploying an Application on
       
  1373     Windows}{Windows}, compiler specific libraries rarely have to
       
  1374     be redistributed along with your application. But since Qt can be
       
  1375     configured, built, and installed in several ways on Mac OS X,
       
  1376     there are also several ways to deploy applications. Typically your
       
  1377     goals help determine how you are going to deploy the
       
  1378     application. The last sections describe a couple of things to keep
       
  1379     in mind when you are deploying your application.
       
  1380 
       
  1381     \section2 Mac OS X Version Dependencies
       
  1382 
       
  1383     From Qt 4.6, Mac OS X 10.3 (Panther) is no longer supported.  Qt
       
  1384     4.6 applications can be built and deployed on Mac OS X 10.4
       
  1385     (Tiger) and higher. This is achieved using \e{weak linking}. In
       
  1386     \e{weak linking}, Qt tests whether a function added in a newer
       
  1387     version of Mac OS X is available on the computer it is running
       
  1388     on. This allows Qt to use newer features, when it runs on a newer
       
  1389     version of OS X, while remaining compatible on the older versions.
       
  1390 
       
  1391     For more information about cross development issues on Mac OS X,
       
  1392     see \l
       
  1393     {http://developer.apple.com/documentation/DeveloperTools/Conceptual/cross_development/index.html}{Apple's Developer Website}.
       
  1394 
       
  1395     Since the linker is set to be compatible with all OS X versions,
       
  1396     you must change the \c MACOSX_DEPLOYMENT_TARGET environment
       
  1397     variable to get \e{weak linking} to work for your application. You
       
  1398     can add:
       
  1399 
       
  1400     \snippet doc/src/snippets/code/doc_src_deployment.qdoc 51
       
  1401 
       
  1402     to your .pro file, and qmake will take care of this for you.
       
  1403 
       
  1404     For more information about C++ runtime environment, see \l
       
  1405     {http://developer.apple.com/documentation/DeveloperTools/Conceptual/CppRuntimeEnv/index.html}{Apple's Developer Website}
       
  1406 
       
  1407     \section3 Deploying Phonon Applications on Mac OS X
       
  1408 
       
  1409     \list
       
  1410 
       
  1411         \o If you build your Qt 4.6 Phonon application on OS X 10.4
       
  1412            (Tiger), it will run on OS X 10.4 and higher.
       
  1413 
       
  1414         \o If you are using Leopard but would like to build your application
       
  1415         against Tiger, you can use:
       
  1416 
       
  1417         \snippet doc/src/snippets/code/doc_src_deployment.qdoc 51b
       
  1418     \endlist
       
  1419 
       
  1420     \section2 Architecture Dependencies
       
  1421 
       
  1422     The Qt for Mac OS X libraries, tools, and examples can be built
       
  1423     "universal" (i.e. they run natively on both Intel and PowerPC
       
  1424     machines).  This is accomplished by passing \c -universal on the
       
  1425     \c configure line of the source package, and requires that you use
       
  1426     GCC 4.0.x. On PowerPC hardware you will need to pass the universal
       
  1427     SDK as a command line argument to the Qt configure command. For
       
  1428     example:
       
  1429 
       
  1430     \snippet doc/src/snippets/code/doc_src_deployment.qdoc 52
       
  1431 
       
  1432     From 4.1.1 the Qt binary package is already universal.
       
  1433 
       
  1434     If you want to create a binary that runs on older versions of
       
  1435     PowerPC and x86, it is possible to build Qt for the PowerPC using
       
  1436     GCC 3.3, and for x86 one using GCC 4.0, and use Apple's \c lipo(1)
       
  1437     tool to stitch them together. This is beyond the scope of this
       
  1438     document and is not something we have tried, but Apple documents
       
  1439     it on their \l
       
  1440     {http://developer.apple.com/documentation/}{developer website}.
       
  1441 
       
  1442     Once you have a universal Qt, \a qmake will generate makefiles
       
  1443     that will build for its host architecture by default. If you want
       
  1444     to build for a specific architecture, you can control this with
       
  1445     the \c CONFIG line in your \c .pro file. Use \c CONFIG+=ppc for
       
  1446     PowerPC, and \c CONFIG+=x86 for x86. If you desire both, simply
       
  1447     add both to the \c CONFIG line. PowerPC users also need an
       
  1448     SDK. For example:
       
  1449 
       
  1450     \snippet doc/src/snippets/code/doc_src_deployment.qdoc 53
       
  1451 
       
  1452     Besides \c lipo, you can also check your binaries with the \c file(1)
       
  1453     command line tool or the Finder.
       
  1454     
       
  1455     \section1 The Mac Deployment Tool
       
  1456     \target macdeploy
       
  1457     The Mac deployment tool can be found in QTDIR/bin/macdeployqt. It is
       
  1458     designed to automate the process of creating a deployable
       
  1459     application bundle that contains the Qt libraries as private
       
  1460     frameworks.
       
  1461     
       
  1462     The mac deployment tool also deploys the Qt plugins, according
       
  1463     to the following rules:
       
  1464     \list
       
  1465     \o Debug versions of the plugins are not deployed.
       
  1466     \o The designer plugins are not deployed.
       
  1467     \o The Image format plugins are always deployed.
       
  1468     \o SQL driver plugins are deployed if the application uses the QtSql module.
       
  1469     \o Script plugins are deployed if the application uses the QtScript module.
       
  1470     \o The Phonon backend plugin is deployed if the application uses the \l{Phonon Module} {Phonon} module.
       
  1471     \o The svg icon plugin is deployed if the application uses the QtSvg module.
       
  1472     \o The accessibility plugin is always deployed.
       
  1473     \o Accessibility for Qt3Support is deployed if the application uses the Qt3Support module.
       
  1474     \endlist
       
  1475 
       
  1476     \note If you want a 3rd party library to be included in your
       
  1477     application bundle, then you must add an excplicit lib entry for
       
  1478     that library to your application's .pro file.  Otherwise, the
       
  1479     \c macdeployqt tool will not copy the 3rd party .dylib into the
       
  1480     bundle.
       
  1481 
       
  1482     \c macdeployqt supports the following options:
       
  1483     \list
       
  1484     \o -no-plugins: Skip plugin deployment
       
  1485     \o -dmg       : Create a .dmg disk image
       
  1486     \o -no-strip  : Don't run 'strip' on the binaries
       
  1487     \endlist
       
  1488 */
       
  1489 
       
  1490 /*!
       
  1491     \page deployment-symbian.html
       
  1492     \contentspage Deploying Qt Applications
       
  1493 
       
  1494     \title Deploying an Application on the Symbian platform
       
  1495 
       
  1496     Applications are deployed to Symbian devices in signed \c .sis package files.
       
  1497     The \c .sis file content is controlled with \c .pkg files. The \c .pkg file contains a set
       
  1498     of instructions used by tools to produce a \c .sis file. \c qmake generates a
       
  1499     default \c .pkg file for your project. The \c .pkg file generated by \c qmake is typically
       
  1500     fully functional for testing purposes but when planning to deliver your application
       
  1501     to end-users some changes are needed. This document describes what changes are
       
  1502     typically needed and how to implement them.
       
  1503 
       
  1504     \section1 Static Linking
       
  1505 
       
  1506     Qt for the Symbian platform does currently not support static linking of
       
  1507     Qt libraries.
       
  1508 
       
  1509     \section1 Shared Libraries
       
  1510 
       
  1511     When deploying the application using the shared libraries approach we must ensure that the
       
  1512     Qt runtime is correctly redistributed along with the application executable,
       
  1513     and also that all Qt dependencies are redistributed along with the application.
       
  1514 
       
  1515     We will demonstrate these procedures in terms of deploying the \l {widgets/wiggly}{Wiggly}
       
  1516     application that is provided in Qt's examples directory.
       
  1517 
       
  1518     \section2 Building Qt as a Shared Library
       
  1519 
       
  1520     We assume that you already have installed Qt as a shared library,
       
  1521     in the \c C:\path\to\Qt directory which is the default when installing Qt for Symbian.
       
  1522     For more information on how to build Qt, see the \l {Installation} documentation.
       
  1523 
       
  1524     \section1 Shared Libraries
       
  1525 
       
  1526     After ensuring that Qt is built as a shared library, we can build
       
  1527     the \l {widgets/wiggly}{Wiggly} application. First, we
       
  1528     must go into the directory that contains the application:
       
  1529 
       
  1530     \snippet doc/src/snippets/code/doc_src_deployment.qdoc 55
       
  1531 
       
  1532     To prepare the application for deployment we must ensure that the \c .pkg file generated by
       
  1533     \c qmake contains the relevant vendor information and embeds the necessary
       
  1534     dependencies to the application deployment file (\c .sis). The content of the generated \c .pkg
       
  1535     file can be controlled with the Symbian specific \c qmake \l DEPLOYMENT keyword extensions.
       
  1536 
       
  1537     First, we will change the vendor statement to something more meaningful. The application
       
  1538     vendor is visible to end-user during the installation.
       
  1539 
       
  1540     \snippet doc/src/snippets/code/doc_src_deployment.qdoc 56
       
  1541 
       
  1542     Second we will tell the Symbian application installer that this application supports
       
  1543     only S60 5.0 based devices:
       
  1544 
       
  1545     \snippet doc/src/snippets/code/doc_src_deployment.qdoc 57
       
  1546 
       
  1547     You can find a list of platform and device indentification codes from
       
  1548     \l {http://wiki.forum.nokia.com/index.php/S60_Platform_and_device_identification_codes}{Forum Nokia Wiki}.
       
  1549     By default \c .pkg file generated by \c qmake adds support for all
       
  1550     S60 3rd edition FP1, S60 3rd edition FP2 and S60 5th edition devices.
       
  1551 
       
  1552     Now we are ready to compile the application and create the application
       
  1553     deployment file. Run \c qmake to create Symbian specific makefiles, resources (\.rss)
       
  1554     and deployment packaging files (\c .pkg). And do build to create the
       
  1555     application binaries and resources.
       
  1556 
       
  1557     \snippet doc/src/snippets/code/doc_src_deployment.qdoc 58
       
  1558 
       
  1559     If everything compiled and linked without any errors, we are now ready to create
       
  1560     an application installation package (\c wiggly_installer.sis).
       
  1561 
       
  1562     If you haven't done so already, download the latest release of the Smart Installer
       
  1563     from \l{http://get.qt.nokia.com/nokiasmartinstaller/}, and install it on top of the Qt package
       
  1564 
       
  1565     Then use this command to create the installer sis package:
       
  1566 
       
  1567     \snippet doc/src/snippets/code/doc_src_deployment.qdoc 59
       
  1568 
       
  1569     If all binaries and dependencies were found, you should now have a self signed
       
  1570     \c wiggly_installer.sis ready to be installed on a device. The smart installer
       
  1571     contained in the in the installer package will download the necessary dependencies
       
  1572     such as Qt libraries to the device.
       
  1573 
       
  1574     \note If you want to have your application properly Symbian Signed for distribution,
       
  1575     you will have to properly sign both the application and the application installer packages.
       
  1576     Please see
       
  1577     \l{http://developer.symbian.org/wiki/index.php/Category:Symbian_Signed}
       
  1578     {Symbian Signed wiki} for more information about Symbian Signed.
       
  1579 
       
  1580     For more information about creating a \c .sis file and installing it to device see also
       
  1581     \l {The Symbian platform - Introduction to Qt#Installing your own applications}{here}.
       
  1582 
       
  1583 */