Qt pro文件详解

概述

在Qt中,.pro 文件(也称为项目文件)是Qt项目管理系统(qmake)所使用的配置文件。这个文件定义了如何构建你的Qt应用程序或库,其使用简单的键值对语法,允许你指定源文件、头文件、库依赖、配置选项等。

qmake 是一个工具,它读取 .pro 文件,并生成一个标准的 Makefile(在Unix-like系统上)或者相应的项目文件(在Windows上,如Visual Studio的项目文件),以便可以使用相应的构建工具(如 make 或 IDE)来构建项目。

基本指令

1. TARGET : 指定生成的目标文件的名称(不包括文件扩展名)。

例如,TARGET = myapp 将生成名为myapp的可执行文件(在Windows上可能是myapp.exe)。

2. TEMPLA **TE:**指定项目的模板类型。

  • app - 应用程序模板,用于生成可执行文件。这是最常见的模板类型,用于构建桌面应用程序。
  • lib - 库模板,用于生成库文件(.dll、.so、.dylib或.a等,取决于平台和编译器)。这个模板可以用来构建静态库或动态库。
  • subdirs - 子目录模板,用于处理包含多个子项目的项目。在这个模板下,你可以在.pro文件中指定其他.pro文件,qmake会递归地处理这些子项目。
  • vcappvclib - 这两个模板与app和lib类似,但它们是为在Visual Studio中集成Qt项目而设计的。它们会生成适合在Visual Studio中打开的项目文件(.vcproj)。然而,随着Qt版本的更新,这些模板可能已经被废弃或不再推荐使用,因为Qt Creator和qmake现在提供了更好的Visual Studio集成。
  • aux - 辅助模板,用于构建不生成可执行文件或库文件的项目部分,如插件或资源文件。然而,这个模板的使用并不常见,并且在最新的Qt版本中可能不再支持或已被其他机制取代。

3. CONFIG: 它用于指定项目的编译和链接选项。

CONFIG变量可以包含多个选项,这些选项可以是Qt内置的,也可以是用户自定义的。每个选项都影响着qmake生成Makefile的方式,以及项目的编译和链接过程。

1)以下是一些常见的内置CONFIG选项:

  • c++11、c++14、c++17、c++20等:指定使用的C++标准版本。
  • debug:构建调试版本的项目。
  • release:构建发布版本的项目。注意,debug和release通常是互斥的,但在某些情况下,你可以通过条件语句在.pro文件中同时定义它们,以便为不同的构建配置生成不同的目标。
  • staticlib、sharedlib:指定生成静态库或动态库。注意,这些选项通常与TEMPLATE = lib一起使用。
  • qt:启用对Qt模块的支持。这个选项是默认启用的,但你可以通过条件语句来禁用它。

2)自定义的CONFIG:变量、函数、第三方库等。

3)注意:

  • CONFIG选项是大小写不敏感的,但出于一致性和可读性的考虑,建议使用小写字母。
  • CONFIG选项可以多次添加到.pro文件中,qmake会合并它们。但是,请注意某些选项(如debug和release)可能是互斥的。
  • 你可以使用条件语句(如if、else、for等)来根据CONFIG选项的值控制.pro文件中的其他设置。

4. QT: 用于指定项目将使用的Qt模块。QT变量可以包含多个模块名,这些模块名之间用空格分隔。

例如:QT += core gui widgets

项目需要链接Qt的核心(core)、图形用户界面(gui)和窗口部件(widgets)模块。

Qt模块通常分为几大类,包括但不限于:

  • 核心模块 (如core):提供非GUI功能,如字符串处理、容器、文件访问、时间处理、线程和进程等。
  • GUI模块 (如gui、widgets):提供窗口系统、事件处理、绘图、字体、图像等GUI功能。
  • 网络模块 (如network):提供网络通信功能,如TCP/IP客户端和服务器、UDP、SSL/TLS等。
  • 数据库模块 (如sql):提供数据库访问功能,支持多种数据库系统。
  • 多媒体模块 (如multimedia):提供音频、视频和摄像头访问功能。
  • Web模块 (如webengine):提供基于Chromium的Web浏览器引擎,用于在Qt应用程序中嵌入Web内容。

**注意:**随着Qt版本的更新,可用的模块和它们的名称可能会发生变化。因此,建议查阅你正在使用的Qt版本的官方文档,以获取有关可用模块的最新信息。

文件列表指令

  • SOURCES : 列出项目中的所有C++源文件。qmake会自动将这些文件编译成目标代码。
  • HEADERS : 列出项目中的所有头文件。这些文件通常被包含在源文件中,但不需要单独编译。
  • FORMS : 列出由Qt Designer创建的UI文件。qmake会使用uic工具将这些文件转换成C++代码。
  • RESOURCES : 列出资源文件(.qrc),这些文件定义了应用程序中使用的图标、图片等资源。
  • TRANSLATIONS : 列出翻译文件(.ts),这些文件用于国际化和本地化支持。
cpp 复制代码
FORMS += \
    $$PWD/frmpage2show.ui

HEADERS += \
    $$PWD/frmpage2show.h

SOURCES += \
    $$PWD/frmpage2show.cpp

TRANSLATIONS = lang_zh.ts \
               lang_en.ts

