使用CMake构建Qt5工程

本文详细介绍如何使用CMake构建Qt工程,包括全局控制、目标控制及单个文件控制三种方法,适合不同需求的项目构建。

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

如何使用CMake构建Qt工程,CMake和Qt各自的帮助文档上均提供了一些方法,下面对这些方法进行简单描述:

文件目录如下:(是不是很熟悉,用QT Creator新建一个 Qt Widgets Application,然后一路Next到头。)
|   CMakeLists.txt
|   main.cpp
|   mainwindow.cpp
|   mainwindow.h
|   mainwindow.ui

QT使用一系列绑定工具辅助生成代码。如:moc(Meta-Object Compiler)用于元对象代码生成,适用于*.h,*.cpp文件,uic(User Interface Compiler)用于Widget布局生成,适用于*.ui文件,rcc(Resource Compiler)用于虚拟文件系统内容生成, 适用于*.qrc文件。当使用QT官方IDE(QT Creator)构建项目时,IDE会自动调用这些工具。
当使用CMake生成QT工程时,所需做的事情就是告诉CMake哪些文件需要用使用Qt 辅助工具进行生成。

注意:以下 使用 CMake 3.11, Qt 5.9测试。更低版本没有测试过,可能存在问题!!!

方法一、全局控制



cmake_minimum_required(VERSION 2.8.11 FATAL_ERROR)

set(project_name TestWindow)

project(${project_name})

#打开全局moc
set(CMAKE_AUTOMOC ON)
#打开全局uic
set(CMAKE_AUTOUIC ON)
#打开全局rcc,本示例中没有使用qrc,此句可以去掉
set(CMAKE_AUTORCC ON)

find_package(Qt5 REQUIRED Widgets)

set(target_name mainwindow)
add_executable(${target_name} main.cpp mainwindow.cpp mainwindow.h mainwindow.ui)
target_link_libraries(${target_name} Qt5::Widgets)



该方法 从CMake全局入手控制文件生成,最多只需三句话。非常简便!


方法二、目标控制


cmake_minimum_required(VERSION 2.8.11 FATAL_ERROR)

set(project_name TestWindow)

project(${project_name})

find_package(Qt5 REQUIRED Widgets)

set(target_name mainwindow)
add_executable(${target_name} main.cpp mainwindow.cpp mainwindow.h mainwindow.ui)
target_link_libraries(${target_name} Qt5::Widgets)

#设置目标关联的*.h, *.cpp 使用 Qt moc进行编译 
set_target_properties(${target_name} PROPERTIES AUTOMOC ON)
#设置目标关联的*.ui 使用 Qt uic进行编译
set_target_properties(${target_name} PROPERTIES AUTOUIC ON)

#跳过不需要使用moc编译的文件。如果觉得麻烦此句可以不写,automoc能根据*.h,*.cpp代码里面的宏(Q_OBJECT;Q_GADGET;Q_NAMESPACE)自动判断是否需要使用moc
set_source_files_properties(main.cpp PROPERTIES SKIP_AUTOMOC ON)



使用该方法,从目标(可执行或者库)入手控制文件生成,可控力度更细一些。


上述两种方法:

使用CMake官方Auto方法生成的VS工程,主要会修改三个地方:
  1)会将一个mocs_compilation.cpp添加到工程里面
  2)【附件包含路径】中会添加一句TestWindow_autogen\include_xxx
  3)【预先生成事件】中会添加预处理命令,源文件修改后会自动重新生成moc_xxx.cpp文件


方法三、单个文件控制

cmake_minimum_required(VERSION 2.8.11 FATAL_ERROR)

set(project_name TestWindow)

project(${project_name})

set(target_name mainWindow)

find_package(Qt5 REQUIRED Widgets)

#包含当前路径,使用*.ui文件时,需要加上这句,否则找不到头文件
set(CMAKE_INCLUDE_CURRENT_DIR ON)

#需要生成的moc文件,输出文件名称放在变量 mocfiles中,必须在find QT5 package才能调用
qt5_wrap_cpp(mocfiles mainwindow.h)
source_group("moc" FILES ${mocfiles})

#需要生成的ui文件,必须在find QT5 package才能调用
qt5_wrap_ui(uifiles mainwindow.ui)

#添加生成的moc文件到目标中
add_executable(${target_name} main.cpp mainwindow.cpp mainwindow.h mainwindow.ui ${mocfiles})
target_link_libraries(${target_name} Qt5::Widgets)


该方法从 源文件 入手控制文件生成,要稍微麻烦一些。

   CMake生成VS工程后,将mainwindow.ui的预处理命令放在mainwindow.ui属性配置中,而mainwindow.h的预处理命令放在CMake Rules/moc_mainwindow.cpp.rule的属性配置中。源文件修改后,目标文件会自动生成。

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值