美文网首页程序员QT读书
QT之proc工程文件详解

QT之proc工程文件详解

作者: konishi5202 | 来源:发表于2019-03-24 00:33 被阅读3次

    一、简介

    *.pro文件是Qt在创建项目时生成的项目文件,它支持跨平台。*.pro格式文件包含的内容有临时工程文件、源代码文件、项目库文件等。在QT中,有一个工具qmake可以生成一个Makefile文件,它就是由*.pro文件生成而来的。下面详细介绍*.pro文件的写法。

    使用过Linux下的Makefile的人都知道,Makefile中的赋值运算符有如下四个:

    =
    :=
    +=
    ?=
    

    其区别如下:

    • = :最基本的赋值,前面变量的值将会是整个Makefile展开后的最终值;
    • := : 覆盖之前的值,前面变量的值取决于“:=”语句所在Makefile中的位置;
    • += : 添加等号后面的值;
    • ?= : 如果没有被赋值过就赋予等号后面的值。

    对于本文将要介绍的*.pro文件而言,常用的是“=”和“+=”两个。一般而言,“=”使用在变量第一次定义的时候,而“+=”使用在前面已经定义了该变量,当前只是对其进行拓展。*.pro中很多的变量是系统中使用的环境变量,因此本文推荐使用“+=”。

    如果要移除某个设置或者源码,可以使用“-=”。

    下面我将*.pro的内容分为注释、模板参数、路径参数、文件参数、配置参数、变量的使用等几个方面进行介绍。

    二、注释

    在*.pro文件中,注释都是从#开始,一直到本行结束。*.pro中没有多行注释的方法。

    三、模板参数

    模版变量告诉qmake为这个应用程序生成哪种Makefile,其定义格式如下:

    TEMPLATE = app
    

    下面是可供使用的模版选择:

    • app :建立一个应用程序的Makefile,这是默认值;
    • lib : 建立一个库的Makefile;
    • vcapp : 建立一个应用程序的VisualStudio项目文件;
    • vclib : 建立一个库的VisualStudio项目文件;
    • subdirs : 这是一个特殊的模版,它可以创建一个能够进入特定目录并且为一个项目文件生成Makefile并且为它调用make的Makefile。

    其中app和lib对应到类Linux操作系统,而vcapp和vclib对应到Windows系统。

    四、路径参数

    通过*.pro文件,我们将我们的源码文件、头文件、资源文件等分类、分模块进行存放,只需要根据项目的具体情况,配置对应的路径信息即可;同时还可以配置使目标文件、中间文件、生成的可执行文件的存放到指定的路径。

    4.1 指定应用程序存放路径

    DESTDIR变量用于指定整个工程编译之后,生成的可执行程序所存放的路径,格式如下:

    DESTDIR += ./bin
    

    当然,对于开发阶段和发布阶段,我们也可以指定不同的存放路径,方法如下:

    Debug:DESTDIR += ./dbg_bin
    Release:DESTDIR += ./rls_bin
    

    4.2 指定目标文件存放路径

    通过OBJECTS_DIR变量,我们可以指定C++源码编译生成的目标文件(obj)存放的路径:

    OBJECTS_DIR += ./Obj
    

    4.3 指定ui_*.h文件存放路径

    通过UI_DID变量,我们可以指定uic命令处理*.ui文件生成的ui_*.h文件的存放路径:

    UI_DIR += forms
    

    4.4 指定qrc_*.h文件存放路径

    通过RCC_DIR变量,我们可以指定rcc命令处理*.qrc文件生成的qrc_*.h文件的存放路径:

    RCC_DIR += ./tmp
    

    4.5 指定Q_OBJECT文件存放路径

    所谓的Q_OBJECT文件,是指含有Q_OBJECT的头文件经过moc命令处理之后的文件。通过MOC_DIR变量可以指定其存放路径:

    MOC_DIR += ./tmp
    

    MOC_DIR用于指定moc命令将含有Q_OBJECT的头文件转换成标准的*.h文件的存放路径。

    4.6 指定编译时的依赖路径

    DEPENDPATH += . forms include qrc sources
    

    DEPENDPATH用于指定程序编译时,所依赖库的路径地址,路径之间使用空格隔开。

    4.7 指定程序包含的头文件路径

    INCLUDEPATH += . include
    

    INCLUDEPATH用于指定程序编译时,编译器搜索头文件的路径。

    五、文件参数

    通过*.pro文件,我们可以动态添加程序源码文件、头文件,资源文件等,也可以动态添加一个模块到工程;同时还可以指定源码文件的编码方式,指定依赖的库文件,指定生成的目标文件等。

    5.1 指定C++程序源文件

    通过SOURCES变量可以指定C++实现源文件:

    SOURCES = *.cpp
    SOURCES += *.cpp
    

    若有多个源文件,则使用空格分开,如:

    SOURCES = 1.cpp 2.cpp 3.cpp。
    

    或者每一个文件被列在一个分开的行里面,通过反斜线另起一行,比如:

    SOURCES = 1.cpp \
            2.cpp \
            3.cpp
    

    或者繁琐的单独地列出每一个文件,比如:

    SOURCES = 1.cpp
    SOURCES += 2.cpp
    SOURCES += 3.cpp
    

    5.2 指定C++程序头文件

    头文件通过HEADERS变量指定C++头文件:

    HEADERS = *.h
    HEADERS += *.H
    

    列出源文件的任何一个方法对头文件也都适用。

    5.3 指定源码文件编码方式

    CODECFORSRC = GBK
    

    CODECFORSRC变量可以指定源码中字符串的编码方式。

    5.4 指定*.ui设计文件

    FORMS += forms/painter.ui
    

    FORMS变量用于指定工程中包含的*.ui设计文件。指定需要uic处理的*.ui文件。

    5.5 指定*.icns设计文件

    RC_FILE += xxx.icns
    

    RESOURCES用于指定工程中包含的*.icns设计文件。

    5.6 指定*.qrc资源文件

    RESOURCES += qrc/painter.qrc
    

    RESOURCES用于指定工程中包含的资源文件,即指定需要rcc处理的*.qrc文件。

    5.7 指定编译时依赖的库文件

    LIBS += -lmath -lpthread -l*
    

    LIBS用于指定编译工程时要链接的库文件,可以在其中加入-L指定库文件的路径。针对调试版本和发布版本,有不同依赖库的,可以使用如下方法进行区分:

    Release:LIBS += -L folderPath  //release版本引入的lib文件路径
    Debug:LIBS += -L folderPath   //debug版本引入的lib文件路径
    

    5.8 指定生成目标文件名

    TARGET = filename
    

    TARGET用于指定生成的应用程序的名称。如果不设置该条目,目标名会被自动设置为跟项目文件一样的名称。

    六、配置参数

    6.1 配置参数

    CONFIG用来告诉qmake关于应用程序的配置信息,包括工程配置和编译参数,以下是常用的工程配置和编译参数:

    • qt :告诉qmake这个应用程序是使用Qt来连接编译的;这也就是说qmake在连接和为编译添加所需的包含路径的时候会考虑到Qt库;
    • debug : 编译有调试信息的可执行文件或者库文件;
    • release : 编译不具有调试信息的可执行文件或者库文件,如果同时指定debug release时,只有debug有效;
    • warn_on :告诉qmake要把编译器设置为输出警告信息的;
    • warn_off :关闭大量的警告信息,默认是打开的;
    • dll : 动态编译库;
    • staticlib :静态编译库;
    • plugin : 编译一个插件;
    • console : 应用程序需要写控制台。

    我们常用的CONFIG变量为:

    CONFIG += qt warn_on release
    

    或者定义为:

    CONFIG = qt
    CONFIG += release
    CONFIG += warn_off
    

    6.2 编译参数

    我们也可以通过DEFINES参数,定义预编译器的编译选项,从而在*.h和*.cpp文件中通过#ifdefine或#ifndef更改程序的编译方式。比如:

    DEFINES += DIALOG_H
    

    这将在对应的dialog.h/cpp文件中被使用,比如将dialog这个模块添加到工程中。

    七、变量的访问

    在*.pro文件里,可以使用{varName}来访问自己定义的变量,比如:

    MyVersion = 1.2
    FILE = 1.cpp
    TARGET = improve$${MyVersion}
    SOURCES = $$FILE
    

    *.pro文件里,访问环境变量的用法是:$(varName);*.pro文件里,访问Qt配置参数的用法是:$$[varName]。

    八、平台相关性

    有时为了保证不同平台的兼容性,需要针对不同的平台添加设定条件。这可以根据qmake所运行的平台来使用相应的作用域来进行处理。比如为windows平台添加的依赖平台的文件的简单作用域如下:

    win32 {
    SOURCES += hello_win.cpp
    }
    

    或者;

    win32:SOURCES += hello_win.cpp
    

    这样如果qmake运行在Windows上,它就会把hello_win.cpp添加到源文件列表中;而如果qmake运行在其他平台上的时候,它就会很简单的把这部分内容忽略。

    九、生成Makefile

    当你已经创建好你的项目文件,生成Makefile就很容易了,你所要做的就是先到你所生成的项目文件那里然后输入:

    qmake -o Makefile hello.pro
    

    对于VisualStudio的用户,qmake也可以生成“*.dsp”文件,例如:

    qmake -tvcapp -o hello.dsp hello.pro
    

    十、其他

    10.1 如果一个文件不存在,停止qmake

    如果某个文件不存在的时候,你也许不想生成一个Makefile。我们可以通过使用exists()函数来检查一个文件是否存在。我们可以通过使用error()函数把正在运行的qmake停下来。这和作用域的工作方式一样,只要简单地用这个函数来替换作用域条件,比如对main.cpp文件的检查为:

    !exists( main.cpp ){
        error(“No main.cpp file found”)
    }
    

    使用“!”来否定这个测试,比如:如果文件存在,exists(main.cpp)是真,如果文件不存在,!exists(main.cpp)是真。

    10.2 检查多于一个的条件

    假设你使用Windows并且当你在命令行运行你的应用程序的时候,你想能够看到qDebug()语句。除非你在连编你的程序的时候使用console设置,否则你不会看到输出。我们可以很容易地把console添加到CONFIG行中,这样在Windows下,Makefile就会有这个设置。但是如果告诉你我们只是想在当我们的应用程序运行在Windows下并且当debug已经在CONFIG行中的时候,添加console,这就需要两个嵌套的作用域:只要生成一个作用域,然后在它里面再生成另一个。把设置放在最里面的作用域,比如:

    win32 {
        debug {
            CONFIG += console
        }
    }
    

    嵌套作用域可以使用冒号连接起来,比如:

    win32:debug{
        CONFIG += console
    }
    

    相关文章

      网友评论

        本文标题:QT之proc工程文件详解

        本文链接:https://www.haomeiwen.com/subject/tresvqtx.html