|
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 */ |