美文网首页程序员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工程文件详解

    一、简介 *.pro文件是Qt在创建项目时生成的项目文件,它支持跨平台。*.pro格式文件包含的内容有临时工程文件...

  • 导致proc编译失败

    问题描述 (1)代码文件我的项目不是标准的qt工程,只是些单纯的.c文件和.h文件构成,其中数据库用到了proc,...

  • windows QT串口通信

    一、 添加相关头文件 1、在qt项目工程文件中添加 QT += serialport 2、在mainwindow....

  • 在vc vs2017 ide中加入QT UI.

    首先vs要安装QT 插件。QT VS Tools然后右键工程目录里面需要建立UI文件的文件夹,添加-》新建项,选择...

  • Qt QThread类

    参考博客1:QThread详解参考博客2:Qt之线程(QThread)参考博客3:QT 多线程程序设计参考博客4:...

  • Qt学习笔记(一)

    画图 qcustomplot 串口通信 Qt5以后自带QSerialPort 1 在工程文件(即.pro文件)中增...

  • USB学习笔记四之/proc/bus/usb/devices

    /proc/bus/usb/devices信息详解 /proc/bus/usb/devices中的信息主要来自描述...

  • Qt连接MySQL:编译工程提示:“qsql.h”不存在

    问题:编译工程提示:“qsql.h”不存在 解决:在工程的pro文件中添加QT+=sql

  • Qt中事件的理解(2)

    这一章我们继续讲Qt事件——事件的传递 1、创建工程 工程目录如下所示: 创立工程testEvent,主窗口文件以...

  • QT Creator 配置共享

    QT 会在打开 .pro 工程后,自动生成一个.pro.user 文件,XML 格式,用于存放用户的工程配置,包括...

网友评论

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

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