/****************************************************************************
**
** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/legal
**
** This file is part of the documentation of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:FDL$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and Digia.  For licensing terms and
** conditions see http://qt.digia.com/licensing.  For further information
** use the contact form at http://qt.digia.com/contact-us.
**
** GNU Free Documentation License Usage
** Alternatively, this file may be used under the terms of the GNU Free
** Documentation License version 1.3 as published by the Free Software
** Foundation and appearing in the file included in the packaging of
** this file.  Please review the following information to ensure
** the GNU Free Documentation License version 1.3 requirements
** will be met: http://www.gnu.org/copyleft/fdl.html.
** $QT_END_LICENSE$
**
****************************************************************************/

/*!
    \page deployment-plugins.html
    \title Deploying Plugins
    \brief A guide to plugins-specific aspects of deploying Qt and Qt Application

    This document explains how to deploy plugin libraries that Qt or
    your application should load at runtime. If you use
    \l{How to Create Qt Plugins#Static Plugins}{static plugins}, then the
    plugin code is already part of your application executable, and no
    separate deployment steps are required.

    \tableofcontents

    \section1 The Plugin Directory

    When the application is run, Qt will first treat the application's
    executable directory as the base directory for searching for plugins.
    For example if the
    application is in \c{C:\Program Files\MyApp} and has a style plugin,
    Qt will look in \c{C:\Program Files\MyApp\styles}. (See
    QCoreApplication::applicationDirPath() for how to find out where
    the application's executable is.) Qt will also look in the
    directory specified by
    QLibraryInfo::location(QLibraryInfo::PluginsPath), which typically
    is located in \c QTDIR/plugins (where \c QTDIR is the directory
    where Qt is installed). If you want Qt to look in additional
    places you can add as many paths as you need with calls to
    QCoreApplication::addLibraryPath(). And if you want to set your
    own path or paths you can use QCoreApplication::setLibraryPaths().
    You can also use a \c qt.conf file to override the hard-coded
    paths that are compiled into the Qt library. For more information,
    see the \l {Using qt.conf} documentation. Yet another possibility
    is to set the \c QT_PLUGIN_PATH environment variable before running
    the application. If set, Qt will look for plugins in the
    paths (separated by the system path separator) specified in the variable.

    \section1 Loading and Verifying Plugins Dynamically

    When loading plugins, the Qt library does some sanity checking to
    determine whether or not the plugin can be loaded and used. This
    provides the ability to have multiple versions and configurations of
    the Qt library installed side by side.

    \list
    \li Plugins linked with a Qt library that has a higher version number
       will not be loaded by a library with a lower version number.

      \br
      \b{Example:} Qt 5.0.0 will \e{not} load a plugin built with Qt 5.0.1.

    \li Plugins linked with a Qt library that has a lower major version
       number will not be loaded by a library with a higher major version
       number.

      \br
      \b{Example:} Qt 5.0.1 will \e{not} load a plugin built with Qt 4.8.2.
      \br
      \b{Example:} Qt 5.1.1 will load plugins built with Qt 5.1.0 and Qt 5.0.3.

    \endlist

    When building plugins to extend an application, it is important to ensure
    that the plugin is configured in the same way as the application. This means
    that if the application was built in release mode, plugins should be built
    in release mode, too. Except for Unix operating systems, plugins build in
    a different mode will not get loaded by the plugin system.

    If you configure Qt to be built in both debug and release modes,
    but only build applications in release mode, you need to ensure that your
    plugins are also built in release mode. By default, if a debug build of Qt is
    available, plugins will \e only be built in debug mode. To force the
    plugins to be built in release mode, add the following line to the plugin's
    project file:

    \code
        CONFIG += release
    \endcode

    This will ensure that the plugin is compatible with the version of the library
    used in the application.

    \section1 Debugging Plugins

    There are a number of issues that may prevent correctly-written plugins from
    working with the applications that are designed to use them. Many of these
    are related to differences in the way that plugins and applications have been
    built, often arising from separate build systems and processes.

    The following table contains descriptions of the common causes of problems
    developers experience when creating plugins:

    \table
    \header \li Problem \li Cause \li Solution
    \row \li Plugins sliently fail to load even when opened directly by the
            application. \QD shows the plugin libraries in its
            \gui{Help|About Plugins} dialog, but no plugins are listed under each
            of them.
         \li The application and its plugins are built in different modes.
         \li Either share the same build information or build the plugins in both
            debug and release modes by appending the \c debug_and_release to
            the \l{qmake Variable Reference#CONFIG}{CONFIG} variable in each of
            their project files.
    \endtable

    You can also use the \c QT_DEBUG_PLUGINS environment variable to obtain
    diagnostic information from Qt about each plugin it tries to load. Set this
    variable to a non-zero value in the environment from which your application is
    launched.
*/
