简 述: 随笔记一下在 Win10 上使用 CLion + CMake 开发 Qt 配置;
- Win10 + CLion + CMake + MSVC(Visual Studio)+ Qt
- Win10 + CLion + CMake + GCC(MinGW)+ Qt
[TOC]
本文初发于 “偕臧的小站“,同步转载于此。
关联博文
Windows 系统
- 在 Win10 环境下安装 QtCreator 5.9.8 作 C++ 的 IDE 开发工具
- QtCreator 安装 SDK,在 MSVC 编译模式下使用 CDB 调试器
- Win10 安装 QtCreator + Visual Studio 2015 作为 C++ 的 IDE 开发工具
- Visual Studio 2017 专业版使用最新版 Qt 5.9.2 教程
- Win10 安装 CLion + CMake + MSVC / MinGW 作 QT 开发
背景
预先安装 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,按照步骤可看到最后成功运行。
- 配置 ToolChians、CMake
- 切换想要构建生成的配置方案(Debug/Relase/RelWithDebInfo/MinSizeRel、MSVC/MinGW)
- 执行编译 CMakeLists.txt 文件,生成 Makefile 文件;
- 编译上一步生成的 Makefile 文件,编译源文件、链接系统文件、生成目标二进制程序
- 加载所需要的系统和三方动态库等、运行生成的目标二进制程序
- 看到窗口运行成功
- 个人配置的集中生成目标文件的集中模式(可忽略此)
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 ()