Making Qt available in CMake projects
Currently the only supported method of making Qt available for user projects is by having it pre-installed on the system, or any equivalent workflow that builds Qt ahead of time and makes it available to find_package
, such as vcpkg
.
When using Qt Creator or qt-cmake
(qt-cmake.bat
on Windows), the Qt installation location is automatically forwarded to the underlying CMake call.
When using cmake
directly, the general search paths used by CMake should cover most non-user installations of Qt. For more control over which Qt package to use, you can pass https://cmake.org/cmake/help/latest/variable/PackageName_ROOT.html Qt6_ROOT
as an environment or cache variable pointing to the Qt installation path, or by adding or appending to the CMAKE_PREFIX_PATH
in a similar way. For example, if the installation path is "~/Qt/6.9.2/gcc_64"
, you would pass it on the command line as -DQt6_ROOT=$HOME/Qt/6.9.2/gcc_64
.
Note: When cross-compiling (compiling for a platform other than the one you are on, such as WebAssembly or Android) and when using vanilla cmake
, set CMAKE_TOOLCHAIN_FILE
instead of search paths like Qt6_ROOT
or CMAKE_PREFIX_PATH
. On Linux, the toolchain file (specific to a particular target platform) is typically located at a path similar to this: "~/Qt/6.9.2/wasm_singlethread/lib/cmake/Qt6/qt.toolchain.cmake"
. It sets the required variables like CMAKE_PREFIX_PATH
, CMAKE_FIND_ROOT_PATH
, and QT_HOST_PATH
.
cmake_minimum_required(VERSION 3.16) project(helloworld) find_package(Qt6 REQUIRED)
The Qt package is split into various modules that you need to include depending on the scope of your project, most basic of which is
find_package(Qt6 REQUIRED COMPONENTS Core)
Modern CMake supports other dependency providers such as FetchContent
, however using Qt with FetchContent
is not supported due to a tight integration of Qt features inside CMake itself. Adding Qt sources via add_subdirectory
and Git submodules is not supported either.
Note: Calling find_package(Qt6)
in a subdirectory other than where it is used, or inside a function
is not supported. Doing so can cause various failures in unpredictable locations.
Instead, repeatedly call find_package(Qt6)
in all subdirectory scopes that use Qt functions, or move the find_package(Qt6)
call to the root CMakeLists.txt
.