😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀
🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C++、数据结构、音视频🍭
🤣本文内容🤣:🍭介绍Qt的.pro文件 🍭
😎金句分享😎:🍭你不能选择最好的,但最好的会来选择你——泰戈尔🍭
⏰发布时间⏰:

本文未经允许,不得转发!!!


在这里插入图片描述
在这里插入图片描述

🎄一、概述

刚开始学Qt时,可能会比较少关注到 .pro文件 和 .pri文件,一般都以为这些文件可以直接让 Qt Creator 来帮我们生成,不需要自己写。但是,如果Qt项目的源文件比较多了,需要分模块、分目录来管理源文件时,可能就了解.pro文件、.pri文件的相关语法,并自己修改或实现pro文件了。

pro文件和pri文件 是Qt构建系统(qmake)的核心,负责定义项目的结构、依赖关系和构建规则。理解这两种文件的用法对于高效开发Qt应用程序至关重要:

  • .pro文件:又称 项目文件,是Qt项目的主要配置文件,每个Qt项目至少有一个.pro文件。它告诉 qmake 如何为项目生成适当的 Makefile。

  • .pri文件:项目包含文件,是用于模块化配置的包含文件,可以在多个pro文件中重用。它们帮助组织大型项目,减少代码重复。

一般情况下,如果Qt项目的源码比较简单,可以在命令行跳转到源码目录,执行下面命令让qmake帮我们生成一个.pro文件,再生成Makefile:

qmake -project
qmake xxx.pro

这里大概清楚了 pro 文件、pri文件的概念,那这两个文件怎么写呢?怎么使用呢?下面


在这里插入图片描述

🎄二、.pro 文件基础语法结构

这个小节介绍 pro 文件的语法结构,需要注意的是,.pro文件 和 pri文件 的语法结构是一样的

首先,看看下面这个 pro 文件,有个了解:

# 注释以#开头

# 模板类型 - 定义项目类型
TEMPLATE = app

# 项目名称
TARGET = MyApplication

# Qt模块依赖
QT += core gui widgets

# 配置选项
CONFIG += c++17 warn_on

# 源文件列表
SOURCES += main.cpp \
           mainwindow.cpp \
           widget.cpp

# 头文件列表  
HEADERS += mainwindow.h \
           widget.h

# 资源文件
RESOURCES = resources.qrc

# UI文件
FORMS = mainwindow.ui

✨2.1 .pro 文件的变量

这个小节介绍 .pro 文件的变量,这里先介绍变量赋值时可能遇到的几个内容:

  • 1、可以使用=给一个变量赋值,也可以使用+=在该变量原有的值再加上+=后的值;
  • 2、如果给一个想给一个变量赋多个值,各个值直接需要空格分开,例如:QT += svg core gui
  • 3、可以在变量名前加$$来读取变量的值,例如DESTDIR = $$PWD/../../bin

TEMPLATE 变量

TEMPLATE 变量用于构建项目类型,如果pro文件没有声明这个变量,qmake会默认按照应用程序(app)来生成Makefile。TEMPLATE 变量包括但不限于下面几个取值:

  • app:默认值,构建应用程序;
  • lib:构建一个库;
  • subdirs:一般配合SUBDIRS变量一起使用,会生成 Makefile 文件编译 SUBDIRS 指定的文件夹,每个子文件夹都必须有自己的pro文件;
  • aux:不需要构建任何东西
TEMPLATE = app      # 应用程序(默认)
TEMPLATE = lib      # 库文件
TEMPLATE = subdirs  # 子目录项目
TEMPLATE = aux      # 不需要构建任何东西

TARGET 变量

指定生成的目标文件名,如果不设置该变量,目标文件名会被自动设置为跟pro文件一样的名字:

TARGET = MyApp

QT 变量

指定项目中使用的 QT 模块列表。

QT += core gui        # 基础模块
QT += widgets         # 桌面组件
QT += network         # 网络功能
QT += sql             # 数据库
QT += multimedia      # 多媒体
QT += charts          # 图表
QT += webenginewidgets # Web引擎

