译:用CMake构建Qt项目
作者: Johan Thelin  译者:赖敬文
原链接:http://developer.qt.nokia.com/quarterly/view/using_cmake_to_build_qt_projects
翻译来源:http://blog.csdn.net/jingwenlai_scut 
         QtSDK中已经包含了QMake用于处理跨平台的编译问题。然而,还存在其它编译工具,比如autotools,SCons和CMake.这些工具满足不同的需求,比如外部依赖。
        当KDE项目从使用Qt3升级到使用Qt4时,整个项目将构建工具从autotools转而使用CMake.这使得CMake在Qt开发世界中在用户数以及功能支持和质量上占有了特殊的位置。从开发过程来看,QtCreator从1.1开始支持CMake (从1.3开始支持Microsoft的开发工具集).
1.一个基本的例子
           在本文中我们将只关注CMake本身,并且指出如何将它与Qt结合起来。首先,我们看一个简单但典型的基于CMake的项目。从下面的列表可以看出,这个工程包括一些源代码及文本文件。
$ ls
CMakeLists.txt
hellowindow.cpp
hellowindow.h
main.cpp
          最基本的,CMakeLists.txt文件将QMake需要使用到的工程文件替换了。如果需要编译这个工程,可以创建一个build目录,并在其内使用cmake及make来编译。
$ mkdir build
$ cd build
$ cmake .. && make
         创建一个build目录的原因是我们想达到”out-of-source”编译的目的,即我们可以把编译过程中产生的中间文件与源代码隔离开来。当然,用qmake也可以做到这一点,但是需要做额外的一些步骤,但CMake可以很容易得做到这一点。

CMake 正在编译一个基本的项目

CMake中使用的参数代表指CMakeLists.txt文件所在的目录。这个CMakeLists.txt文件控制了整个编译的过程。为了更彻底地理解它,我们用以下这个图来看看整个编译的流程。下面这张图表明用户编写的文件(源代码,头文件,.ui文件,.qrc文件)在编译过程中是如何被Qt的工具进行处理,并整合到整个编译流程中的。因为qmake是用于处理这个流程的,它隐藏了这个流程中的很多细节。

Qt编译系统
         当使用CMake的时候,这些中间过程必须要显式地进行处理。这也就是说,在头文件中如果有使用Q_OBJECT宏的话,则这个文件需要被moc进行处理,.ui文件也必须要由uic处理,.qrc文件需要由rcc程序处理。
在上面的例子中,我们简化了这些步骤,我们只需要处理包含了Q_OBJECT宏的头文件。也就是说,我们需要用moc对helloworld.h文件进行处理。与此工程相对应的CMakeLists.txt文件如下:
                PROJECT(helloworld)
                FIND_PACKAGE(Qt4 REQUIRED)
        上述两句的意思指定义此工程为helloworld,并且让cmake自动去寻找Qt4,下面,我们需要用SET命令把需要定义的头文件与cpp文件等串起来. 
              SET(helloworld_SOURCES main.cpp hellowindow.cpp)
              SET(helloworld_HEADERS hellowindow.h)
为了调用moc程序,需要使用 QT4_WRAP_CPP宏。 定义如下: 
                QT4_WRAP_CPP(helloworld_HEADERS_MOC ${helloworld_HEADERS})
这一步的作用实际上与在命令行中使用
                $moc –o helloworld_moc.h helloworld.h
是类似的,上述的helloworld_HEADERS_MOC只是为了后续使用而取的名字。
          为了编译这个Qt工程,需要包含Qt的库文件目录并且包含一些定义:
                 INCLUDE(${QT_USE_FILE})
                 ADD_DEFINITIONS(${QT_DEFINITIONS})
最后,CMake需要知道最终应用程序的名字以及加入链接库来生成它。这个在cmake中可以很方便地使用ADD_EXECUTABLE 和     TARGET_LINK_LIBRARIES. 因此,在CMakeLists.txt中加入如下:
                       ADD_EXECUTABLE(helloworld ${helloworld_SOURCES} 
                                                              ${helloworld_HEADERS_MOC})
                       TARGET_LINK_LIBRARIES(helloworld ${QT_LIBRARIES})
             重新回顾上述CMakeLists.txt, 你会觉得相对于qmake来说,要多写一些配置,这实际上已经大大简化了,因为cmake并不是如qmake一样专为Qt而使用。
