CMake无法在Qt6安装中找到包。

11
我正在尝试通过CMake构建项目,我已将环境变量Qt6_DIR设置为包含Qt6Config.cmake的目录。但是构建似乎无法在Qt6安装中找到任何其他依赖项,我不确定接下来该怎么做。我看到其他可能的环境变量引用,如“Qt6CoreTools_DIR”,我想知道是否真的需要单独设置每个变量,或者是否有一个工具链包含这些信息需要正确链接。
-- GUI Frontend: Qt6
CMake Warning at C:/Program Files/CMake/share/cmake-3.20/Modules/CMakeFindDependencyMacro.cmake:47 (find_package):
  By not providing "FindQt6CoreTools.cmake" in CMAKE_MODULE_PATH this project
  has asked CMake to find a package configuration file provided by
  "Qt6CoreTools", but CMake did not find one.

  Could not find a package configuration file provided by "Qt6CoreTools"
  (requested version 6.2.3) with any of the following names:

    Qt6CoreToolsConfig.cmake
    qt6coretools-config.cmake

  Add the installation prefix of "Qt6CoreTools" to CMAKE_PREFIX_PATH or set
  "Qt6CoreTools_DIR" to a directory containing one of the above files.  If
  "Qt6CoreTools" provides a separate development package or SDK, be sure it
  has been installed.
Call Stack (most recent call first):
  C:/Qt6/6.2.3/mingw_64/lib/cmake/Qt6WidgetsTools/Qt6WidgetsToolsDependencies.cmake:9 (find_dependency)
  C:/Qt6/6.2.3/mingw_64/lib/cmake/Qt6WidgetsTools/Qt6WidgetsToolsConfig.cmake:34 (include)
  C:/Qt6/6.2.3/mingw_64/lib/cmake/Qt6Widgets/Qt6WidgetsDependencies.cmake:71 (find_package)
  C:/Qt6/6.2.3/mingw_64/lib/cmake/Qt6Widgets/Qt6WidgetsConfig.cmake:40 (include)
  C:/Qt6/6.2.3/mingw_64/lib/cmake/Qt6/Qt6Config.cmake:177 (find_package)
  src/CMakeLists.txt:22 (find_package)


CMake Warning at C:/Qt6/6.2.3/mingw_64/lib/cmake/Qt6Widgets/Qt6WidgetsDependencies.cmake:71 (find_package):
  Found package configuration file:

    C:/Qt6/6.2.3/mingw_64/lib/cmake/Qt6WidgetsTools/Qt6WidgetsToolsConfig.cmake

  but it set Qt6WidgetsTools_FOUND to FALSE so package "Qt6WidgetsTools" is
  considered to be NOT FOUND.  Reason given by package:

  Qt6WidgetsTools could not be found because dependency Qt6CoreTools could
  not be found.

Call Stack (most recent call first):
  C:/Qt6/6.2.3/mingw_64/lib/cmake/Qt6Widgets/Qt6WidgetsConfig.cmake:40 (include)
  C:/Qt6/6.2.3/mingw_64/lib/cmake/Qt6/Qt6Config.cmake:177 (find_package)
  src/CMakeLists.txt:22 (find_package)


CMake Warning at C:/Qt6/6.2.3/mingw_64/lib/cmake/Qt6/Qt6Config.cmake:177 (find_package):
  Found package configuration file:

    C:/Qt6/6.2.3/mingw_64/lib/cmake/Qt6Widgets/Qt6WidgetsConfig.cmake

  but it set Qt6Widgets_FOUND to FALSE so package "Qt6Widgets" is considered
  to be NOT FOUND.  Reason given by package:

  Target "Qt6::Widgets" was not found.

Call Stack (most recent call first):
  src/CMakeLists.txt:22 (find_package)


-- Could NOT find WrapVulkanHeaders (missing: Vulkan_INCLUDE_DIR)
-- Could NOT find Qt6CoreTools (missing: Qt6CoreTools_DIR)
CMake Warning at C:/Program Files/CMake/share/cmake-3.20/Modules/CMakeFindDependencyMacro.cmake:47 (find_package):
  Found package configuration file:

    C:/Qt6/6.2.3/mingw_64/lib/cmake/Qt6Core/Qt6CoreConfig.cmake

  but it set Qt6Core_FOUND to FALSE so package "Qt6Core" is considered to be
  NOT FOUND.  Reason given by package:

  Target "Qt6::Core" was not found.

