当前位置: 首页 > news >正文

Qt5 项目的构建与部署详细讲解

个人博客:blogs.wurp.top

第一部分:项目构建

Qt5 项目主要可以使用两种构建系统:qmakeCMake。qmake 是 Qt 自家传统且紧密集成的工具,而 CMake 是一个更现代、更通用的跨平台构建系统,Qt 官方从 Qt6 开始也大力推荐使用 CMake。

1. 使用 qmake 构建

qmake 使用 .pro 文件来定义项目。

一个基础的 *.pro 文件结构:

# 指定所需的模块。core 和 gui 是基础,widgets 用于传统桌面UI。
QT       += core gui widgets# 如果目标程序版本大于 4,我们需要添加 widgets 模块(如上所示),在 Qt5 中通常需要。
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets# 指定目标文件的名称:生成的可执行文件名为 MyApp
TARGET = MyApp# 指定构建类型:app 表示应用程序,lib 表示库
TEMPLATE = app# 指定编译的语言标准(C++11 或更高版本)
CONFIG += c++11# 指定源代码文件
SOURCES += \main.cpp \mainwindow.cpp# 指定头文件
HEADERS += \mainwindow.h# 指定UI文件(由Qt Designer创建)
FORMS += \mainwindow.ui# 指定资源文件(如图标、翻译文件等)
RESOURCES += \resources.qrc# 平台特定的设置
win32 {# Windows 平台特有的设置,例如链接某个库LIBS += -lOpengl32
}unix:!macx {# Linux 平台特有的设置LIBS += -lGL
}macx {# macOS 平台特有的设置
}

构建步骤:

  1. 生成 Makefile:在项目根目录(包含 .pro 文件的目录)打开终端/命令行。

    qmake
    

    这条命令会读取 .pro 文件并生成一个与你的编译器和平台对应的 Makefile

  2. 执行编译

    make           # 在 Linux/macOS 上使用 make
    # 或者
    nmake          # 在 Windows 上使用 Visual Studio 编译器时使用 nmake
    # 或者
    mingw32-make   # 在 Windows 上使用 MinGW 编译器时使用 mingw32-make
    

    这一步会调用编译器,编译源代码并链接生成最终的可执行文件(如 MyApp.exeMyApp)。

  3. (可选) 清理构建

    make clean     # 清理生成的对象文件和目标程序,但保留 Makefile
    # 或者
    make distclean # 彻底清理,包括 Makefile(需要重新运行 qmake)
    

2. 使用 CMake 构建

CMake 使用 CMakeLists.txt 文件,它更灵活,功能也更强大。

一个基础的 CMakeLists.txt 文件结构:

# 指定所需的 CMake 最低版本
cmake_minimum_required(VERSION 3.16)# 设置项目名称
project(MyApp VERSION 1.0 LANGUAGES CXX)# 设置 C++ 标准
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)# 自动处理 UI、资源文件等 (MOC, UIC, RCC)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTORCC ON)# 查找所需的 Qt 库
find_package(Qt5 REQUIRED COMPONENTS Core Widgets)# 如果你的程序需要网络、多媒体等功能,在这里添加
# find_package(Qt5 REQUIRED COMPONENTS Core Widgets Network Multimedia)# 添加可执行文件目标,并指定源文件
add_executable(MyAppmain.cppmainwindow.cppmainwindow.hmainwindow.uiresources.qrc # 直接包含资源文件
)# 将找到的 Qt 库链接到你的可执行文件
target_link_libraries(MyApp Qt5::Core Qt5::Widgets)# (可选) 设置可执行文件的输出目录
# set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)

