Deploying Qt applications
Deploying on windows
Qt provides a deployment tool for Windows: windeployqt. The tool inspects a Qt application executable for its dependecies to Qt modules and creates a deployment directory with the necessary Qt files to run the inspected executable. A possible script may look like:
set PATH=%PATH%;<qt_install_prefix>/bin
windeployqt --dir /path/to/deployment/dir /path/to/qt/application.exeThe set command is called to add Qt’s bin directory to the PATH environment variable. windeployqt is then called:
- The path to the deployment directory is given an optional argument given with the parameter
--dir(default is the path wherewindeployqtis called). - The path to the executable to be inspected is given as last argument.
The deployment directory can then be bundled with the executable.
NOTE:
If you are using pre-compiled Qt5.7.0 with vs2013 on Windows (not sure if all versions has this issue), there is a chance, that you need to manually copy <QTDIR>\5.7\msvc2015\qml to your bin directory of your program. Otherwise the program will auto quit after start.
See also Qt documentation.
Integrating with CMake
It is possible to run windeployqt and macdeployqt from CMake, but first the path to the executables must be found:
# Retrieve the absolute path to qmake and then use that path to find
# the binaries
get_target_property(_qmake_executable Qt5::qmake IMPORTED_LOCATION)
get_filename_component(_qt_bin_dir "${_qmake_executable}" DIRECTORY)
find_program(WINDEPLOYQT_EXECUTABLE windeployqt HINTS "${_qt_bin_dir}")
find_program(MACDEPLOYQT_EXECUTABLE macdeployqt HINTS "${_qt_bin_dir}")In order for windeployqt to find the Qt libraries in their installed location, the folder must be added to %PATH%. To do this for a target named myapp after being built:
add_custom_command(TARGET myapp POST_BUILD
COMMAND "${CMAKE_COMMAND}" -E
env PATH="${_qt_bin_dir}" "${WINDEPLOYQT_EXECUTABLE}"
"$<TARGET_FILE:myapp>"
COMMENT "Running windeployqt..."
)For running macdeployqt on a bundle, it would be done this way:
add_custom_command(TARGET myapp POST_BUILD
COMMAND "${MACDEPLOYQT_EXECUTABLE}"
"$<TARGET_FILE_DIR:myapp>/../.."
-always-overwrite
COMMENT "Running macdeployqt..."
)Deploying on Mac
Qt offers a deployment tool for Mac: The Mac Deployment Tool.
The Mac deployment tool can be found in QTDIR/bin/macdeployqt. It is designed to automate the process of creating a deployable application bundle that contains the Qt libraries as private frameworks.
The mac deployment tool also deploys the Qt plugins, according to the following rules (unless -no-plugins option is used):
- The platform plugin is always deployed.
- Debug versions of the plugins are not deployed.
- The designer plugins are not deployed.
- The image format plugins are always deployed.
- The print support plugin is always deployed.
- SQL driver plugins are deployed if the application uses the Qt SQL module.
- Script plugins are deployed if the application uses the Qt Script module.
- The SVG icon plugin is deployed if the application uses the Qt SVG module.
- The accessibility plugin is always deployed.
To include a 3rd party library in the application bundle, copy the library into the bundle manually, after the bundle is created.
To use macdeployqt tool you can open terminal and type:
$ QTDIR/bin/macdeployqt <path to app file generated by build>/appFile.appThe app file will now contain all the Qt Libraries used as private frameworks.
macdeployqt also supports the following options
| Option | Description |
|---|---|
| -verbose=<0-3> | 0 = no output, 1 = error/warning (default), 2 = normal, 3 = debug |
| -no-plugins | Skip plugin deployment |
| -dmg | Create a .dmg disk image |
| -no-strip | Don’t run ‘strip’ on the binaries |
| -use-debug-libs | Deploy with debug versions of frameworks and plugins (implies -no-strip) |
| -executable= |
Let the given executable also use the deployed frameworks |
| -qmldir= |
Deploy imports used by .qml files in the given path |
Detailed informations can be fount on Qt Documentation
Deploying on linux
There is a a deployment tool for linux on GitHub. While not perfect, it is linked to from the Qt wiki. It’s based conceptually on the Qt Mac Deployment Tool and functions similarly by providing an AppImage.
Given that a desktop file should be provided with an AppImage, linuxdeployqt can use that to determine the parameters of the build.
linuxdeployqt ./path/to/appdir/usr/share/application_name.desktopWhere the desktop file specifies the executable to be run (with EXEC=), the name of the application, and an icon.