Qt扫盲-Qt .pro 文件详情

一、概述

Qt使用的qmake 对 *.pro 项目文件来生成这个Makefile,Qt也是根据 这个 pro 文件内容来构建应用程序、库或插件。通常,我们可以使用一系列声明来指定项目中的资源,这个pro 文件可以为不同的平台和不同环境生成不同的构建结果。
完全是跨平台的。

二、项目文件元素构成

qmake 使用的 项目文件格式 既可以支持简单的构建系统,也可以支持相当复杂的构建系统。

简单项目文件使用直接的声明式风格,定义标准变量来指示项目中使用的源文件和头文件。复杂的项目可以使用控制流结构来微调构建过程。项目文件的元素其实就是一些 变量来把源文件、库包含进来,同时,根据这个项目文件的不同的系统,使用条件构建来控制参与编译或者引用的文件、库之类的。

下面几节描述了项目文件中使用的不同类型的元素。

1. 变量

在项目文件中,变量用于保存字符串列表。在最简单的项目中,这些变量通知qmake要使用的配置选项,或者提供要在构建过程中使用的文件名和路径。

qmake在每个项目文件中查找某些变量,并使用这些变量的内容来确定应该向Makefile写入什么内容

例如,HEADERS和SOURCES变量中的值列表用于告诉qmake与项目文件位于同一目录中的头文件和源文件。

变量也可以在内部用于存储临时值列表,现有的值列表可以被覆盖或扩展为新值。

下面的代码段说明了如何将值列表分配给变量:

HEADERS = mainwindow.h paintwidget.h

变量的值列表扩展如下:

SOURCES = main.cpp mainwindow.cpp \
            paintwidget.cpp
CONFIG += console
  • 注意:第一个赋值只包括与 HEADERS 变量在同一行上指定的值。第二个赋值操作使用反斜杠()跨行分隔SOURCES变量中的值。

CONFIG变量是qmake在生成Makefile时使用的另一个特殊变量。在一般配置中讨论。里面就比如指定 C++语言版本,C++11、C++14等。还有一些其他的属性。

下表列出了一些常用变量并描述了它们的内容。有关变量及其描述的完整列表,请参见变量。

变量内容
CONFIG一般项目配置选项。
DESTDIR将放置可执行文件或二进制文件的目录。
FORMS用户界面编译器(uic)要处理的UI文件列表。
HEADERS构建项目时使用的头文件(.h)的文件名列表。
QT项目中使用的Qt模块列表。
RESOURCES要包含在最终项目中的资源(.qrc)文件列表。有关这些文件的更多信息,请参阅Qt资源系统。
SOURCES在构建项目时使用的源代码文件列表。
TEMPLATE用于项目的模板。这决定了构建过程的输出是应用程序、库还是插件。

变量的内容可以通过在变量名前加上$$来读取。这可以用来将一个变量的内容赋值给另一个变量:

TEMP_SOURCES = $$SOURCES

$$操作符广泛用于对字符串和值列表进行操作的内置函数。有关更多信息,请参阅qmake Language。

2. 空格

通常,空格分隔变量赋值中的值。要指定包含空格的值,必须将值括在双引号中:

DEST = "Program Files"

引用的文本被视为变量所持有的值列表中的单个项。类似的方法用于处理包含空格的路径,特别是在为Windows平台定义INCLUDEPATH和LIBS变量时:

win32:INCLUDEPATH += "C:/mylibs/extra headers"
unix:INCLUDEPATH += "/home/user/extra headers"

3. 注释

您可以向项目文件添加注释。注释以#字符开始,一直到同一行的末尾。例如:

# Comments usually start at the beginning of a line, but they
# can also follow other content on the same line.

要在变量赋值中包含#字符,必须使用内置LITERAL_HASH变量的内容。

4. 内置函数和控制流

Qmake提供了许多内置函数来处理变量的内容。在简单的项目文件中最常用的函数是include()函数,它以文件名作为参数。给定文件的内容包含在项目文件中使用include函数的位置。这个也经常用到,就是在项目很大的时候,需要划分模块,就需要使用这个 include 变量。

include函数最常用来包含其他项目文件:

include(other.pro)

对条件结构的支持通过作用域提供,作用域的行为类似于编程语言中的if语句:

win32 {
      SOURCES += paintwidget_win.cpp
}

大括号内的赋值只在条件为真时才执行。在这种情况下,必须设置win32 CONFIG选项。这在Windows上自动发生。开括号必须与条件在同一行。

内置函数如 find()、unique() 和 count() 提供了通常需要循环的更复杂的变量操作。提供这些函数和许多其他函数来操作字符串和路径、支持用户输入和调用外部工具。有关使用这些函数的更多信息,请参阅qmake Language。有关所有函数及其描述的列表,请参见替换函数和测试函数。

