0
|
1 |
/****************************************************************************
|
|
2 |
**
|
|
3 |
** Copyright (C) 2009 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-plugins.html
|
|
44 |
\title Deploying Plugins
|
|
45 |
\brief A guide to plugins-specific aspects of deploying Qt and Qt Application
|
|
46 |
|
|
47 |
This document explains how to deploy plugin libraries that Qt or
|
|
48 |
your application should load at runtime. If you use
|
|
49 |
\l{How to Create Qt Plugins#Static Plugins}{static plugins}, then the
|
|
50 |
plugin code is already part of your application executable, and no
|
|
51 |
separate deployment steps are required.
|
|
52 |
|
|
53 |
\tableofcontents
|
|
54 |
|
|
55 |
\section1 The Plugin Directory
|
|
56 |
|
|
57 |
When the application is run, Qt will first treat the application's
|
|
58 |
executable directory as the \c{pluginsbase}. For example if the
|
|
59 |
application is in \c{C:\Program Files\MyApp} and has a style plugin,
|
|
60 |
Qt will look in \c{C:\Program Files\MyApp\styles}. (See
|
|
61 |
QCoreApplication::applicationDirPath() for how to find out where
|
|
62 |
the application's executable is.) Qt will also look in the
|
|
63 |
directory specified by
|
|
64 |
QLibraryInfo::location(QLibraryInfo::PluginsPath), which typically
|
|
65 |
is located in \c QTDIR/plugins (where \c QTDIR is the directory
|
|
66 |
where Qt is installed). If you want Qt to look in additional
|
|
67 |
places you can add as many paths as you need with calls to
|
|
68 |
QCoreApplication::addLibraryPath(). And if you want to set your
|
|
69 |
own path or paths you can use QCoreApplication::setLibraryPaths().
|
|
70 |
You can also use a \c qt.conf file to override the hard-coded
|
|
71 |
paths that are compiled into the Qt library. For more information,
|
|
72 |
see the \l {Using qt.conf} documentation. Yet another possibility
|
|
73 |
is to set the \c QT_PLUGIN_PATH environment variable before running
|
|
74 |
the application. If set, Qt will look for plugins in the
|
|
75 |
paths (separated by the system path separator) specified in the variable.
|
|
76 |
|
|
77 |
\section1 Loading and Verifying Plugins Dynamically
|
|
78 |
|
|
79 |
When loading plugins, the Qt library does some sanity checking to
|
|
80 |
determine whether or not the plugin can be loaded and used. This
|
|
81 |
provides the ability to have multiple versions and configurations of
|
|
82 |
the Qt library installed side by side.
|
|
83 |
|
|
84 |
\list
|
|
85 |
\o Plugins linked with a Qt library that has a higher version number
|
|
86 |
will not be loaded by a library with a lower version number.
|
|
87 |
|
|
88 |
\br
|
|
89 |
\bold{Example:} Qt 4.3.0 will \e{not} load a plugin built with Qt 4.3.1.
|
|
90 |
|
|
91 |
\o Plugins linked with a Qt library that has a lower major version
|
|
92 |
number will not be loaded by a library with a higher major version
|
|
93 |
number.
|
|
94 |
|
|
95 |
\br
|
|
96 |
\bold{Example:} Qt 4.3.1 will \e{not} load a plugin built with Qt 3.3.1.
|
|
97 |
\br
|
|
98 |
\bold{Example:} Qt 4.3.1 will load plugins built with Qt 4.3.0 and Qt 4.2.3.
|
|
99 |
|
|
100 |
\o The Qt library and all plugins are built using a \e {build
|
|
101 |
key}. The build key in the Qt library is examined against the build
|
|
102 |
key in the plugin, and if they match, the plugin is loaded. If the
|
|
103 |
build keys do not match, then the Qt library refuses to load the
|
|
104 |
plugin.
|
|
105 |
|
|
106 |
\br \bold{Rationale:} See the \l{#The Build Key}{The Build Key} section below.
|
|
107 |
\endlist
|
|
108 |
|
|
109 |
When building plugins to extend an application, it is important to ensure
|
|
110 |
that the plugin is configured in the same way as the application. This means
|
|
111 |
that if the application was built in release mode, plugins should be built
|
|
112 |
in release mode, too.
|
|
113 |
|
|
114 |
If you configure Qt to be built in both debug and release modes,
|
|
115 |
but only build applications in release mode, you need to ensure that your
|
|
116 |
plugins are also built in release mode. By default, if a debug build of Qt is
|
|
117 |
available, plugins will \e only be built in debug mode. To force the
|
|
118 |
plugins to be built in release mode, add the following line to the plugin's
|
|
119 |
project file:
|
|
120 |
|
|
121 |
\snippet doc/src/snippets/code/doc_src_plugins-howto.qdoc 3
|
|
122 |
|
|
123 |
This will ensure that the plugin is compatible with the version of the library
|
|
124 |
used in the application.
|
|
125 |
|
|
126 |
\section2 The Build Key
|
|
127 |
|
|
128 |
When loading plugins, Qt checks the build key of each plugin against its
|
|
129 |
own configuration to ensure that only compatible plugins are loaded; any
|
|
130 |
plugins that are configured differently are not loaded.
|
|
131 |
|
|
132 |
The build key contains the following information:
|
|
133 |
\list
|
|
134 |
\o Architecture, operating system and compiler.
|
|
135 |
|
|
136 |
\e {Rationale:}
|
|
137 |
In cases where different versions of the same compiler do not
|
|
138 |
produce binary compatible code, the version of the compiler is
|
|
139 |
also present in the build key.
|
|
140 |
|
|
141 |
\o Configuration of the Qt library. The configuration is a list
|
|
142 |
of the missing features that affect the available API in the
|
|
143 |
library.
|
|
144 |
|
|
145 |
\e {Rationale:}
|
|
146 |
Two different configurations of the same version of
|
|
147 |
the Qt library are not binary compatible. The Qt library that
|
|
148 |
loads the plugin uses the list of (missing) features to
|
|
149 |
determine if the plugin is binary compatible.
|
|
150 |
|
|
151 |
\e {Note:} There are cases where a plugin can use features that are
|
|
152 |
available in two different configurations. However, the
|
|
153 |
developer writing plugins would need to know which features are
|
|
154 |
in use, both in their plugin and internally by the utility
|
|
155 |
classes in Qt. The Qt library would require complex feature
|
|
156 |
and dependency queries and verification when loading plugins.
|
|
157 |
Requiring this would place an unnecessary burden on the developer, and
|
|
158 |
increase the overhead of loading a plugin. To reduce both
|
|
159 |
development time and application runtime costs, a simple string
|
|
160 |
comparision of the build keys is used.
|
|
161 |
|
|
162 |
\o Optionally, an extra string may be specified on the configure
|
|
163 |
script command line.
|
|
164 |
|
|
165 |
\e {Rationale:}
|
|
166 |
When distributing binaries of the Qt library with an
|
|
167 |
application, this provides a way for developers to write
|
|
168 |
plugins that can only be loaded by the library with which the
|
|
169 |
plugins were linked.
|
|
170 |
\endlist
|
|
171 |
|
|
172 |
For debugging purposes, it is possible to override the run-time build key
|
|
173 |
checks by configuring Qt with the \c QT_NO_PLUGIN_CHECK preprocessor macro
|
|
174 |
defined.
|
|
175 |
|
|
176 |
\section1 The Plugin Cache
|
|
177 |
|
|
178 |
In order to speed up loading and validation of plugins, some of
|
|
179 |
the information that is collected when plugins are loaded is cached
|
|
180 |
through QSettings. This includes information about whether or not
|
|
181 |
a plugin was successfully loaded, so that subsequent load operations
|
|
182 |
don't try to load an invalid plugin. However, if the "last modified"
|
|
183 |
timestamp of a plugin has changed, the plugin's cache entry is
|
|
184 |
invalidated and the plugin is reloaded regardless of the values in
|
|
185 |
the cache entry, and the cache entry itself is updated with the new
|
|
186 |
result.
|
|
187 |
|
|
188 |
This also means that the timestamp must be updated each time the
|
|
189 |
plugin or any dependent resources (such as a shared library) is
|
|
190 |
updated, since the dependent resources might influence the result
|
|
191 |
of loading a plugin.
|
|
192 |
|
|
193 |
Sometimes, when developing plugins, it is necessary to remove entries
|
|
194 |
from the plugin cache. Since Qt uses QSettings to manage the plugin
|
|
195 |
cache, the locations of plugins are platform-dependent; see
|
|
196 |
\l{QSettings#Platform-Specific Notes}{the QSettings documentation}
|
|
197 |
for more information about each platform.
|
|
198 |
|
|
199 |
For example, on Windows the entries are stored in the registry, and the
|
|
200 |
paths for each plugin will typically begin with either of these two strings:
|
|
201 |
|
|
202 |
\snippet doc/src/snippets/code/doc_src_plugins-howto.qdoc 6
|
|
203 |
|
|
204 |
\section1 Debugging Plugins
|
|
205 |
|
|
206 |
There are a number of issues that may prevent correctly-written plugins from
|
|
207 |
working with the applications that are designed to use them. Many of these
|
|
208 |
are related to differences in the way that plugins and applications have been
|
|
209 |
built, often arising from separate build systems and processes.
|
|
210 |
|
|
211 |
The following table contains descriptions of the common causes of problems
|
|
212 |
developers experience when creating plugins:
|
|
213 |
|
|
214 |
\table
|
|
215 |
\header \o Problem \o Cause \o Solution
|
|
216 |
\row \o Plugins sliently fail to load even when opened directly by the
|
|
217 |
application. \QD shows the plugin libraries in its
|
|
218 |
\gui{Help|About Plugins} dialog, but no plugins are listed under each
|
|
219 |
of them.
|
|
220 |
\o The application and its plugins are built in different modes.
|
|
221 |
\o Either share the same build information or build the plugins in both
|
|
222 |
debug and release modes by appending the \c debug_and_release to
|
|
223 |
the \l{qmake Variable Reference#CONFIG}{CONFIG} variable in each of
|
|
224 |
their project files.
|
|
225 |
\row \o A valid plugin that replaces an invalid (or broken) plugin fails to load.
|
|
226 |
\o The entry for the plugin in the plugin cache indicates that the original
|
|
227 |
plugin could not be loaded, causing Qt to ignore the replacement.
|
|
228 |
\o Either ensure that the plugin's timestamp is updated, or delete the
|
|
229 |
entry in the \l{#The Plugin Cache}{plugin cache}.
|
|
230 |
\endtable
|
|
231 |
|
|
232 |
You can also use the \c QT_DEBUG_PLUGINS environment variable to obtain
|
|
233 |
diagnostic information from Qt about each plugin it tries to load. Set this
|
|
234 |
variable to a non-zero value in the environment from which your application is
|
|
235 |
launched.
|
|
236 |
*/
|