学习用CMake来编写Qt程序

最近开始学习CMake,因为项目需求需要用到Qt,自带的qmake会出现许多问题(比如文件修改之后有时候qmake不会侦测到不会重新编译,需要手动去编译等),于是开始尝试使用CMake来编写Qt程序,顺便学习一下怎么用CMake来使用find_package,也算给自己一次学习的机会。

切入正题,CMake对于一些有名的库都有自带文件夹中Modules里.cmake文件查询的支持,比如你需要编写Qt程序,你就可以去cmake_dir/Moudles/查找 FindQt4.cmake这个文件,里面详细讲述了如果你需要用到Qt库,你需要包含的变量和文件,比如他举出了 QT_USE_FILE 这个变量,你直接include在CMake脚本之后,你就不需要手动的include_diectories等等,同时它也会生成QT_LIBRARIES这个变量让你来target_link,因此省去了很多自己需要逐步查询qmake所在路径和Qt库所在路径的问题。

里面还讲到了比较简单的用法,

find_package(Qt4 4.4.3 REQUIRED QtCore QtGui QtXml)
include(${QT_USE_FILE})
add_executable(myexe main.cpp)
target_link_libraries(myexe ${QT_LIBRARIES})

find_package来查询你需要用到的Qt版本库,之后REQUIRED表示你需要用到Qt中的哪些子库,之后include它生成的文件,link它给你生成的库文件变量,你的Qt简单的Demo就成功了,是不是很简单。

同时我再来讲一下moc的简单用法,Qt的机制它会查询Q_OBJECT这个宏如果你的文件有这个宏,它的qmake会自动去moc一把生成moc_xxx.cpp文件,然后会内部帮你include他们,所在在IDE端Qt Creaotr,我们根本察觉不到这个机制在里面,所以IDE用多了有时候确实察觉不到这些比较底层的机制,用手写部署确实有其好处。回归正题,在CMake中,你如何去实现由qmake帮你做的这些步骤呢?答案有很多,我这里列举一个比较简单的用法,就是给target设置属性--set_target_properties(${target_name}
PROPERTIES ${properties_name} ${properties_value}),CMake给Qt提供了AUTOMOC这个属性,可以自动的给给定target的项目的所有需要moc的文件自动moc,所以这个时候我们只需要加一把set_target_properties(myexe PROPERTIES AUTOMOC ON),这个时候,CMake就会去学qmake的那套逻辑来进行自动moc和编译了。

今天就先讲到这,就算抛砖引玉,让更多的朋友学会用CMake来进行项目的管理和控制,因为有时候过度的依赖IDE确实会影响我们对正确事物的判断,学会自己编辑项目,更能更好的掌握这个项目的文件结构逻辑和开发总体方向,对库和库之间的依赖更能比用IDE更加深刻,这是我学习和尝试使用CMake的初衷,希望朋友们会喜欢这篇文章,同时留下你们的脚印和意见,让我们共同进步,谢谢。

学习用CMake来编写Qt程序,布布扣,bubuko.com

时间: 2024-10-22 11:36:07

学习用CMake来编写Qt程序的相关文章

Linux下同时运行不同版本的qt程序

因项目需要,可能有不同版本的qt程序要运行到同一台机器上,本次实验是qt4.8.5和qt5.3.1开发的程序同时运行在同一台机器上,此机器可以不按照qt的任何版本,当然,两个版本开发的qt与机器的位数必须一样,例如都是32位或者64位. 两个版本的qt的程序我都采用动态编译(静态编译方法请度娘),所以需要把运行程序所需的动态库放到程序可以链接的地方,程序可以链接的动态库路径参见:linux动态库搜索路径.此处直接贴出结论:动态库的搜索路径搜索的先后顺序是: 1.编译目标代码时指定的动态库搜索路径

qtday01 ubuntu 下手动编写第一个qt程序

