使 Qt 可用于 CMake 工程

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 ,譬如 vcpkg .

当使用 Qt Creator or qt-cmake ( qt-cmake.bat on Windows), the Qt installation location is automatically forwarded to the underlying CMake call.

当使用 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.10.1/gcc_64" , you would pass it on the command line as -DQt6_ROOT=$HOME/Qt/6.10.1/gcc_64 .

注意: 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.10.1/wasm_singlethread/lib/cmake/Qt6/qt.toolchain.cmake" . It sets the required variables like CMAKE_PREFIX_PATH , CMAKE_FIND_ROOT_PATH ,和 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.

注意: 调用 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 .