Call Stack (most recent call first):
  C:/Qt6/6.2.3/mingw_64/lib/cmake/Qt6/QtPublicDependencyHelpers.cmake:14 (find_dependency)
  C:/Qt6/6.2.3/mingw_64/lib/cmake/Qt6OpenGL/Qt6OpenGLDependencies.cmake:91 (_qt_internal_find_dependencies)
  C:/Qt6/6.2.3/mingw_64/lib/cmake/Qt6OpenGL/Qt6OpenGLConfig.cmake:40 (include)
  C:/Qt6/6.2.3/mingw_64/lib/cmake/Qt6/Qt6Config.cmake:177 (find_package)
  src/CMakeLists.txt:22 (find_package)


CMake Warning at C:/Qt6/6.2.3/mingw_64/lib/cmake/Qt6/Qt6Config.cmake:177 (find_package):
  Found package configuration file:

    C:/Qt6/6.2.3/mingw_64/lib/cmake/Qt6OpenGL/Qt6OpenGLConfig.cmake

  but it set Qt6OpenGL_FOUND to FALSE so package "Qt6OpenGL" is considered to
  be NOT FOUND.  Reason given by package:

  Qt6OpenGL could not be found because dependency Qt6Core could not be found.

Call Stack (most recent call first):
  src/CMakeLists.txt:22 (find_package)


-- Could NOT find WrapVulkanHeaders (missing: Vulkan_INCLUDE_DIR)
-- Could NOT find Qt6CoreTools (missing: Qt6CoreTools_DIR)
CMake Warning at C:/Program Files/CMake/share/cmake-3.20/Modules/CMakeFindDependencyMacro.cmake:47 (find_package):
  Found package configuration file:

    C:/Qt6/6.2.3/mingw_64/lib/cmake/Qt6Core/Qt6CoreConfig.cmake

  but it set Qt6Core_FOUND to FALSE so package "Qt6Core" is considered to be
  NOT FOUND.  Reason given by package:

  Target "Qt6::Core" was not found.

Call Stack (most recent call first):
  C:/Qt6/6.2.3/mingw_64/lib/cmake/Qt6/QtPublicDependencyHelpers.cmake:14 (find_dependency)
  C:/Qt6/6.2.3/mingw_64/lib/cmake/Qt6OpenGL/Qt6OpenGLDependencies.cmake:91 (_qt_internal_find_dependencies)
  C:/Qt6/6.2.3/mingw_64/lib/cmake/Qt6OpenGL/Qt6OpenGLConfig.cmake:40 (include)
  C:/Program Files/CMake/share/cmake-3.20/Modules/CMakeFindDependencyMacro.cmake:47 (find_package)
  C:/Qt6/6.2.3/mingw_64/lib/cmake/Qt6/QtPublicDependencyHelpers.cmake:14 (find_dependency)
  C:/Qt6/6.2.3/mingw_64/lib/cmake/Qt6OpenGLWidgets/Qt6OpenGLWidgetsDependencies.cmake:91 (_qt_internal_find_dependencies)
  C:/Qt6/6.2.3/mingw_64/lib/cmake/Qt6OpenGLWidgets/Qt6OpenGLWidgetsConfig.cmake:40 (include)
  C:/Qt6/6.2.3/mingw_64/lib/cmake/Qt6/Qt6Config.cmake:177 (find_package)
  src/CMakeLists.txt:22 (find_package)


CMake Warning at C:/Program Files/CMake/share/cmake-3.20/Modules/CMakeFindDependencyMacro.cmake:47 (find_package):
  Found package configuration file:

    C:/Qt6/6.2.3/mingw_64/lib/cmake/Qt6OpenGL/Qt6OpenGLConfig.cmake

  but it set Qt6OpenGL_FOUND to FALSE so package "Qt6OpenGL" is considered to
  be NOT FOUND.  Reason given by package:

  Qt6OpenGL could not be found because dependency Qt6Core could not be found.

Call Stack (most recent call first):
  C:/Qt6/6.2.3/mingw_64/lib/cmake/Qt6/QtPublicDependencyHelpers.cmake:14 (find_dependency)
  C:/Qt6/6.2.3/mingw_64/lib/cmake/Qt6OpenGLWidgets/Qt6OpenGLWidgetsDependencies.cmake:91 (_qt_internal_find_dependencies)
  C:/Qt6/6.2.3/mingw_64/lib/cmake/Qt6OpenGLWidgets/Qt6OpenGLWidgetsConfig.cmake:40 (include)
  C:/Qt6/6.2.3/mingw_64/lib/cmake/Qt6/Qt6Config.cmake:177 (find_package)
  src/CMakeLists.txt:22 (find_package)


CMake Warning at C:/Qt6/6.2.3/mingw_64/lib/cmake/Qt6/Qt6Config.cmake:177 (find_package):
  Found package configuration file:

    C:/Qt6/6.2.3/mingw_64/lib/cmake/Qt6OpenGLWidgets/Qt6OpenGLWidgetsConfig.cmake

  but it set Qt6OpenGLWidgets_FOUND to FALSE so package "Qt6OpenGLWidgets" is
  considered to be NOT FOUND.  Reason given by package:

  Qt6OpenGLWidgets could not be found because dependency Qt6OpenGL could not
  be found.

