一文搞懂如何在CMake中使用Qt


0. 前言

本文默认朋友们都已经掌握了CMake的基本操作,也可以再去笔者的CMake专栏瞄一眼,或者上CMake官方文档学一圈再回来。

对于在CMake中使用Qt,我们可以先想一下一个Qt程序需要配置哪些内容

首先需要搬出来Qt几个编译工具moc、uic、rcc,这几个工具在Qt Assistant中都可以直接搜索到介绍页面,这里简单说一下各自都干什么的:

  1. moc:元对象编译器(Meta Object Compiler),用来处理带有Q_OBJECT宏的类。我们在声明class的时候,继承QObject,再私有声明Q_OBJECT宏就可以使用Qt信号和槽了,实际上是Qt利用moc将各个类所需要的元对象代码meta-object code)补充好了;

    moc读取一个头文件,补充其中带有Q_OBJECT宏类的元对象代码,一般生成一个moc_ClassName.cpp文件。

  2. uic:用户界面编译器(User Interface Compiler),用来编译ui界面文件的;
  3. rcc:资源编译器(Resource Compiler),把qrc文件编译成对应的C++代码;

所以在CMake工程中使用Qt首先要搞明白如何调用这些工具。

然后,类似所有第三方库的使用,在CMake中如何链接Qt的库,找到对应的头文件也需要我们搞清楚。

下面我们带着这些问题继续。


1. CMakeLists处理

1.1 moc uic rcc自动调用

首先对于moc uic rcc这几位大佬,处理起来竟然出奇地简单:

set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)

设置了这几个变量后,会在需要时自动调用这几个编译器,不得不说这还是十分人性化的。

在添加exe时的语法也很易于理解:

add_executable(TestQtCMake
WIN32
src/main.cpp
src/mainwindow.cpp
src/mainwindow.h
src/mainwindow.ui
)

但其中的WIN32参数可能需要提示一下:如果提供了WIN32,则将设置WIN32_EXECUTABLE变量为ON,此时将生成一个界面程序而不是控制台程序
在这里插入图片描述

1.2 添加Qt模块和生成执行文件

然后是添加库,使用了find_package()函数,官方说明见此处。这里简要说明用法如下:

find_package(Qt5 COMPONENTS Widgets REQUIRED)

首先,要使用find_package()函数,需要提供一个.cmake文件,如何让CMake知道这个文件,可以采用两种办法:

  1. 设置环境变量CMAKE_PREFIX_PATH,值为Qt5安装位置,这是官方Qt-CMake教程中的推荐做法;
  2. 设置CMakeQt5_DIR变量,值为Qt5Config.cmake文件的位置。可以使用Everything搜一下文件位置,笔者这里举例:
    set(Qt5_DIR D:/APPs/Qt/5.14.2/5.14.2/msvc2017_64/lib/cmake/Qt5/)
    

从上方目录可以看出来,这个.cmake文件是不同Qt版本不同编译平台都有一套,所以对于官方推荐做法笔者并不是很推荐,难不成当需要换平台的时候还去改环境变量?👻

另外,其中有几个关键词:

  • REQUIRED:必须找到该库,找不到就报错;
  • COMPONENTS:从库中找子模块,此处找的是Widgets

有一点值得提出的是:在qmake工程中的QT += core widgets语句也是添加模块,这些模块其实就是库文件windows平台可以在Qt安装目录下找到Qt5Core.lib文件,如笔者的目录是:

D:\APPs\Qt\5.14.2\5.14.2\msvc2017_64\lib

最后别忘了将Qt库链接到可执行文件:

target_link_libraries(TestQtCMake Qt5::Widgets)

1.3 其它处理

在官方文档中,还有这么一个小片段:当CMake版本小于3.7.0时,将CMAKE_INCLUDE_CURRENT_DIR变量设置为ON

if(CMAKE_VERSION VERSION_LESS "3.7.0")
      set(CMAKE_INCLUDE_CURRENT_DIR ON)
  endif()

该变量的含义为:CMAKE_CURRENT_SOURCE_DIRCMAKE_CURRENT_BINARY_DIR添加到包含目录中,这对out-of-source编译很有帮助。具体可参考官方说明

笔者的猜想是为了把rcc moc uic的输出文件添加进生成对象。但是为何在CMake版本小于3.7.0才设置,不是很明白。查看CMake官方3.6.33.8.2版本对于该变量的解释也没看出区别来,希望知道的朋友能给个提示~~~👻

1.4 完整CMakeLists

此处贴上在CMake中使用Qt5的完整CMakeLists.txt文件,大家可以看看是否每一句都完全掌握了

# cmake最低要求
cmake_minimum_required( VERSION 3.1.0 )

# 设置moc rcc uic
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)


# 求大家解惑
if(CMAKE_VERSION VERSION_LESS "3.7.0")
    set(CMAKE_INCLUDE_CURRENT_DIR ON)
endif()


# 声明一个项目
project(QtCMakeProject)

# 提供位置定位.cmake文件
set(Qt5_DIR D:/APPs/Qt/5.14.2/5.14.2/msvc2017_64/lib/cmake/Qt5/)

# 查找Qt库
find_package(Qt5 COMPONENTS Widgets REQUIRED)

# 添加可执行文件,注意添加WIN32,否则有一个控制台黑框
add_executable(TestQtCMake
WIN32
src/main.cpp
src/mainwindow.cpp
src/mainwindow.h
src/mainwindow.ui
)

# 链接Qt库
target_link_libraries(TestQtCMake Qt5::Widgets)

总算弄完了,cmake ..之后赶紧跑VS里面编译运行一下试试:
在这里插入图片描述


2. 运行时依赖处理

对于缺少dll文件,处理起来应该是相当熟悉了,可以在环境变量中设置Path,把Qtbin目录添加进来,如笔者此处添加:

D:\APPs\Qt\5.14.2\5.14.2\msvc2017_64\bin

windows平台也可以使用官方的windeployqt工具,它就在上述bin目录下,传入exe文件路径就可以将该exe依赖的Qt文件全部打包到目录下,如一开始目录下的文件:

在这里插入图片描述

右键->在此处打开powershell窗口,输入命令:

D:\APPs\Qt\5.14.2\5.14.2\msvc2017_64\bin\windeployqt.exe .\TestQtCMake.exe

等待1~2s执行结束,目录下变成了:
在这里插入图片描述
这下就可以愉快地运行了,虽然啥也没有……
在这里插入图片描述


3. 小结

要在CMake中使用Qt,需要做以下步骤:

  1. 设置变量CMAKE_AUTO***ON以启用自动rcc uic moc编译器;
  2. 设置变量QT5_DIR变量定位.cmake文件,使用find_package()函数定位Qt的库文件,使用target_link_libraries()函数链接Qt库;
  3. 使用windeployqt工具打包依赖项。

有兴趣可以再参考一下Qt官方教程:Get started with CMake。

后续计划参考笔者的另一篇文章:用于创建CMake-MSVC工程的Python脚本,写个Python脚本来完成本文的工作。


如有错误欢迎指正,共同进步~


  • 27
    点赞
  • 138
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值