RESOURCES += \
    resources.qrc

其他常用指令

  • INCLUDEPATH : 指定编译器搜索头文件的额外路径。这对于包含非标准位置的头文件非常有用。
  • LIBS : 指定链接器需要链接的外部库。可以指定库文件的路径和名称,以及任何必要的库搜索路径。
  • DEFINES : DEFINES变量用于指定在编译时传递给C++预处理器的一系列宏定义。

1)DEFINES变量可以包含多个宏定义,它们之间用空格分隔。请注意,在.pro文件中定义宏时,不会直接指定值;相反,你需要在源代码中使用#ifdef、#ifndef、#if defined(...)等预处理指令来检查宏是否被定义。

cpp 复制代码
// 例如:
DEFINES += MY_FEATURE_ENABLED USE_LOGGING

在编译时,这些宏会被添加到C++预处理器的宏定义列表中,因此你可以在项目的源代码中这样使用它们:

cpp 复制代码
#ifdef MY_FEATURE_ENABLED 
    //启用某个特性的代码 
#endif

#ifdef USE_LOGGING 
    //记录日志的代码 
#endif

2).pro文件不直接支持为宏指定值。但是,你可以通过一些技巧来实现类似的效果,比如使用DEFINES来定义宏,并在源代码中根据这个宏的存在与否来设置另一个宏的值。

3)DEFINES变量中定义的宏在项目的所有源文件和头文件中都是可见的,除非你在源代码中使用了条件编译指令来限制它们的作用范围。因此,请确保你的宏名称具有足够的唯一性,以避免与Qt库或其他第三方库中的宏名称冲突。

  • VERSION : 指定项目的版本号。这对于生成包含版本信息的文件或资源很有用。
  • SUBDIRS : 在使用subdirs模板时,指定要构建的子目录列表。

SUBDIRS变量用于指定当前项目应该包含的子项目(子目录)。这允许你将一个大型项目分解成多个更小的、更易于管理的部分,每个部分都可以有自己的.pro文件和构建配置。

当SUBDIRS变量被设置时,qmake会首先处理当前项目文件(即包含SUBDIRS变量的那个.pro文件),然后递归****【1】 地处理每个指定的子目录中的.pro文件。

SUBDIRS变量的值是一个或多个子目录的名称,这些名称之间用空格分隔。每个子目录都应该包含一个.pro文件,该文件定义了该子项目的构建规则。

cpp 复制代码
// 例如:
SUBDIRS += JpLoginMng
SUBDIRS += UI
SUBDIRS += components
或
SUBDIRS += \ 
JpLoginMng\
UI\ 
components
或
SUBDIRS += JpLoginMng UI components
//【2】
SUBDIRS += JPKeyboard/3rdparty/pinyin/pinyin.pro
SUBDIRS += JPKeyboard/JPKeyboard.pro

你还可以在每个子目录的.pro文件中使用CONFIG变量来指定该子项目的特定构建配置,如debug、release、staticlib等。这些配置将仅影响该子项目,而不会影响其他子项目或顶层项目。

【1】递归处理,若SUBDIRS += src,会递归的执行src中的所有pro文件吗?

并不会递归地执行src目录中的所有.pro文件。

qmake只会处理SUBDIRS变量中明确指定的子目录(或子项目)中的.pro文件。如果src目录本身包含了一个.pro文件,那么qmake会处理这个文件。

如果src目录中还包含其他子目录,并且这些子目录中也有.pro文件,那么这些.pro文件不会自动被qmake处理,除非它们也被明确地添加到了SUBDIRS变量中。但是,一般顶层.pro文件包含的子目录中只包含1个.pro文件,即:项目纵深只有2层。因为,纵深越大,这样会使项目的构建过程变得更加复杂和难以维护。因此,在大多数情况下,项目纵深只有2层,在顶层.pro中建议显式地列出所有需要构建的子项目。

【2】除了包含子目录名,SUBDIRS还可以指定子目录中的pro文件 。这样,你可以构建多个项目或项目的一部分,将它们组织在Qt的项目管理系统中。

相关推荐
锦亦之22339 小时前
QT+OSG+OSG-earth如何在窗口显示一个地球
开发语言·qt
柳鲲鹏12 小时前
编译成功!QT/6.7.2/Creator编译Windows64 MySQL驱动(MinGW版)
开发语言·qt·mysql
三玖诶12 小时前
如何在 Qt 的 QListWidget 中逐行添加和显示数据
开发语言·qt
阳光开朗_大男孩儿18 小时前
DBUS属性原理
linux·服务器·前端·数据库·qt
Alphapeople19 小时前
Qt Modbus
开发语言·qt
竹林海中敲代码19 小时前
Qt Creator 集成开发环境 常见问题
qt·qt工具常见问题
竹林海中敲代码1 天前
Qt安卓开发连接手机调试(红米K60为例)
android·qt·智能手机
长沙红胖子Qt1 天前
关于 Qt运行加载内存较大崩溃添加扩大运行内存 的解决方法
开发语言·qt·qt扩大运行内存
gopher95111 天前
qt相关面试题
开发语言·qt·面试
三玖诶1 天前
在 Qt 中使用 QLabel 设置 GIF 动态背景
开发语言·qt·命令模式