//qt 5.2.1 //1t目录下 //1t.cpp /* 第一个qt程序 */ #include <QApplication> #include<QtWidgets/QLabel> #include<QString> #include<QTextCodec> int main(int argc,char** argv){ /*构造一个对象*/ QApplication app(argc,argv); QTextCodec* coder=QTextCode

MAC 平台 QT编写iphone程序,“error loading iPhoneSimulatorRemoteClientRun ended unexpectedly”

本日这么多年一直做C++开发,最近要做QT项目,被QT做界面的新特性所吸引.QSS QML的确是亮点. 还有一个就是跨平台这方面,自己玩了玩. 用的QT 的开发包是在官网上下载 qt-opensource-mac-x64-android-ios-5.2.1.dmg 在使用Qt creator写一个hellworld 最后弹出 error loading  iPhoneSimulatorRemoteClientRun ended unexpectedly. 解决办法这里面 https://bugr

linux下对qt编写的程序进行部署

当我们完成程序设计之后,需要将可执行程序交付客户,而运行环境里面可能是没有相关支持库的,这个时候就涉及到部署的相关问题.对于我们在Linux下基于QT编写的图像处理程序,我们采用linuxdeployqt 进行部署,以下是相关注意步骤.我成功的实现了GOQTTemplate在ubuntu16.04上编译,并且在ubuntu18.04上的运行: 1.linuxdeployqt 安装 最简单的方法直接下载编译好的 linuxdeployqt-x86_64.AppImage文件(https://git

编写第一个Qt程序

http://c.biancheng.net/view/1817.html 学习一种编程语言或编程环境,通常会先编写一个“Hello World”程序.我们也用 Qt Creator 编写一个“Hello World”程序,以初步了解 Qt Creator 设计应用程序的基本过程,对使用 Qt Creator 编写 Qt C++ 应用程序建立初步的了解. 新建一个项目 单击 Qt Creator 的菜单项文件->新建文件或项目,出现如图 1 所示的对话框.在这个对话框里选择需要创建的项目或文件的

Qtcreator编写ros程序:无法启动进程&quot;catkin_make&quot; -DCMAKE_BUILD_TYPE=Debug

利用Qtcreator编写ROS程序,你必须先进行相应的配置:在启动qtcreator环境时先把ros环境添加进.(即~/.bashrc文件) 1 版本问题 QT4 与 QT5 sudo    gedit ~/.local/share/applications/DigiaQtOpenSource-qtcreator.desktop     (qt5       默认安装的路径下) 当打开文件是空时,关闭.按照路径打开文件 cd ~/.local/share/applications/ gedit

一个简单的Qt程序分析

本文概要:通过一个简单的Qt程序来介绍Qt程序编写的基本框架与一些Qt程序中常见的概念 #include <QApplication> #include <QPushButton> int main(int argc, char *argv[]) { QApplication app(argc, argv); QPushButton *button = new QPushButton("Quit"); QObject::connect(button, SIGNA

Linux下编译静态MinGW环境,编译windows平台Qt程序(使用MXE)

参考链接: MXE.>大多数程序都是在windows平台下开发的程序.windows 在现实中也是绕不过的一个系统平台,做为受过几年VC,MFC”虐待”的程序员,在做为一个程序员之前是一位Linux重度使用者,受够了MFC之后一直想要找一个框架替换,使用过GTK,wxWidgets,Qt,最后还是Qt用得多一些.我认为程序跨平台应该是一个基本标准,同一份代码不需改动,或者改动极少,放在不同的平台下编译就能使用.不同平台,同样的界面,同样的操作,同样的体验.这里要讲的是我如何在Linux 下开发跨

QT程序在windows下部署发布

转载:http://www.cnblogs.com/Fan_Fan/archive/2010/05/29/1746860.html QT程序在windows下部署发布 以下包括了部分网上收集的,以及qt帮助里的内容(Deploying an Application on Qt/Windows) 首先,打开windows控制台,然后,找到vs安装目录下的bin里,执行 vcvars32.bat 这个脚本.执行完之后,vs需要的所有环境变量就已经设置好了. 我的环境是QT 4.3.3 + mingw