沐鸣娱乐


        从零开始学Qt – 13 :一文读懂Qt项目管理文件

        从零开始学Qt - 13:一文读懂Qt项目管理文件

        默认情况下,每个Qt项目都包含一个后缀名为.pro、名称和项目名相同的文件,我们通常称它为项目管理文件或者工程管理文件(简称项目文件)。

        项目文件包含由qmake构建应用程序 、库或插件所需的所有信息。对于复杂的项目,一个项目中可能包含上百个源文件,Qt编译这些源文件的方法是 :先由qmake工具根据pro文件记录的配置信息生成相应的makefile文件,然后执行make命令完成对整个项目的编译 。也就是说,pro文件存储的配置信息是用来告知编译器如何编译当前项目的,所以一个Qt项目要想完美运行,既要保证各个源文件中程序的正确性 ,还要保证项目文件中配置信息的合理性。

        对于一个刚刚创建好的Qt项目,pro文件并不是空的,而是包含一些基本的配置信息。实际开发中,Qt会自动修改pro文件的内容,但有时也需要我们手动修改,例如程序中用到某个第三方库时,就需要我们手动修改pro文件 。

        本文为大家详细地讲解pro文件中各个配置信息的含义,以便于在需要时手动修改pro文件。

        一、项目文件的要素

        qmake所使用的项目文件格式可用于支持简单和相当复杂的构建系统(build system) 。简单的项目文件使用一种直接的声明样式,通过定义标准变量来指定项目中使用的源文件和头文件。复杂的项目可以使用控制流结构(control flow structure)来微调构建过程 。

        (1)变量

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

        qmake在每个项目文件中查找这些变量,并使用这些内容来确定应该写入Makefile的内容。例如 ,HEADERS和SOURCES中的值表示与项目管理文件在同一目录中的头文件和源文件 。

        变量还可以在文件内部用于存储临时的值列表,并且现有的值列表可以用新的值进行覆盖或扩展。

        下面的语句说明了如何将值赋值给变量:

        HEADERS = mainwindow.h paintwidget.hSOURCES = main.cpp mainwindow.cpp paintwidget.cpp

        变量中的值通过以下方式进行扩展:

        CONFIG = console

        下表列出了一些常用的变量,并对其进行了简要描述。本文后面会对一些变量进行专门介绍。

        变量

        说明

        CONFIG

        一般项目配置选项

        DESTDIR

        指定生成的应用程序放置的目录

        TARGET

        指定目标文件名。如果不设置 ,目标名会被自动设置为跟项目文件一样的名称。

        FORMS

        用户界面编译器(uic)要处理的UI文件列表

        UI_DIR

        指定uic命令将.ui文件转化成ui_*.h文件的存放的目录

        HEADERS

        构建项目时使用的头(.h)文件的文件名列表

        QT

        在项目中使用的Qt模块的列表

        RESOURCES

        要包含在最终项目中的资源文件(.qrc)的列表

        RCC_DIR

        指定rcc命令将.qrc文件转换成qrc_*.h文件的存放目录

        SOURCES

        构建项目时要使用的源代码文件列表

        TEMPLATE

        要用于该项目的模板。这个决定了构建进程的输出是应用程序 、库还是插件 。

        INCLUDEPATH

        头文件包含路径

        OBJECTS_DIR

        指定目标文件(obj)的存放目录

        MOC_DIR

        指定moc命令将含Q_OBJECT的头文件转换成标准.h文件的存放目录

        DEPENDPATH

        程序编译时依赖的相关路径

        CODECFORSRC

        源文件编码方式

        LIBS

        引入的lib文件的路径

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

        TEMP_SOURCES = $$SOURCES

        $$操作符被广泛地用于对字符串和值列表进行操作的内置函数。

        (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(other.pro)

        对条件语句的支持是通过类似编程语言中的if语句的范围(scopes)提供的 :

        win32 { SOURCES = paintwidget_win.cpp}

        只有当条件为真时,才会进行大括号内的赋值操作。在上面的语句中 ,必须将CONFIG设置为win32,才会执行SOURCES赋值,这在Windows上是自动进行的。第一个括号{必须与条件在同一行。

        对于需要进行循环操作的变量,通常使用内置函数:find()、unique()和count()等等。这些函数可以用于操作字符串和路径、支持用户输入和调用外部工具。有关使用这些函数的更多信息,请参见qmake语言 。

        二 、项目模板(TEMPLATE变量

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

        模板

        qmake输出

        app (缺省)

        构建应用程序的Makefile

        lib

        构建库(library)的Makefile

        aux

        不构建任何东西的Makefile。如果不需要调用编译器来创建目标,则可以使用此方法 。

        subdirs

        生成makefile文件编译subdirs指定的子文件夹

        vcapp

        建立一个应用程序的VisualStudio项目文件

        vclib

        建立一个库的VisualStudio项目文件

        vcsubdirs

        VisualStudio解决方案文件,用于在子目录中构建项目

        当使用subdirs 模板时,qmake生成一个Makefile来检查每个指定的子目录,处理子目录中包含的任何项目文件 ,并在新创建的Makefile上运行平台的make工具 。SUBDIRS 变量用于包含要处理的所有子目录的列表。

        三、CONFIG变量

        指定项目配置和编译器选项。这些值可以被qmake在内部识别,部分选项的说明如下。

        标识名称

        说明

        release

        应用程序将以release模式生成 。如果“debug”被指定,它将被忽略

        debug

        应用程序将以debug模式生成

        warn_on

        编译器会输出尽可能多的警告信息。如果“warn_off”被指定,它将被忽略。

        warn_off

        编译器会输出尽可能少的警告信息。

        qt

        应用程序是一个Qt应用程序,并且Qt库将会被链接。

        thread

        应用程序是一个多线程的应用程序

        windows

        只用于“app”模板:应用程序是一个Windows下的窗口应用程序

        console

        只用于“app”模板 :应用程序是一个Windows下的控制台应用程序

        dll

        只用于“lib”模板:库是一个共享库(dll)

        staticlib

        只用于“lib”模板:库是一个静态库

        plugin

        只用于“lib”模板:库是一个插件 ,这将会使dll选项生效

        四、声明Qt库(QT变量)

        通过QT变量,可以声明所需的扩展模块 。例如 ,我们可以通过以下方式启用XML和网络模块:

        QT = network xml

        注意:默认情况下,QT包括core和gui模块 ,所以上面的声明将network和XML模块添加到这个默认列表中。以下赋值省略了默认模块 ,这将在编译程序时出现错误 :

        QT = network xml # 这将忽略core和gui模块

        如果您想构建一个没有gui模块的项目,那么需要使用“-=”操作符来排除它。默认情况下,QT同时包含core和gui ,所以下面这一行将导致构建一个最小的QT项目:

        QT -= gui # 只包含了core模块

        五 、声明其他库

        如果除了使用Qt提供的库之外,还在项目中使用其他库,则需要在项目文件中指定它们 。通过LIBS变量,可以指定qmake要搜索的库和要链接的特定库的路径 。例如 ,

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

        包含头文件的路径也可以使用INCLUDEPATH 变量以类似的方式指定。 例如 ,要添加多个要搜索头文件的路径:

        INCLUDEPATH = c:/msdev/include d:/stl/include

        更具体的项目文件信息,可以参考Qt的帮助文件 。

        觉得有用的话 ,希望大家多多关注评论转发[赞],谢谢!

        相关新闻

        联系我们
        联系我们
        分享本页
        返回顶部

          XML地图