CONFIG 变量

配置项目的编译选项。

CONFIG 变量包括但不限于下面几个取值:

  • ordered:表示子项目按照添加的顺序来编译;
  • debug:应用程序以debug(调试)模式编译,;
  • release:应用程序以release(发布)模式编译;
  • warn_on:编译器输出尽可能多的警告信息;
  • warn_off:编译器输出尽可能少的警告信息;
  • qt:这是一个Qt应用程序,并且会链接Qt库;
  • thread:目标程序是一个多线程程序;
  • staticlib:只适用于lib模板,表示目标库是一个静态库;
  • console:只适用于app模板,表示这是一个控制台应用程序;
  • plugin:只适用于lib模板,表示目标库是一个插件;
CONFIG += c++17        # C++标准
CONFIG += warn_on      # 开启警告
CONFIG += debug        # 调试模式
CONFIG += release      # 发布模式
CONFIG += console      # 控制台应用
CONFIG += precompile_header # 预编译头文件

文件路径 变量

  • SOURCES:指定源文件,多个源文件时需要用空格分隔开,也可以使用+=来增加源文件;
  • HEADERS:指定头文件;
  • FORMS:指定需要由uic处理的UI文件;
  • RESOURCES:指定资源文件;
  • TRANSLATIONS:翻译文件;
  • LIBS:指定库路径-Lxxx,或指定要链接的库-lxxx
  • DESTDIR:生成可执行程序或二进制文件的目录;
  • OBJECTS_DIR:指定放置中间对象的目录;
  • MOC_DIR:指定放置所有moc中间文件的目录;
  • RCC_DIR:指定 rcc 命令将 .qrc 文件转换成 qrc_*.h 文件存放目录;
  • UI_DIR:指定 uic 命令将 .ui 文件转换成 ui_*.h 文件的存放目录;
# 源文件和头文件
SOURCES += src/main.cpp src/utils.cpp
HEADERS += include/mainwindow.h include/utils.h

# UI文件和资源文件
FORMS += ui/mainwindow.ui ui/dialog.ui
RESOURCES += resources/icons.qrc resources/images.qrc

# 翻译文件
TRANSLATIONS += translations/app_zh_CN.ts \
                translations/app_en_US.ts

# 包含路径
INCLUDEPATH += include /usr/local/include

# 库路径
LIBS += -L/usr/local/lib -L$$PWD/lib

# 链接库
LIBS += -lmylibrary -lmyotherlib

# 输出目录
DESTDIR = $$PWD/bin
OBJECTS_DIR = $$PWD/build/obj
MOC_DIR = $$PWD/build/moc
RCC_DIR = $$PWD/build/rcc
UI_DIR = $$PWD/build/ui

DEFINES 变量

定义宏。qmake将此变量的值添加为编译器C预处理宏(-D选项)。

DEFINES += 3531A

✨2.2 .pro 文件的平台特定配置

# Windows平台
win32 {
    LIBS += -luser32 -ladvapi32
    RC_FILE = app.rc
    DEFINES += WIN32 _WIN32
}

# Linux平台  
unix:!macx {
    LIBS += -lpthread -lrt
    DEFINES += LINUX
}

# macOS平台
macx {
    LIBS += -framework Cocoa
    ICON = app.icns
    QMAKE_INFO_PLIST = Info.plist
}

✨2.3 .pro 文件的条件编译

exists()函数可以检查文件是否存在;

# 调试和发布模式
CONFIG(debug, debug|release) {
    TARGET = $$join(TARGET,,,_debug)
    DEFINES += DEBUG_MODE QT_DEBUG
    QMAKE_CXXFLAGS += -g -O0
} else {
    DEFINES += RELEASE_MODE QT_NO_DEBUG
    QMAKE_CXXFLAGS += -O2 -s
}

# 功能开关
CONFIG += enable_network
contains(CONFIG, enable_network) {
    QT += network
    DEFINES += WITH_NETWORK
}