构建步骤(通常采用 Out-of-Source Build,即外部构建):

  1. 创建构建目录并进入

    mkdir build
    cd build
    
  2. 运行 CMake 生成构建系统文件

    # .. 表示上一级目录,即 CMakeLists.txt 所在的位置
    cmake .. -G "Your Generator"
    

    -G 用于指定生成器,通常可以省略,CMake 会自动选择。常见生成器:

    • Unix/Linux/macOS: 默认生成 Unix Makefiles,只需 cmake ..
    • Windows (Visual Studio): -G "Visual Studio 16 2019" (版本号根据你的VS版本变化)
    • Windows (MinGW): -G "MinGW Makefiles"
  3. 执行编译

    cmake --build .  # 通用命令,CMake 会调用底层的构建工具(make, nmake, msbuild等)
    # 或者直接使用底层工具
    make             # 对于 Makefiles
    # 或者
    msbuild MyApp.sln # 对于 Visual Studio
    

第二部分:项目部署

部署意味着让你的程序可以在没有安装 Qt 开发环境的机器上运行。核心问题是处理程序所依赖的 Qt 运行时库插件

1. Windows 部署

方法一:使用 windeployqt 工具(官方推荐,最常用)

windeployqt 是 Qt 安装时自带的一个命令行工具,它能自动分析你的可执行文件,并将其依赖的所有 Qt 库、插件和翻译文件复制到该可执行文件所在的目录。

步骤:

  1. 使用 Release 模式编译你的项目(CONFIG += release in .pro,或在 CMake 中设置 -DCMAKE_BUILD_TYPE=Release)。
  2. 在编译输出的目录(包含你的 *.exe 文件的 release/bin/ 目录)打开 Qt 命令行(开始菜单中的 “Qt 5.15.2 (MinGW 7.3.0 64-bit)” 或类似的),或者确保你的普通命令行能找到 windeployqt.exe(它在 Qt 安装目录的 bin 文件夹下)。
  3. 运行命令:
    windeployqt --compiler-runtime MyApp.exe
    
    • --compiler-runtime 选项会同时打包 VC++ Redistributable 的运行库(如果你用的是 MSVC 编译器),这非常有用。
    • 工具会自动填充所有必要的 .dll 文件、plugins 文件夹(如 platforms/qwindows.dll)和 translations 文件夹。

现在,整个文件夹就可以打包分发了。你可以双击 MyApp.exe 测试是否能够独立运行。

方法二:手动复制(不推荐,用于理解或调试)

  1. 将你的 MyApp.exe 复制到一个空文件夹。
  2. 运行它,你会看到类似 无法找到 Qt5Core.dll 的错误。
  3. 根据错误提示,从 Qt安装目录/5.15.2/msvc2019_64/bin/(你的路径会不同)找到对应的 .dll 文件并复制过来。
  4. 最重要的是,需要复制 平台插件。创建一个 platforms 文件夹,并将 qt安装目录/plugins/platforms/qwindows.dll 复制过来。
  5. 如果程序使用了图片(jpeg, png)、数据库等功能,还需要复制相应的插件(imageformats, sqldrivers 等目录)。

2. Linux 部署

Linux 部署相对复杂,因为系统本身可能已安装部分 Qt 库,但版本可能不匹配。

方法一:使用 linuxdeployqt(推荐)

linuxdeployqt 是一个类似 windeployqt 的第三方工具,它可以打包 AppImage。

  1. 从 GitHub 下载 linuxdeployqt-continuous-x86_64.AppImage
  2. 给你的可执行文件设置 AppDir 结构:
    mkdir -p MyApp.AppDir/usr/bin
    mkdir -p MyApp.AppDir/usr/lib
    mkdir -p MyApp.AppDir/usr/share/applications
    cp MyApp MyApp.AppDir/usr/bin/
    # 创建 .desktop 文件
    # 复制图标等
    
  3. 运行 linuxdeployqt
    ./linuxdeployqt-continuous-x86_64.AppImage MyApp.AppDir/usr/bin/MyApp -appimage
    
    它会自动收集依赖并生成一个可自包含的 MyApp-x86_64.AppImage 文件。

方法二:静态编译(最干净,但最复杂)

你需要从源码静态编译整个 Qt 库,然后用这个静态版的 Qt 来编译你的程序。这样生成的可执行文件几乎不依赖外部动态库,但体积巨大,且需要遵守 Qt 的许可证(LGPL 协议的约束)。

