QMake

QMake是用来读取项目文件并生成编译文件的工具。项目文件记录了你的项目配置,扩展依赖库和源代码文件。最简单包含一个源代码文件的项目可能像这样:

  1. // myproject.pro
  2. SOURCES += main.cpp

我们编译了一个基于项目文件名称myproject的可执行程序。这个编译将只包含main.cpp源文件。默认情况下我们会为项目添加QtCore和QtGui模块。如果我们的项目是一个QML应用程序,我们需要添加QtQuick和QtQml到这个链表中:

  1. // myproject.pro
  2. QT += qml quick
  3. SOURCES += main.cpp

现在编译文件知道与Qt的QtQml和QtQuick模块链接。QMake使用=+=` and ``-=来指定,添加和移除选项链表中的元素。例如一个只有控制台的编译将不会依赖UI,你需要移除QtGui模块:

  1. // myproject.pro
  2. QT -= gui
  3. SOURCES += main.cpp

当你期望编译一个库来替代一个应用程序时,你需要改变编译模板:

  1. // myproject.pro
  2. TEMPLATE = lib
  3. QT -= gui
  4. HEADERS += utils.h
  5. SOURCES += utils.cpp

现在项目将使用utils.h头文件和utils.cpp文件编译为一个没有UI依赖的库。库的格式依赖于你当前编译项目所用的操作系统。

通常将会有更加复杂的配置并且需要编译个项目配置。qmake提供了subdirs模板。假设我们有一个mylib和一个myapp项目。我们的配置可能如下:

  1. my.pro
  2. mylib/mylib.pro
  3. mylib/utils.h
  4. mylib/utils.cpp
  5. myapp/myapp.pro
  6. myapp/main.cpp

我们已经知道了如何使用Mylib.pro和myapp.pro。my.pro作为一个包含项目文件配置如下:

  1. // my.pro
  2. TEMPLATE = subdirs
  3. subdirs = mylib \
  4. myapp
  5. myapp.depends = mylib

在项目文件中声明包含两个子项目mylibmyappmyapp依赖于mylib。当你使用qmake为这个项目文件生成编译文件时,将会在每个项目文件对应的文件夹下生成一个编译文件。当你使用my.pro文件的makefile编译时,所有的子项目也会编译。

有时你需要基于你的配置在不同的平台上做不同的事情。qmake推荐使用域的概念来处理它。当一个配置选项设置为true时使一个域生效。

例如使用unix指定utils的实现可以像这样:

  1. unix {
  2. SOURCES += utils_unix.cpp
  3. } else {
  4. SOURCES += utils.cpp
  5. }

这表示如果CONFIG变量包含了unix配置将使用对应域下的文件路径,否则使用其它的文件路径。一个典型的例子,移除mac下的应用绑定:

  1. macx {
  2. CONFIG -= app_bundle
  3. }

这将在mac下创建的应用程序不再是一个.app文件夹而是创建一个应用程序替换它。

基于QMake的项目通常在你开始编写Qt应用程序最好的选择。但是也有一些其它的选择。它们各有优势。我们将在下一小节中简短的讨论其它的选择。

引用

QMake Manual - qmake手册目录。

QMake Language - 赋值,域和相关语法

QMake Variables - TEMPLATE,CONFIG,QT等变量解释