简 述: 随笔记一下在 Win10 上使用 CLion + CMake 开发 Qt 配置;

  1. Win10 + CLion + CMake + MSVC(Visual Studio)+ Qt
  2. Win10 + CLion + CMake + gcc(MinGW)+ Qt

[TOC]

本文初发于 “偕臧的小站“,同步转载于此。


背景

​ 预先安装 Win10、QtCrator、CMake 以及 CLion。若想使用 CLion 开发 Qt 就必须告知 Clion 和准备编译构建的项目,一些必要的参数配置。

💻: win10 21H1 📎 Qt 5.12.11 📎 Visual Studio 2017 📎 Qt Creator 4.15.0


预先配置项

配置 CMAKE_PREFIX_PATH(Qt 路径)

CMAKE_PREFIX_PATH 的值为告知此项目使用的 Qt 的版本;即 Qt 安装路径。以下三种方式任选其一即可。

  • 新建项目时填写


  • 手动写在 CMakeLists.txt 中

    set(CMAKE_PREFIX_PATH "C:/Qt/Qt5.12.11/5.12.11/msvc2017")

  • 在设置中的 CMake 配置中的 CMake option: 中写参数

    -DCMAKE_PREFIX_PATH=C:/Qt/Qt5.12.11/5.12.11/msvc2017

配置 ToolChians(工具链)

当选中正确的 Environment 时,后面系类会自动检测出来正确的配置。可参考下图

  • 配置 MSVC(Visual Studio) 模式

  • 配置 gcc(MinGW)模式


配置构建 CMake 环境

​ 告知系统使用哪一个 ToolChinas (工具集合)来处理此项目文件。是 MSCVC 还是 gcc 相关系的?


CLion 中运行 Qt 项目

​ 经过上面的准备工作,最后在运行 CLion,按照步骤可看到最后成功运行。

  1. 配置 ToolChians、CMake
  2. 切换想要构建生成的配置方案(Debug/Relase/RelWithDebInfo/MinSizeRel、MSVC/MinGW)
  3. 执行编译 CMakeLists.txt 文件,生成 Makefile 文件;
  4. 编译上一步生成的 Makefile 文件,编译源文件、链接系统文件、生成目标二进制程序
  5. 加载所需要的系统和三方动态库等、运行生成的目标二进制程序
  6. 看到窗口运行成功
  7. 个人配置的集中生成目标文件的集中模式(可忽略此)

CMake 调用 Qt 语法

​ CLion 自动生成的 CMakeLists.txt 文件配置内容,如下,简单介绍 CMake 语法。更详细的注释,可参考另一项目的此文件

cmake_minimum_required(VERSION 3.20)         # 最低 cmake 版本
project(XTest)                               # 此项目名称

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_AUTOMOC ON)                        # 启用 qt moc 的支持
set(CMAKE_AUTORCC ON)                        # 启用 qrc 资源文件的支持
set(CMAKE_AUTOUIC ON)                        # 启用 qt uic 的支持

set(CMAKE_PREFIX_PATH "C:/Qt/Qt5.12.11/5.12.11/msvc2017")  # Qt 的安装路径

find_package(Qt5 COMPONENTS                  # 查找 Qt5 的如下库
        Core
        Gui
        Widgets
        REQUIRED)

add_executable(XTest main.cpp)               # 生成目标文件 XTest
target_link_libraries(XTest                  # 链接 Qt5 的如下二进制库
        Qt5::Core
        Qt5::Gui
        Qt5::Widgets
        )
        
if (WIN32)                             # 可忽略,大意为未配置或尝试找不到 Qt 安装目录,则警告
    set(DEBUG_SUFFIX)
    if (CMAKE_BUILD_TYPE MATCHES "Debug")
        set(DEBUG_SUFFIX "d")
    endif ()
    set(QT_INSTALL_PATH "${CMAKE_PREFIX_PATH}")
    if (NOT EXISTS "${QT_INSTALL_PATH}/bin")
        set(QT_INSTALL_PATH "${QT_INSTALL_PATH}/..")
        if (NOT EXISTS "${QT_INSTALL_PATH}/bin")
            set(QT_INSTALL_PATH "${QT_INSTALL_PATH}/..")
        endif ()
    endif ()
    if (EXISTS "${QT_INSTALL_PATH}/plugins/platforms/qwindows${DEBUG_SUFFIX}.dll")
        add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
                COMMAND ${CMAKE_COMMAND} -E make_directory
                "$<TARGET_FILE_DIR:${PROJECT_NAME}>/plugins/platforms/")
        add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
                COMMAND ${CMAKE_COMMAND} -E copy
                "${QT_INSTALL_PATH}/plugins/platforms/qwindows${DEBUG_SUFFIX}.dll"
                "$<TARGET_FILE_DIR:${PROJECT_NAME}>/plugins/platforms/")
    endif ()
    foreach (QT_LIB Core Gui Widgets)
        add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
                COMMAND ${CMAKE_COMMAND} -E copy
                "${QT_INSTALL_PATH}/bin/Qt5${QT_LIB}${DEBUG_SUFFIX}.dll"
                "$<TARGET_FILE_DIR:${PROJECT_NAME}>")
    endforeach (QT_LIB)
endif ()