CMake中添加Qt模块的合理方法
https://www.jianshu.com/p/7eeb6f79a275 转载自这里
用CMake来组织的工程中要用Qt首先要设置、找到Qt相关模块。主要是通过find_package
这个CMake命令。但网上很多教程都过时了,或者不够清晰灵活。因为这部分很常用,所以特别用一篇文章把我们目前在生产环境中使用的方法给大家介绍下。
设置Qt库路径
Qt版本很多,我们的开发机上一般也装有多个不同版本的Qt。个人尝试性的项目一般用最新版的Qt,而真正发布的产品一般用的是LTS版本Qt(LTS:Long Term Support,长期支持版本,目前最新的LTS是5.9)。
我们的方法是在系统中添加多个环境变量。例如我电脑上装有4个版本:Qt 5.9.4和Qt5.10.1的32位和64位库。所以有4个环境变量:
环境变量名 | 值 |
---|---|
QTDIR594 | C:\Qt\Qt5.9.4\5.9.4\msvc2015 |
QTDIR594_64 | C:\Qt\Qt5.9.4\5.9.4\msvc2015_64 |
QTDIR5101 | C:\Qt\Qt5.10.1\5.10.1\msvc2015 |
QTDIR5101_64 | C:\Qt\Qt5.10.1\5.10.1\msvc2015_64 |
然后在CMakeLists中添加:
set(CMAKE_PREFIX_PATH $ENV{QTDIR594})
通过在$ENV{}
里选择不同的环境变量就可以切换不同的Qt版本。
查找Qt模块
网上很多CMake查找Qt方法都是过时的Qt4的方法。现在正确的、最新的方法是:
find_package(Qt5 COMPONENTS Core Gui Qml Quick REQUIRED)
Components
后面加的就是这个工程中会用到的Qt模块,例如上面就用到了Core、Gui、Qml、Quick这几个模块,也是一般一个Qt Quick程序必须用到的几个模块。
打开相关自动选项
Qt Quick程序中的QRC资源文件需要用rcc来进行预处理,生成相应.h
和.cpp
文件。QObject
派生的C++类也需要通过moc进行处理。这些都是编译系统中所谓的Rules。CMake中通过打开下面两个选项可以自动对这些后缀的文件进行相应处理:
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
由于生成的C++文件都是放在编译目录里的(在Shadow Building中有别于源码目录),所以还需要将编译目录包含到Include目录,否则编译器会找不到这些头文件:
set(CMAKE_INCLUDE_CURRENT_DIR ON)
链接时设置相应模块
最后一步是在链接的时候把用到的Qt库写上去:
target_link_libraries(${PROJECT_NAME} Qt5::Core Qt5::Gui Qt5::Qml Qt5::Quick)
这样就能链接上用到的Qt库了。
完整的CMake例子
上面只是着重说明了CMake关于添加Qt模块的代码,一个完整的CMake例子肯定不止上面这些。下面就贴出一个完整的例子:
- cmake_policy(VERSION 3.9)
- project(Demo VERSION 0.1)
- cmake_minimum_required(VERSION 3.9)
- set(CMAKE_CXX_STANDARD )
- set(CMAKE_INCLUDE_CURRENT_DIR ON)
- set(CMAKE_AUTOMOC ON)
- set(CMAKE_AUTORCC ON)
- set(CMAKE_PREFIX_PATH $ENV{QTDIR594})
- find_package(Qt5 COMPONENTS Core Gui Qml Quick REQUIRED)
- set(HEADERS
- appglobal.h
- )
- set(SOURCES
- main.cpp
- appglobal.cpp
- )
- set(RESOURCES
- qml.qrc
- )
- set(QMLS
- main.qml
- )
- add_executable(${PROJECT_NAME} ${HEADERS} ${SOURCES} ${RESOURCES} ${QMLS})
- target_link_libraries(${PROJECT_NAME} Qt5::Core Qt5::Gui Qt5::Qml Qt5::Quick)
当需求复杂之后CMake中还会有很多命令,这个以后我们介绍具体技术的时候再讲。
作者:吉米有态度
链接:https://www.jianshu.com/p/7eeb6f79a275
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
- 自己写的例子:
- cmake_minimum_required(VERSION 2.8)
- project(Demo)
- set(CMAKE_PREFIX_PATH /home/qilin64/Qt5.6.0/5.6/)
- set(CMAKE_CXX_STANDARD )
- set(CMAKE_INCLUDE_CURRENT_DIR ON)
- set(CMAKE_AUTOMOC ON)
- set(CMAKE_AUTORCC ON)
- set(CMAKE_AUTOUIC ON)
- file(GLOB_RECURSE SOURCES "*.cpp")
- file(GLOB_RECURSE HEADERS "*.h")
- file(GLOB_RECURSE FORMS "*.ui")
- file(GLOB_RECURSE RESOURCES "*.qrc")
- find_package(Qt5 COMPONENTS Core Gui Qml Quick Widgets REQUIRED)
- add_executable(${PROJECT_NAME} ${SOURCES} ${HEADERS} ${FORMS} ${RESOURCES})
- target_link_libraries(${PROJECT_NAME} Qt5::Core Qt5::Gui Qt5::Qml Qt5::Quick Qt5::Widgets)
- qt的模块介绍
- Qt 基础模块分为以下几个:
- o Qt Core,提供核心的非 GUI 功能,所有模块都需要这个模块。这个模块的类包括了动画框架、定时器、各个容器类、时间日期类、事件、IO、JSON、插件机制、智能指针、图形(矩形、路径等)、线程、XML 等。所有这些类都可以通过 头文件引入。
- o Qt Gui,提供 GUI 程序的基本功能,包括与窗口系统的集成、事件处理、OpenGL 和 OpenGL ES 集成、2D 图像、字体、拖放等。这些类一般由 Qt 用户界面类内部使用,当然也可以用于访问底层的 OpenGL ES 图像 API。Qt Gui 模块提供的是所有图形用户界面程序都需要的通用功能。
- o Qt Multimedia,提供视频、音频、收音机以及摄像头等功能。这些类可以通过 引入,而且需要在 pro 文件中添加 QT += multimedia。
- o Qt Network,提供跨平台的网络功能。这些类可以通过 引入,而且需要在 pro 文件中添加 QT += network。
- o Qt Qml,提供供 QML(一种脚本语言,也提供 JavaScript 的交互机制) 使用的 C++ API。这些类可以通过 引入,而且需要在 pro 文件中添加 QT += qml。
- o Qt Quick,允许在 Qt/C++ 程序中嵌入 Qt Quick(一种基于 Qt 的高度动画的用户界面,适合于移动平台开发)。这些类可以通过 引入,而且需要在 pro 文件中添加 QT += quick。
- o Qt SQL,允许使用 SQL 访问数据库。这些类可以通过 引入,而且需要在 pro 文件中添加 QT += sql。
- o Qt Test,提供 Qt 程序的单元测试功能。这些类可以通过 引入,而且需要在 pro 文件中添加 QT += testlib。
- o Qt Webkit,基于 WebKit2 的实现以及一套全新的 QML API(顺便说一下,Qt 4.8 附带的是 QtWebkit 2.2)。
- Qt 扩展模块则有更多的选择:
- o Qt 3D,提供声明式语法,在 Qt 程序中可以简单地嵌入 3D 图像。Qt 3D 为 Qt Quick 添加了 3D 内容渲染。Qt 3D 提供了 QML 和 C++ 两套 API,用于开发 3D 程序。
- o Qt Bluetooth,提供用于访问蓝牙无线设备的 C++ 和 QML API。
- o Qt Contacts,用于访问地址簿或者联系人数据库的 C++ 和 QML API。
- o Qt Concurrent,封装了底层线程技术的类库,方便开发多线程程序。
- o Qt D-Bus,这是一个仅供 Unix 平台使用的类库,用于利用 D-Bus 协议进行进程间交互。
- o Qt Graphical Effects,提供一系列用于实现图像特效的类,比如模糊、锐化等。
- o Qt Image Formats,支持图片格式的一系列插件,包括 TIFF、MNG、TGA 和 WBMP。
- o Qt JS Backend,该模块没有公开的 API,是 V8 JavaScript 引擎的一个移植。这个模块仅供 QtQml 模块内部使用。
- o Qt Location,提供定位机制、地图和导航技术、位置搜索等功能的 QML 和 C++ API。
- o Qt OpenGL,方便在 Qt 应用程序中使用 OpenGL。该模块仅仅为了程序从 Qt 移植到 Qt 的方便才保留下来,如果你需要在新的 Qt 程序中使用 OpenGL 相关技术,需要使用的是 QtGui 模块中的 QOpenGL。
- o Qt Organizer,使用 QML 和 C++ API 访问组织事件(organizer event)。organizer API 是 Personal Information Management API 的一部分,用于访问 Calendar 信息。通过 Organizer API 可以实现:从日历数据库访问日历时间、导入 iCalendar 事件或者将自己的事件导出到 iCalendar。
- o Qt Print Support,提供对打印功能的支持。
- o Qt Publish and Subscribe,为应用程序提供对项目值的读取、导航、订阅等的功能。
- o Qt Quick ,从 Qt 移植过来的 QtDeclarative 模块,用于提供与 Qt 的兼容。如果你需要开发新的程序,需要使用 QtQuick 模块。
- o Qt Script,提供脚本化机制。这也是为提供与 Qt 的兼容性,如果要使用脚本化支持,请使用 QtQml 模块的 QJS* 类。
- o Qt Script Tools,为使用了 Qt Script 模块的应用程序提供的额外的组件。
- o Qt Sensors,提供访问各类传感器的 QML 和 C++ 接口。
- o Qt Service Framework,提供客户端发现其他设备的服务。Qt Service Framework 为在不同平台上发现、实现和访问服务定义了一套统一的机制。
- o Qt SVG,提供渲染和创建 SVG 文件的功能。
- o Qt System Info,提供一套 API,用于发现系统相关的信息,比如电池使用量、锁屏、硬件特性等。
- o Qt Tools,提供了 Qt 开发的方便工具,包括 Qt CLucene、Qt Designer、Qt Help 以及 Qt UI Tools 。
- o Qt Versit,提供了对 Versit API 的支持。Versit API 是 Personal Information Management API 的一部分,用于 QContacts 和 vCard 以及 QOrganizerItems 和 iCalendar 之间的相互转换。
- o Qt Wayland,仅用于 Linux 平台,用于替代 QWS,包括 Qt Compositor API(server)和 Wayland 平台插件(clients)。
- o Qt WebKit,从 Qt 移植来的基于 WebKit1 和 QWidget 的 API。
- o Qt Widgets,使用 C++ 扩展的 Qt Gui 模块,提供了一些界面组件,比如按钮、单选框等。
- o Qt XML,SAX 和 DOM 的 C++ 实现。该模块已经废除,请使用 QXmlStreamReader/Writer。
- o Qt XML Patterns,提供对 XPath、XQuery、XSLT 和 XML Schema 验证的支持
CMake中添加Qt模块的合理方法的更多相关文章
- 在keil 4中添加stc系列芯片的方法--【sky原创】
在keil 4中添加stc系列芯片的方法: 1.从官网下载uv3.cdb的文件网址是:http://www.stcmcu.com/ 2.下载好后把uv3.cdb文件改成STC.cdb:3. 然后将[S ...
- 在TC(Total Commander)中添加启动Cygwin快捷键的方法
在TC(Total Commander)中添加启动Cygwin快捷键的方法 1.在Cygwin的安装目录下,增加文件tc-cygwin.bat(例如C:\cygwin-177\tc-cygwin.ba ...
- mysql 中添加索引的三种方法
原文:http://www.andyqian.com/2016/04/06/database/mysqleindex/ 在mysql中有多种索引,有普通索引,全文索引,唯一索引,多列索引,小伙伴们可以 ...
- 在SpringMVC中,当Json序列化,反序列化失败的时候,会抛出HttpMessageNotReadableException异常, 当Bean validation失败的时候,会抛出MethodArgumentNotValidException异常,因此,只需要在ExceptionHandler类中添加处理对应异常的方法即可。
在SpringMVC中,当Json序列化,反序列化失败的时候,会抛出HttpMessageNotReadableException异常, 当Bean validation失败的时候,会抛出Method ...
- WebService:asp.net类库中添加WebService引用出现问题解决方法
ylbtech-WebService:asp.net类库中添加WebService引用出现问题解决方法 1.返回顶部 1. 在Web项目内添加WebService的引用是件很简单的事情,今天在类库中添 ...
- fatal error C1010: 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include "StdAfx.h"”? 解决方法
错误描述: fatal error C1010: 在查找预编译头时遇到意外的文件结尾.是否忘记了向源中添加“#include "StdAfx.h"”? 错误分析: 此错误发 ...
- IIS8中添加WCF支持几种方法小结[图文]
方法一 最近在做Silverlight,Windows Phone应用移植到Windows 8平台,在IIS8中测试一些传统WCF服务应用,发现IIS8不支持WCF服务svc请求,后来发现IIS8缺少 ...
- 在Word 2007中添加参考文献及其引用的方法
以前写文章的时候忽略了在文章中添加参考文献及其引用的方式,文章各式显得不太正式,在网上进行了相关搜索,将方法整理如下: 1.将光标停留在需要插入文献的地方[1],选择菜单栏上的"引用 -&g ...
- IIS配置svc(IIS8中添加WCF支持几种方法小结)
方法一 最近在做Silverlight,Windows Phone应用移植到Windows 8平台,在IIS8中测试一些传统WCF服务应用,发现IIS8不支持WCF服务svc请求,后来发现IIS8缺少 ...
随机推荐
- (01)JVM-内存三大核心区域以及分析
package org.burning.sport.jvm; /** * 从JVM调用的角度分析Java程序对内存空间的使用, * 当JVM进程启动的时候,会从类加载器路径中找到包含main方法的入 ...
- 【数组】Minimum Path Sum
题目: Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right w ...
- android学习-Activity和Service的生命周期
详细请跳转原网页Activity和Service的生命周期(图) 不解释,不懂算我输 Activity的生命周期(图) Service的声明周期
- URL编码分析与乱码解决方案
一.问题的由来 URL就是网址,只要上网,就一定会用到. 一般来说,URL只能使用英文字母.阿拉伯数字和某些标点符号,不能使用其他文字和符号.比如,世界上有英文字母的网址"http://ww ...
- OpenStack Identity(Keystone)概述及示例
OpenStack 的验证服务有两个主要功能: 1. 用户管理(租户.用户.权限) 2. Service catalog,管理服务的目录和它们的endpoint. 相关概念 1. User User即 ...
- sql语句中出现笛卡尔乘积 SQL查询入门篇
2014-12-29 凡尘工作室 阅 34985 转 95 本篇文章中,主要说明SQL中的各种连接以及使用范围,以及更进一步的解释关系代数法和关系演算法对在同一条查询的不同思路. 多表连接简介 ...
- portable-net45+win8
<PropertyGroup> <TargetFramework>netcoreapp1.1</TargetFramework> <RuntimeFramew ...
- Java对象的内存(一)
前言 新人一枚,刚刚入门编程不久,各方面都在学习当中,博文有什么错误的地方,希望我们可以多多交流! 最近,在开发App后台过程中,需要将项目部署到云服务器上.而云服务器的内存大小却只有1G.要如何做到 ...
- Swift 函数调用到底写不写参数名
最近真正开始学 Swift,在调用函数的时候遇到一个问题:到底写不写函数名? 我们来看两个个例子: // 1 func test(a: Int, b: Int) ->Int { return a ...
- linux 用vi命令的使用以及vi编辑后的后续保存退出等相关命令的使用
一.首先用vi命令打卡要编辑的文件: 注意:vi命令的使用如下 打开或新建文件,并将光标至于第一行首:[root@centos6 /]# vi /etc/my.cnf 打开文件,并将光标移至最后一行行 ...