2.加入更多的Qt元素
          从上面的最基本的例子继续,我们再在加入资源文件及UI文件。在上述的例子中增加了hellowindow.ui及images.qrc文件,相应的CMakeLists.txt增加以下的内容:
                                      SET(helloworld_SOURCES main.cpp hellowindow.cpp)
                                      SET(helloworld_HEADERS hellowindow.h)
                                      SET(helloworld_FORMS hellowindow.ui)
                                      SET(helloworld_RESOURCES images.qrc)
.qrc文件及.ui文件通过宏 QT4_WRAP_UI 和 QT4_ADD_RESOURCES进行处理。这些宏与QT4_WRAP_CPP的宏的作用是一样的,实际上都是在编译过程中调用相应的应用程序对其进行处理。即针对.qrc文件通过调用rcc程序对其处理,对.ui文件通过调用uic程序对其处理。对CMakeLists.txt增加内容如下:
                                     QT4_WRAP_CPP(helloworld_HEADERS_MOC ${helloworld_HEADERS})
                                     QT4_WRAP_UI(helloworld_FORMS_HEADERS ${helloworld_FORMS})
                                     QT4_ADD_RESOURCES(helloworld_RESOURCES_RCC ${helloworld_RESOURCES})
同样地,这些中间生成的文件在最终生成应用程序的时候需要用到,因此,add_executable修改如下: 
                                    ADD_EXECUTABLE(helloworld ${helloworld_SOURCES} 
                                    ${helloworld_HEADERS_MOC} 
                                    ${helloworld_FORMS_HEADERS} 
                                    ${helloworld_RESOURCES_RCC})
           在编译之前,还有一个问题要处理,如上所述,我们要进行的是在源代码之外 的编译,因此,这些生成的中间文件都会在build目录下,这样的话,编译器则不能定位由uic程序产生的诸如ui_hellowindow.h等文件。所以,我们需要把build目录添加到包含目录中,如下: 
                                      INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})
加入这一行之后,所以中间生成的文件都会被包含在include路径中。 
3.更多Qt 模块
           目前为止,我们均只依赖于QtCore和QtGui模块。如果需要引用其它模块,cmake需要显式地开启它。通过set命令将特定的模块设置为TRUE则可。例如,如果要在程序中使用OpenGL的支持,则需要在CMakeLists.txt中使用如下这一行:
                                     SET(QT_USE_QTOPENGL TRUE)
其它较常用的模块包括:
                                     QT_USE_QTNETWORK
                                     QT_USE_QTOPENGL
                                     QT_USE_QTSQL
                                     QT_USE_QTXML
                                     QT_USE_QTSVG
                                     QT_USE_QTTEST
                                     QT_USE_QTDBUS
                                     QT_USE_QTSCRIPT
                                     QT_USE_QTWEBKIT
                                     QT_USE_QTXMLPATTERNS
                                     QT_USE_PHONON
此外,还有其它的宏可以用,具体地可参见cmake/share/Modules/FindQt4.cmake 
4.获益与复杂性的平衡
         如上可以看到,使用cmake并不如qmake轻松,但是cmake提供了更多的功能。最显著的获益是cmake支持”out-of-source”编译,这可能会更改使用习惯,但是这样做使得对源代码的版本跟踪变得更加方便。
          同样地,使用cmake的另外一个好处是不只是针对Qt,cmake使得添加额外的库的支持变得更加容易,比如,针对不同的平台,链接不同的库或者是将Qt与其它库一起使用以构建较大型的程序,此时cmake的优势开始显现。
          其它的强大的功能是具有了在一次设置的过程中产生不同版本的应用程序的能力,也就是说,针对一个单一的配置文件,可以产生多种不同的编译过程。 
           Cmake与qmake之间的选择其实很简单,对于只使用Qt的项目,qmake是个很好的先把。而当编译的需求超过了qmake的处理能力或者使用qmake配置变得很复杂时,cmake可以替代它。

http://blog.csdn.net/u013243710/article/details/36005539

