CMake结合Visual Studio中开发Qt应用程序注意事项

Qt工程管理

个人比较偏爱于使用CMake来管理C++工程,因为只要编写一个CMakeLists.txt文件,就可以在Windows和Mac上生成各自的IDE工程。在Windows上, CMake自然是生成Visual Studio工程文件了(新版Visual Studio貌似能直接倒入CMake工程了);Mac上生成XCode工程即可。开发Qt应用程序的时候,虽然有Qt Creator可以使用,甚至Qt Creator还可以直接导入CMake工程,但是其调试和错误提示功能实在太过寒碜,导致调试过程中各种郁闷。因此,本人在实际开发中一般使用CMake来管理Qt工程,然后在Visual Studio里面进行开发编译。一般一个Qt应用程序的CMakeLists文件结构如下:

CMAKE_MINIMUM_REQUIRED(VERSION 3.8)
PROJECT(Test C CXX)

#############################################################################
# Compiler and linker options
ADD_DEFINITIONS(-Wall -DWIN32_LEAN_AND_MEAN) 

SET(CMAKE_AUTOMOC ON)
SET(CMAKE_AUTORCC ON) 
SET(CMAKE_CXX_STANDARD 11) 

FILE(GLOB SOURCE_FILES "${CMAKE_CURRENT_SOURCE_DIR}/*.cpp")
FILE(GLOB HEADER_FILES "${CMAKE_CURRENT_SOURCE_DIR}/*.h") 
FILE(GLOB FORMS "${CMAKE_CURRENT_SOURCE_DIR}/*.ui") 
 
SET(RESOURCES ${CMAKE_CURRENT_SOURCE_DIR}/resources.qrc)  
  
  
#################################################################################
# EXTERNAL LIBS
FIND_PACKAGE(Qt5 COMPONENTS Core Widgets Gui REQUIRED) 
qt5_wrap_ui(UI_HEADERS ${FORMS})

INCLUDE_DIRECTORIES(
${CMAKE_CURRENT_BINARY_DIR}/)

################################################################################
# Compile target
ADD_EXECUTABLE ( ${PROJECT_NAME} 
				${SOURCE_FILES}
				${HEADER_FILES}
				${UI_HEADERS}  
				${RESOURCES}) 
# https://www.kdab.com/using-cmake-with-qt-5/
qt5_use_modules(${PROJECT_NAME} Core Widgets Gui)  

其中,有一点要注意的是“INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}/)。这一行是为了包含UI生成的头文件,否则在编译的时候无法找到UI头文件会报错。

备注

使用CMake生成Qt工程,编译运行的时候需要注意一些事情。如果机器上装了多个版本的Qt库的话,使用CMake生成Qt工程的时候,最容易出错了。CMake在生成工程的时候,会去搜索用户和系统的Path路径,查找系统上安装的Qt库。如果工程编译后,再去修改PATH中的Qt版本路径,会出现一些诡异的现象。像我碰到的一些情况包括:(1)程序启动不起来或者报错“xxx找不到符号入口点”;(2)资源加载不到,典型的特征是使用QRC路径(如“:/style/default.qss”)来加载资源会失败;(3)程序无故崩溃或执行结果不正常。但凡出现了这样一些情况,而恰好工程又是采用CMake管理的,那么就要考虑下Qt库版本是不是混淆了。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏琦小虾的Binary

CMake学习笔记(三)——以笔者的Robosub竞赛为例

CMake学习笔记(三)——以笔者的Robosub竞赛为例 继笔者认真学习了CMake语法之后,便开始尝试自己用CMake将以前用Qt写的软件框架程序改编为CM...

363100
来自专栏编程直播室

Spring Boot 之 Spring Data JPA 三(Specifications)一、首先建立一个Spring Boot 工程二、编写一个实体类来记录数据三、通过接口实现Specifica

52450
来自专栏一个会写诗的程序员的博客

8.1 Spring Boot集成Groovy混合Java开发小结

本章节我们使用SpringBoot集成Groovy混合Java开发一个极简的RestAPI。 数据库使用mysql,ORM层使用mybatis,模板引擎使用fr...

20820
来自专栏JavaNew

Spring Boot实战:Restful API的构建

37180
来自专栏Spring相关

springBoot上传文件时MultipartFile报空问题解决方法

之前用spring MVC,转成spring boot之后发现上传不能用。网上参考说是spring boot已经有CommonsMultipartResolve...

32810
来自专栏服务端技术杂谈

优雅的实现拦截器及统一异常处理

面向所有Controller的方法做拦截,获取Cookie信息 @Aspect@Componentpublic class HomeworkAuthorizeA...

31460
来自专栏Java帮帮-微信公众号-技术文章全总结

高级框架-SpringBoot【悟空教程】

Spring 诞生时是 Java 企业版(Java Enterprise Edition,JEE,也称 J2EE)的轻量级代替品。无需开发重量级的 Enterp...

45820
来自专栏JavaNew

Spring Boot实战:Restful API的构建

19350
来自专栏潇涧技术专栏

Gradle Plugin for Android Development User Guide 1

Gradle Plugin for Android Development User Guide (1)

9230
来自专栏程序猿DD

Spring Boot中使用Flyway来管理数据库版本

久违了的Spring Boot系列,今天抽空更新一篇。之前写过很多篇关于数据访问的文章了,比如下面这些: 使用JdbcTemplate 使用Spring-da...

61390

扫码关注云+社区

领取腾讯云代金券