二、项目模板

其实就是在 pro 文件里指的是

TEMPLATE = app 
# 这个生成的是一个可执行文件

TEMPLATE变量用于定义将要构建的项目类型。如果在项目文件中没有声明这一点,qmake假设应该构建一个应用程序,并将为该目的生成一个适当的Makefile(或等效文件)。
下表总结了可用的项目类型,并描述了qmake将为每个项目生成的文件:

模板qmake输出
app(默认)Makefile来构建应用程序。也就是可执行文件
libMakefile构建一个库。
subdirs包含使用SUBDIRS变量指定的子目录规则的Makefile。每个子目录必须包含自己的项目文件。就是一个项目下可以配置有多个子项目,每个子项目可以相互独立或不独立。
vcappVisual Studio Project文件来构建应用程序。
vclibVisual Studio项目文件来构建一个库。
vcsubdirsVisual Studio解决方案文件在子目录中构建项目。

有关如何为使用app和lib模板的项目编写项目文件的建议,请参阅构建通用项目类型。
当使用subdirs模板时,qmake生成一个Makefile来检查每个指定的子目录,处理它在那里找到的任何项目文件,并在新创建的Makefile上运行平台的make工具。SUBDIRS变量用于包含要处理的所有子目录的列表。

三、常规配置

CONFIG变量指定项目应该配置的选项和特性。

项目可以在发布模式或调试模式下构建,或者两者都可以。如果同时指定 debug 和 release,则最后一个生效。如果您指定 debug_and_release 选项来构建项目的调试版本和发布版本,那么 qmake 生成的 Makefile 将包含一个构建两个版本的规则。它可以通过以下方式调用:

make all

在CONFIG变量中添加 build_all 选项使此规则成为构建项目时的默认规则。
注意:CONFIG变量中指定的每个选项也可以用作作用域条件。您可以使用内置的CONFIG()函数测试某些配置选项的存在。例如,下面几行将函数显示为作用域中的条件,以测试是否只有opengl选项在使用:

CONFIG(opengl) {
      message(Building with OpenGL support.)
  } else {
      message(OpenGL support is not available.)
}

这使得可以为发布和调试版本定义不同的配置。

以下选项定义要构建的项目类型。
注意:其中一些选项仅在相关平台上使用时生效。

选项描述
qt该项目是一个Qt应用程序,应该链接到Qt库。您可以使用QT变量来控制应用程序所需的任何其他QT模块。这个值是默认添加的,但是您可以删除它,以便在非qt项目中使用qmake。
x11该项目是一个X11应用程序或库。如果目标使用Qt,则不需要此值。

应用程序和库项目模板为您提供了更专门的配置选项,以优化构建过程。在使用的时候,写法要注意,CONFIG 的值都是Qt 有默认值,就像一个开关,需要自己手动开启。

例如,如果你的应用程序使用Qt库,并且你想在调试模式下构建它,你的项目文件将包含以下行:

CONFIG += qt debug

注意:必须使用“+=”,而不是“=”,否则qmake将无法使用Qt的配置来确定您的项目所需的设置。

用 = 的话就会覆盖之前的值,和Linux的系统变量一样的不能直接覆盖,只能追加。

四、引入Qt自带库

如果CONFIG变量包含qt值,则qmake对qt应用程序的支持是启用的。

这使得您可以对应用程序使用的Qt模块进行微调。这是通过QT变量实现的,该变量可用于声明所需的扩展模块。

例如,我们可以通过以下方式启用XML和网络模块:

QT += network xml

注意:QT默认包含core模块和gui模块,因此上面的声明将网络模块和XML模块添加到默认列表中。

下面的赋值省略了默认模块,在编译应用程序源代码时将导致错误:

QT = network xml # 这个core gui 模块就被覆盖了,这个QT 变量只有 network xml 这矿工模块

如果你想要构建一个没有gui模块的项目,你需要用"-="操作符排除它。默认情况下,QT包含了core和gui,所以下面这行代码会生成一个最小的QT项目:

QT -= gui # 只有 core module 被使用.

有关可添加到Qt变量的Qt模块列表,请参见Qt。

五、引用其他第三方库库

如果您在项目中使用Qt提供的库之外的其他库,则需要在项目文件中指定它们。
qmake搜索库和要链接的特定库的路径可以添加到LIBS变量的值列表中。您可以指定库的路径,也可以使用unix风格的符号来指定库和路径。

例如,下面几行显示了如何指定库:

LIBS += -L/usr/local/lib -lmath

也可以使用 INCLUDEPATH 变量以类似的方式指定包含头文件的路径。

例如,添加几个头文件搜索路径:

INCLUDEPATH = c:/msdev/include d:/stl/include
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

太阳风暴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值