-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来构建应用程序。也就是可执行文件 |
lib | Makefile构建一个库。 |
subdirs | 包含使用SUBDIRS变量指定的子目录规则的Makefile。每个子目录必须包含自己的项目文件。就是一个项目下可以配置有多个子项目,每个子项目可以相互独立或不独立。 |
vcapp | Visual Studio Project文件来构建应用程序。 |
vclib | Visual Studio项目文件来构建一个库。 |
vcsubdirs | Visual 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