Call Stack (most recent call first):
  src/CMakeLists.txt:22 (find_package)


CMake Error at src/CMakeLists.txt:22 (find_package):
  Found package configuration file:

    C:/Qt6/6.2.3/mingw_64/lib/cmake/Qt6/Qt6Config.cmake

  but it set Qt6_FOUND to FALSE so package "Qt6" is considered to be NOT
  FOUND.  Reason given by package:

  Failed to find Qt component "Widgets".

  Expected Config file at
  "C:/Qt6/6.2.3/mingw_64/lib/cmake/Qt6Widgets/Qt6WidgetsConfig.cmake" exists

  Failed to find Qt component "OpenGL".

  Expected Config file at
  "C:/Qt6/6.2.3/mingw_64/lib/cmake/Qt6OpenGL/Qt6OpenGLConfig.cmake" exists

  Failed to find Qt component "OpenGLWidgets".

  Expected Config file at
  "C:/Qt6/6.2.3/mingw_64/lib/cmake/Qt6OpenGLWidgets/Qt6OpenGLWidgetsConfig.cmake"
  exists

如果你所说的实际qt6目录是C:/Qt6,我已经尝试过了,但它告诉我Qt6_DIR需要是一个包含Qt6Config.cmake的目录。 - Jigwally
请参考配置模式搜索过程。您需要设置缓存变量Qt_ROOT或将qt目录添加到CMAKE_PREFIX_PATH中。前者可以在CMakePresets.json或命令行中完成,以便您不必触碰CMakeLists.txt - Osyotr
你的问题类似于这个。你确定已经安装了所有依赖项吗? - u-235
请参考QTBUG-97615 - 显然他们在Qt6中放弃了对Qt6_DIR的适当支持 :( - AntonK
你能告诉我们你正在尝试构建哪个项目吗? - Codebird
5个回答

7
根据QTBUG-97615,使用单一的Qt6_DIR配置构建将不被支持(尚未实现?),而“官方”的方法是使用CMAKE_PREFIX_PATH(正如其他答案所建议的)来配置应用程序构建。
但是如果你的工具不容易支持这种方法(例如VisualStudio/VSCode),则可以使用解决此问题的方法(我在深入挖掘Qt6的混乱的CMake脚本时发现了这个方法)。
您可以使用QT_ADDITIONAL_PACKAGES_PREFIX_PATH来指定Qt根目录(同时使用Qt6_DIR进行初始连接)。
命令行将如下所示(只是为了说明这种方法):
cmake -DQt6_DIR:PATH=C:/Qt6/6.2.3/mingw_64/lib/cmake/Qt6 -DQT_ADDITIONAL_PACKAGES_PREFIX_PATH=C:/Qt6/6.2.3/mingw_64 ..

这两个变量都可以很容易地通过VisualStudio/VSCode的UI进行配置。
祝构建愉快! :)

1
我刚刚确认了一下,在使用Qt 6.3.2构建时,find_library 一直失败,除非设置了正确路径的 QT_ADDITIONAL_PACKAGES_PREFIX_PATH。但是在6.4.2中,无需指定 QT_ADDITIONAL_PACKAGES_PREFIX_PATHfind_library 将使用提供的路径... - david

5

Qt ≥ 6.4.2

使用以下命令运行cmake:-DQt6_DIR=~/Qt/6.5.0/gcc_64/lib/cmake/Qt6


Qt < 6.4.2

将此添加到您的根CMakeLists.txt。

list(APPEND CMAKE_PREFIX_PATH "~/Qt/6.3.0/gcc_64")

根据需要更改路径。
或者,您可以将其设置为环境变量。
export PATH="~/Qt/6.3.0/gcc_64/:$PATH"

搜索标准系统环境变量。如果传递了NO_SYSTEM_ENVIRONMENT_PATH参数或将CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH设置为FALSE,则可以跳过此步骤。以/bin或/sbin结尾的路径条目会自动转换为其父目录:
- PATH
参考资料:
CMake find_package()搜索路径
在cmake特定的缓存变量中指定的搜索路径。这些变量旨在与命令行一起使用,使用-DVAR=VALUE进行设置。这些值被解释为分号分隔的列表。如果传递了NO_CMAKE_PATH参数或将CMAKE_FIND_USE_CMAKE_PATH设置为FALSE,则可以跳过此步骤:
- CMAKE_PREFIX_PATH - CMAKE_FRAMEWORK_PATH - CMAKE_APPBUNDLE_PATH
CMAKE_PREFIX_PATH:
用于通过FIND_XXX()搜索的路径,附加了适当的后缀。 指定将由FIND_XXX()命令使用的路径。它包含“基本”目录,FIND_XXX()命令将适当的子目录附加到基本目录上。因此,FIND_PROGRAM()将/bin添加到路径中的每个目录,FIND_LIBRARY()将/lib附加到每个目录,而FIND_PATH()和FIND_FILE()则附加/include。默认情况下为空,它的设置是为项目准备的。另请参阅CMAKE_SYSTEM_PREFIX_PATH、CMAKE_INCLUDE_PATH、CMAKE_LIBRARY_PATH、CMAKE_PROGRAM_PATH。 QT BUG [97615]