用CMake 构建Qt 项目的更多相关文章

  1. 用 cmake 构建Qt工程(对比qmake进行学习)

    cmake vs qmake qmake 是为 Qt 量身打造的,使用起来非常方便 cmake 使用上不如qmake简单直接,但复杂换来的是强大的功能 内置的 out-of source 构建.(目前 ...

  2. mac book pro macOS10.13.3安装qt、qt creator C++开发环境,qt5.11.1,并解决cmake构建:qt mac this file is not part of any project the code

    因为之前在Ubuntu下使用的是qtcreator开发,现在想在mac上装一个系统,因为许久未装了,还是花了点时间,不如写个博客,下次就更快安装了.在Mac OS X下使用Qt开发,需要配置Qt库和编 ...

  3. CMake 构建项目教程-简介

    CMake 构建项目教程-简介 Linux 平台构建项目,选择了CLion作为C++的IDE,而CLion默认就是使用CMake构建项目,所以这里记录了CMake在构建项目过程的一些小知识. 1. 项 ...

  4. 使用VisualStudio2015开发QT项目

    一直习惯用VS,做QT项目时,不停的来回切IDE有些不方便.研究了一下QT的编译. 实际QT编译的机制和cmake是相同的,QT的IDE使用pro文件进行项目管理.QMake通过解析pro工程文件,生 ...

  5. 在 linux 下使用 CMake 构建应用程序

    学习cmake http://xwz.me/wiki/doku.php?id=cmake 碰到的一些问题: 1.You have changed variables that require your ...

  6. 配置CLion管理Qt项目国际化支持

    随着Qt 6的发布,cmake也正式宣告接管qmake的工作了. 在之前的一篇博客里我介绍了如何使用cmake管理你的qt项目,不过有一点我没有讲,那就是对国际化(i18n)的处理. 今天我们就来介绍 ...

  7. 用CMake构建Qt5的Visual Studio工程

    使用Visual Studio构建Qt工程的方法有很多种,可以使用Visual Studio自带的功能手动创建配置工程,也可以创建pro文件,然后通过VS的Qt插件导入进行创建.还有一种方式是通过CM ...

  8. 构建maven项目3

    1.1.创建Jave Project 1.使用mvn archetype:generate命令,如下所示: mvn archetype:generate -DgroupId=com.mycompany ...

  9. 四、使用Maven和使用Eclipse构建javaWeb项目

    环境前边已经搭建过了,我们就再弄了. 1.使用Maven构建javaWeb项目 (1).键入以下命令: $ mvn archetype:generate -DgroupId=com.holytax.w ...

随机推荐

  1. windows - Cygwin和MinGW有什么区别?(MinGW从Cygwin 1.3.3版本中分离出来)

    windows - Cygwin和MinGW有什么区别? 我想让我的C ++项目跨平台,我正在考虑使用Cygwin / MinGW. 但是他们之间有什么区别呢? 另一个问题是,如果没有Cygwin / ...

  2. poj1639 Picnic Planning,K度限制生成树

    题意: 矮人虽小却喜欢乘坐巨大的轿车,车大到能够装下不管多少矮人.某天,N(N≤20)个矮人打算到野外聚餐.为了集中到聚餐地点,矮人A 要么开车到矮人B 家中,留下自己的轿车在矮人B 家,然后乘坐B ...

  3. matlab 图像的保存

    gcf:获取当前显示图像的句柄: 默认 plot 的 position 是 [232 246 560 420] 0. save >> A = randn(3, 4); >> B ...

  4. jQuery怎么选择两个class属性

    Jquery选择多个Class属性: $('.className1,.className2,.className4,.className5')

  5. Win7的diskpart硬盘分区

    Windows7 给硬盘分区有两个特点: 1.默认所有是主分区. 2.会有一个 100MB 大小的隐藏分区,为"系统预留". 假设喜欢折腾计算机,这两个特点会造成非常多麻烦.能不能 ...

  6. 机器学习: 基于MRF和CNN的图像合成

    前面我们介绍了基于卷积神经网络的图像风格迁移,利用一张content image 和 style image,可以让最终的图像既保留content image的基本结构,又能显示一定的style im ...

  7. Android获取屏幕大小

    本来想着如下方法就能得到了 Display display = getWindowManager().getDefaultDisplay(); Log.i("view", &quo ...

  8. WPF模拟Office2010文件菜单的TabControl模板

    原文:WPF模拟Office2010文件菜单的TabControl模板 这是Office2010中的文件菜单点开后的效果.本文我将以强大的WPF(www.itstrike.cn)来实现类似的效果.希望 ...

  9. WPF 3D 平移模型+动画(桥梁检测系统)

    原文:WPF 3D 平移模型+动画(桥梁检测系统) 关于WPF 3D,网上有很多旋转的例子,但是关于平移的例子并不是太多.本文并非WPF 3D扫盲篇,因此需要对WPF 3D有一定了解,至少知道View ...

  10. 移花接木:借助 IViewLocationExpander 更换 ASP.NET Core View Component 视图路径

    端午节在家将一个 asp.net 项目向 asp.net core 迁移时遇到了一个问题,用 view component 取代 Html.RenderAction 之后,运行时 view compo ...