方法三:使用包管理器分发(如 Snap, Flatpak)

这些是更现代的 Linux 软件分发方式,它们将程序及其所有依赖打包在一个沙盒环境中,解决了依赖问题。

3. macOS 部署

使用 macdeployqt 工具

macOS 的部署体验是最好的,macdeployqt 会帮你创建一个完美的 .app 捆绑包(Bundle)甚至 .dmg 磁盘映像。

步骤:

  1. 在 Release 模式下编译你的程序,你会得到 MyApp.app
  2. 在终端运行:
    macdeployqt MyApp.app -dmg
    
  3. 这个命令会:
    • 将所需的 Qt 框架复制到 MyApp.app/Contents/Frameworks/ 目录。
    • 修正这些框架的安装名称(install_name)和路径,使其指向应用程序包内部。
    • (使用 -dmg 参数时)最终创建一个整洁的 MyApp.dmg 文件,用于分发。

总结与建议

任务工具/方法说明
构建 (qmake)qmake && makeQt传统方式,简单直接,适合小型或传统项目。
构建 (CMake)cmake && cmake --build .现代方式,功能强大,是未来的趋势,适合新项目和复杂项目。
部署 (Windows)windeployqt首选。自动化程度高,几乎一键完成。
部署 (Linux)linuxdeployqt生成 AppImage,是相对简单的分发方式。
部署 (macOS)macdeployqt首选。完美创建 .app.dmg

通用部署检查工具:

  • Windows: Dependency Walker (depends.exe) 或 ldd (MinGW) 可以查看可执行文件的依赖。
  • Linux: ldd MyApp 命令可以列出程序依赖的所有动态库。
  • macOS: otool -L MyApp.app/Contents/MacOS/MyApp 可以查看依赖的框架。
http://www.dtcms.com/a/347088.html

相关文章:

  • 【Android】Fragment生命周期详解
  • 链表漫游指南:C++ 指针操作的艺术与实践
  • 【RK3576】【Android14】Android平台跟文件系统
  • PostgreSQL表分区与复杂查询性能优化实践指南
  • 【AI基础:神经网络】17、神经网络基石:从MP神经元到感知器全解析 - 原理、代码、异或困境与突破
  • 当 /etc/sysctl.d/ 目录下存在多个配置文件且配置项冲突时最终会使用哪个配置项
  • 嵌入式linux开发板 IP配置
  • Redis配置与数据类型详解及缓存优化实践
  • 使用VLLM部署大模型embedding/chat 的API
  • 秋招面试准备
  • Git的下载安装和使用以及和IDEA的关联
  • PLECS 中使用 C-Script 来模拟 NTC 热敏电阻(如 NTC3950B)
  • Spring Boot 校验分组(Validation Groups)高级用法全指南
  • 从词源和输出生成等角度详细解析PHP中常用文件操作类函数
  • Mac简单测试硬盘读写速度
  • 计算机网络 TLS握手中三个随机数详解
  • 鸿蒙应用网络开发实战:HTTP、WebSocket、文件下载与网络检测全攻略
  • Ubuntu 操作系统深度解析:从入门到精通(2025 最新版)
  • AP5414 LED驱动芯片:高效灵活,专业级照明解决方案
  • 20250823解决荣品RD-RK3588-MID核心板的底板的adb不通
  • Unity其他--【MMD】如何在Unity中制作MMD
  • Go数据结构与算法-常见的排序算法
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘arviz’问题
  • Boost.Asio 库中的 async_read_some用法
  • JAVA核心基础篇-操作符
  • 嵌入式LINUX——————网络TCP
  • 如何在Ubuntu中删除或修改已有的IP地址设置?
  • 在Excel和WPS表格中快速插入多行或多列
  • 生成一个竖直放置的div,宽度是350px,上面是标题固定高度50px,下面是自适应高度的div,且有滚动条
  • LeetCode算法日记 - Day 19:判定字符是否唯一、丢失的数字