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