最近开始学习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. 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程序的更多相关文章

  1. QT5每日一学(二)编写QT多窗口程序

    一.添加主窗口 1.首先打开Qt Creator,新建Qt Widgets Application,项目名称设置为windows,在类信息界面保持基类为QMainWindow.类名为MainWindo ...

  2. CMake编译Widget UI Qt程序

    自从CMake被引入到KDE项目的编译系统中后,CMake的使用者日益增多,Qt也不例外,除了使用QMAKE编译Qt程序外,也可以使用CMake来编译Qt程序,并且CMake在使用上更灵活,特别是大型 ...

  3. CMake编译Qt程序+UI+Resources

    今天给大家讲解一下Cmake如何编译Qt程序. 这里说的Qt程序不只是用QtCreator写出来的程序,当然也可以是文本编辑器….这里说的Qt程序是指,QCoreApplication,QApplic ...

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

    因项目需要,可能有不同版本的qt程序要运行到同一台机器上,本次实验是qt4.8.5和qt5.3.1开发的程序同时运行在同一台机器上,此机器可以不按照qt的任何版本,当然,两个版本开发的qt与机器的位数 ...

  5. 使用Qt编写服务器端程序(包括Http传输服务器端)的方法

    使用Qt编写客户端的程序的示例或demo较多,但是编写服务器端程序的demo很少.当然,服务器端的程序一般不需要带界面,这点我们可以理解.不过有些时候我们还是需要使用Qt编写一个简单的测试用的服务器代 ...

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

    当我们完成程序设计之后,需要将可执行程序交付客户,而运行环境里面可能是没有相关支持库的,这个时候就涉及到部署的相关问题.对于我们在Linux下基于QT编写的图像处理程序,我们采用linuxdeploy ...

  7. Linux打包免安装的Qt程序(编写导出依赖包的脚本copylib.sh,程序启动脚本MyApp.sh)

    本文介绍如何打包Qt程序,使其在没有安装Qt的系统可以运行. 默认前提:另外一个系统和本系统是同一个系统版本. 1,编写导出依赖包的脚本copylib.sh #!/bin/bash LibDir=$P ...

  8. 编写第一个Qt程序

    http://c.biancheng.net/view/1817.html 学习一种编程语言或编程环境,通常会先编写一个“Hello World”程序.我们也用 Qt Creator 编写一个“Hel ...

  9. 一起学Hadoop——使用IDEA编写第一个MapReduce程序(Java和Python)

    上一篇我们学习了MapReduce的原理,今天我们使用代码来加深对MapReduce原理的理解. wordcount是Hadoop入门的经典例子,我们也不能免俗,也使用这个例子作为学习Hadoop的第 ...

随机推荐

  1. BZOJ 1093 [ZJOI2007]最大半连通子图

    1093: [ZJOI2007]最大半连通子图 Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 1986  Solved: 802[Submit][St ...

  2. BZOJ 1072 [SCOI2007]排列perm

    1072: [SCOI2007]排列perm Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1268  Solved: 782[Submit][Sta ...

  3. VisualSVN_Server安装_配置图文教程

    前言: 不错的文章 对一个我这样的菜鸟来说,这个教程很容易理解,说它图文并茂并不为过.所以就把它整理成了文档,给大家分享. 文章版权归原作者Forrest Zhang所有. 原文出处: http:// ...

  4. 如何在svn系统中使用git

    如果正在使用svn,打算换到git,又暂时不想放弃已有的svn代码库,可以选择git-svn.说一说我自己从svn到git的经验吧. 开始 安装最新版本的git,从git 1.5.3以后支持git-s ...

  5. 根据标点符号分行,StringBuilder的使用;将字符串的每个字符颠倒输出,Reverse的使用

    一:根据标点符号分行,上图,代码很简单 二:代码 using System; using System.Collections.Generic; using System.ComponentModel ...

  6. Search in Rotated Sorted Array II——LeetCode

    Follow up for "Search in Rotated Sorted Array":What if duplicates are allowed? Would this ...

  7. 高效算法——C 分饼

    My birthday is coming up and traditionally I’m serving pie. Not just one pie, no, I have a number N ...

  8. Access denied for user 'root'@'localhost' (using password:YES) 解决方案

    1.打开MySQL目录下的my.ini文件,在文件的最后添加一行“skip-grant-tables”,保存并关闭文件. 2.重启MySQL服务. 3.在命令行中输入“mysql -uroot -p” ...

  9. [LeetCode] 141&142 Linked List Cycle I & II

    Problem: Given a linked list, determine if it has a cycle in it. Follow up:Can you solve it without ...

  10. python多线程机制

    Python中的线程从一开始就是操作系统的原生线程.而Python虚拟机也同样使用一个全局解释器锁(Global Interpreter Lock,GIL)来互斥线程多Python虚拟机的使用. GI ...