4

因为在评论中看到有些人特别要求VS(-Code)的设置/配置,以下是我在Windows上使用的方法:

我将CMAKE_PREFIX_PATH设置为C:/Qt/6.4.2/msvc2019_64(将C:/Qt/6.4.2替换为您的Qt安装路径和版本)。 注意:对于Qt 5,您可以使用[..]/msvc2019_64/lib/cmake,但这在Qt 6中不再适用。如果您需要在CMAKE_PREFIX_PATH中添加多个路径,请使用分号(;)连接它们。

一个示例.vscode/settings.json可能如下所示:

{
  "cmake.configureSettings": {
    "CMAKE_PREFIX_PATH": "C:/Qt/6.4.2/msvc2019_64"
  }
}

1
这就是我一直在寻找的解决方案。通过谷歌引导到这里。谢谢! - Paidoo
对于 Qt 6.4.2,可以使用 Qt6_DIR 配置库路径,在 VS/VSCode 中更改起来更加容易。 - AntonK

2

来自Qt文档:

有多种方法可以告诉CMake关于Qt的信息,但最常见和推荐的方法是将CMake缓存变量CMAKE_PREFIX_PATH设置为包含Qt 6安装前缀。

因此,您应该将C:/Qt6/6.2.3/mingw_64/添加到CMAKE_PREFIX_PATH分号分隔的列表中。


好的,如果您通过命令行调用cmake,则使用CMAKE_PREFIX_PATH方法可以工作,但是如何通过VisualStudio / VSCode传递它呢?值得注意的是,对于Qt5,可以使用Qt5_DIR告诉cmake库的位置。不幸的是,这种方法在Qt6中不再适用。 - AntonK

0

您可以检查项目提供的cmake脚本是否设置或修改了CMAKE_PREFIX_PATH

我在Linux操作系统上遇到了一个不同的项目出现了相同的问题,最终似乎解决的方法是将一个名为QT_PREFIX的项目特定变量设置为/opt/Qt/6.2.4/gcc_64/

通过查看项目文件CMakeLists_Dependencies.cmake,我注意到脚本设置了CMAKE_PREFIX_PATH,如下所示:set(CMAKE_PREFIX_PATH "${QT_PREFIX}/lib/cmake")。我猜测,这个语句掩盖了我从命令行定义的CMAKE_PREFIX_PATH

我通过在set(CMAKE_PREFIX_PATH "${QT_PREFIX}/lib/cmake")下面插入语句message(CMAKE_PREFIX_PATH="${CMAKE_PREFIX_PATH}")来进行检查。

当没有设置QT_PREFIX时,无论我是否在命令行中包含-DCMAKE_PREFIX_PATH=…,输出都是CMAKE_PREFIX_PATH="/lib/cmake"。(在我的情况下,/lib/cmake/不是有效路径。)

如果按照上述方式设置了QT_DIR,则输出为CMAKE_PREFIX_PATH="/opt/Qt/6.2.4/gcc_64//lib/cmake",这使得cmake能够找到该目录,即使有双斜杠也可以。


set(CMAKE_PREFIX_PATH "XYZ") is a piece of bad code in any case, it should be re-written as list(APPEND CMAKE_PREFIX_PATH "XYZ") - AntonK
@AntonK:你能详细说明为什么这通常被认为是“糟糕的代码”,还是你的评论主要基于个人意见?虽然我同意它会导致一些意外行为和不确定的错误消息,在我的情况下,但开发人员可能有充分的理由以他们特定的用例方式来实现。如果我们不知道他们所面临的限制,我们就无法真正判断他们的代码是“好”还是“坏”。这也可能是一个故意的设计决策,即一种品味问题。因此,如果你对“糟糕的代码”的定义超出了品味,请提供一些证据。 :-) - Codebird
CMAKE_PREFIX_PATH是一个由分号分隔的目录 列表,根据官方文档所述,而set仅用单个值替换该列表。虽然这种技巧在某些特定情况下可以使用,但通常会导致难以检测的问题(例如,在交叉编译时)。 - AntonK

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接