# 文件存在检查
exists($$PWD/config/custom.h) {
    DEFINES += HAVE_CUSTOM_CONFIG
} else {
    warning("custom.h not found, using defaults")
}

在这里插入图片描述

🎄三、.pri 文件介绍

.pri文件(项目包含文件)是用于模块化配置的包含文件,可以在多个pro文件中重用。它们帮助组织大型项目,减少代码重复。

一般情况下,可以像下面代码一样将 pri 文件包含到 pro 文件中:

# 在pro文件中包含pri文件
include(common.pri)
include($$PWD/config.pri)
include($$PWD/modules/core/core.pri)

✨3.1 .pri 文件的使用场景

通用配置共享

# common.pri - 通用配置

# 编译器设置
QMAKE_CXXFLAGS += -Wall -Wextra
QMAKE_CXXFLAGS_RELEASE += -O2
QMAKE_CXXFLAGS_DEBUG += -g -O0

# 平台特定设置
win32 {
    DEFINES += _CRT_SECURE_NO_WARNINGS
    QMAKE_CXXFLAGS += -MP
}

unix {
    QMAKE_CXXFLAGS += -fPIC
}

模块配置

# core.pri - 核心模块配置

# 包含路径
INCLUDEPATH += $$PWD/include/core
DEPENDPATH += $$PWD/include/core

# 源文件
SOURCES += $$PWD/src/core/*.cpp \
           $$PWD/src/core/utils/*.cpp

HEADERS += $$PWD/include/core/*.h \
           $$PWD/include/core/utils/*.h

# 模块定义
DEFINES += CORE_MODULE_VERSION=1.0.0

# 依赖
QT += core

第三方库集成

# thirdparty.pri - 第三方库配置

# OpenCV配置
CONFIG += link_pkgconfig
PKGCONFIG += opencv4

# 或者手动配置
# INCLUDEPATH += /usr/local/include/opencv4
# LIBS += -L/usr/local/lib -lopencv_core -lopencv_imgproc

# 自定义库
MY_LIB_PATH = $$PWD/thirdparty/mylib
INCLUDEPATH += $$MY_LIB_PATH/include
LIBS += -L$$MY_LIB_PATH/lib -lmylib

✨3.2 .pri 文件的高级技巧

变量作用域

# 定义作用域变量
defineReplace(myFunction) {
    # 处理参数
    INPUT = $$1
    OUTPUT = $$replace(INPUT, .cpp, .o)
    return($$OUTPUT)
}

# 使用函数
OBJECT_FILES = $$myFunction($$SOURCES)

条件包含

# 根据条件包含不同配置
CONFIG(debug, debug|release) {
    include(debug_settings.pri)
} else {
    include(release_settings.pri)
}

# 平台特定包含
win32 {
    include(windows_libs.pri)
}
unix:!macx {
    include(linux_libs.pri)  
}
macx {
    include(macos_libs.pri)
}

在这里插入图片描述

🎄四、总结

pro文件和pri文件是Qt项目管理的核心,掌握它们的使用可以显著提高开发效率:

关键要点:
• pro文件是项目主配置文件,定义项目的基本结构和构建规则
• pri文件用于模块化配置,提高代码重用性和可维护性
• 合理使用条件编译和平台检测确保跨平台兼容性
• 模块化设计使大型项目更易于管理和维护

最佳实践:

  1. 保持pro文件简洁,将复杂配置提取到pri文件中
  2. 使用有意义的变量名和注释
  3. 为不同平台和环境提供适当的配置
  4. 实施错误检查和验证机制
  5. 使用版本控制和自动化构建
    通过熟练运用pro和pri文件,你可以构建出结构清晰、易于维护的跨平台Qt应用程序。

在这里插入图片描述
如果文章有帮助的话,点赞👍、收藏⭐,支持一波,谢谢 😁😁😁

参考:
qt 5.6 qmake手册,英文手册可以在Qt助手搜qmake。
QT中PRO文件写法的详细介绍,很有用,很重要!
https://www.cnblogs.com/oloroso/p/4595181.html

在这里插入图片描述

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