尽管设置了前缀路径,cmake find_packages(QT5) 仍未使用正确版本的 QT 二进制文件

cmake find_packages(QT5) does not use correct version of QT binaries despite setting prefix path

我正在查找如何使用 clion IDE 在 cmake 中编译 QT 动态链接项目。我 运行 遇到以下项目设置问题。我已经按照 this 教程进行编译,并 运行 使用 mingw32 位 一个工具包,该工具包链接到使用 mingw-w64 编译的 Qt(其 qmake 文件在 C:/msys64/mingw64/bin)

中找到

我的项目设置如下所示:

CMakeLists.txt
main.cpp
notepad.cpp
notepad.h
notepad.ui

在 clion 中,我使用了以下 cmake 文件来构建这个项目。

cmake_minimum_required(VERSION 3.7)
set(CMAKE_PREFIX_PATH C:/msys64/mingw64/bin)
project(qttest)

set(QT_ROOT_DIR "C:/msys64/mingw64/bin")

set(QT_QMAKE_EXECUTABLE ${QT_ROOT_DIR}/qmake)

set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)


find_package(Qt5 REQUIRED COMPONENTS Core Widgets Gui)

add_library(notepad notepad.cpp)
target_link_libraries (notepad Qt5::Core Qt5::Widgets Qt5::Gui)




set(SOURCE_FILES main.cpp)
add_executable(qttest ${SOURCE_FILES})
target_link_libraries(qttest notepad)

构建时出现以下错误:

{projectdir}/qttest/main.cpp:6: undefined reference to `__imp__ZN12QApplicationC1ERiPPci'
... (1000 of these types of errors) ...
CMakeFiles\qttest.dir\build.make:127: recipe for target 'qttest.exe' failed
CMakeFiles\Makefile2:104: recipe for target 'CMakeFiles/qttest.dir/all' failed
mingw32-make.exe[3]: *** [qttest.exe] Error 1
mingw32-make.exe[2]: *** [CMakeFiles/qttest.dir/all] Error 2
mingw32-make.exe[1]: *** [CMakeFiles/qttest.dir/rule] Error 2
CMakeFiles\Makefile2:116: recipe for target 'CMakeFiles/qttest.dir/rule' failed
Makefile:130: recipe for target 'qttest' failed
mingw32-make.exe: *** [qttest] Error 2

我用谷歌搜索了一个解决方案,它似乎链接到 QT 的 32 位 mingw 安装。这是有道理的,因为我正在使用 mingw-w64 进行编译,所以我寻找 solution here(to include qt via findpackages) to solve this issue. This doesn't really work, so I go to find another solution here, which also happens to not work (setting enviroment variable to qmake directory). 也没有做任何事情(将路径变量专门附加到 C:/msys64/mingw64/bin)。

不确定问题出在哪里,但我们将不胜感激。

编辑:目前的情况,我觉得我已经尝试了一切,但我发现在执行以下操作时:

get_target_property(QtCore_location Qt5::Core LOCATION)
message("qtcore location ${QtCore_location}")

cmake 输出实际上是

qtcore location C:/ProgramData/Anaconda3/Library/bin/Qt5Core.dll

很明显它链接到我的 anaconda 安装,但是 为什么我要如何阻止它!!! 它似乎不想使用任何其他东西,Anaconda 出现在路径中但我需要把它放在那里。

我想通了...

这很可能是 cmake 缓存问题。我之前以为可能是这类问题,但是我在清除错误的 cmake 版本缓存。我在我的计算机上安装了一个不同版本的 cmake(更新),而不是 clion 附带的版本(我告诉它使用我没有安装的默认版本)。因此,通过删除那个 cmake 的缓存,它对我的​​ clion 版本的 cmake 完全没有任何作用(因此 IIRC 从阅读 cmake 文档,默认情况下 CMAKE_PREFIX_PATH 之类的东西会使用缓存版本)尽管如此,这使得无法关闭 anaconda 版本,比如当我输入错误的版本信息IE时 find_package(Qt5 8.0 REQUIRED COMPONENTS Core Widgets Gui) 清楚地了解和知道5.8.0目录的安装目录(因为它列出了它):

Could not find a configuration file for package "Qt5" that is compatible
  with requested version "8".

  The following configuration files were considered but not accepted:

    C:/msys64/mingw64/lib/cmake/Qt5/Qt5Config.cmake, version: 5.8.0
    C:/ProgramData/Anaconda3/Library/lib/cmake/Qt5/Qt5Config.cmake, version: 5.6.2

当我设置 cmake 路径 var 时,Cmake 无法让我使用该版本,现在可以正确构建两个版本的 cmake 之间的切换(我相信当您从内部版本切换时,clion 可能会清除缓存,我不是当然)。因此,希望遇到此特定问题的任何其他人现在都能够解决它。

教程实际有效!