【AI时代速通QT】第八节:Visual Studio与Qt-从项目迁移到多版本管理

目录

前言

[一、世界之间的桥梁:将VS项目导出为Qt Creator项目](#一、世界之间的桥梁:将VS项目导出为Qt Creator项目)

[1.1 为何需要导出?](#1.1 为何需要导出?)

[1.2 一步步导出`.pro`文件](#1.2 一步步导出.pro文件)

[1.3 解密`.pro`与`.pri`:它们是什么,做了什么?](#1.3 解密.pro.pri:它们是什么,做了什么?)

二、为项目"添砖加瓦":动态添加Qt模块

三、多版本"交响曲":管理并切换Qt版本

[3.1 第一步:在VS中注册你所有的Qt版本](#3.1 第一步:在VS中注册你所有的Qt版本)

[3.2 第二步:为你的解决方案(Solution)切换Qt版本](#3.2 第二步:为你的解决方案(Solution)切换Qt版本)

[四、最重要的避坑指南:32位 vs 64位与第三方库的"生死对决"](#四、最重要的避坑指南:32位 vs 64位与第三方库的“生死对决”)

五、总结


🎬 攻城狮7号个人主页

🔥 个人专栏 :C++QT跨平台界面编程

⛺️ 君子慎独!

🌈 大家好,欢迎来访我的博客!

⛳️ 此篇文章主要介绍 Visual Studio与Qt-从项目迁移到多版本管理

📚 本期文章收录在《C++QT跨平台界面编程》,大家有兴趣可以自行查看!

⛺️ 欢迎各位 ✔️ 点赞 👍 收藏 ⭐留言 📝!

前言

对于习惯了Visual Studio强大调试功能的C++开发者来说,使用Qt框架时,如何将两者的优势结合起来,是一个永恒的话题。Qt官方的`Qt VS Tools`插件为我们架起了一座桥梁,但在这座桥上,我们常常会遇到一些"拦路虎":如何将VS项目交给只用Qt Creator的同事?如何在多个Qt版本间自由切换?如何添加新的Qt模块?以及那个最令人头疼的32位与64位库冲突问题。

本文将继续以上一节的示例项目(`vsqt`)为基础,深入浅出地讲解如何优雅地解决以上问题,让你在VS中驾驭Qt开发时游刃有余。

一、世界之间的桥梁:将VS项目导出为Qt Creator项目

1.1 为何需要导出?

在团队协作中,我们经常会遇到这样的场景:你习惯使用Visual Studio进行开发和调试,而你的同事则更偏爱跨平台的Qt Creator。此时,如何顺畅地共享和协作项目就成了一个问题。`Qt VS Tools`提供的项目导出功能,正是为了解决这一痛点。

1.2 一步步导出`.pro`文件

假设我们已经在VS中创建或打开了一个Qt项目,比如我们的`vsqt`示例。要将其转换为Qt Creator可以识别的`.pro`工程文件,操作非常简单:

(1)在VS的顶部菜单栏中,找到并点击 `Qt VS Tools`。

(2)下拉菜单中选择 'Convert Project to Qt VS Tools Project' ,并进行确认操作。

(2)转换后,在下拉菜单中会新增一些选项,如下选择 `Create .pro File`。

工具会弹出一个对话框,询问你是否要同时创建一个`.pri`文件。在这里,我们强烈建议勾选并创建。点击确认后,在你的项目根目录下(`vsqt/`),就会生成`vsqt.pro`和`vsqt.pri`两个新文件。

1.3 解密`.pro`与`.pri`:它们是什么,做了什么?

**(1)`.pro`文件:**这是Qt Creator的主项目文件。它的内容通常非常简洁。打开`vsqt.pro`,你会看到类似这样的内容:

XML 复制代码
    # ----------------------------------------------------
    # This file is generated by the Qt Visual Studio Tools.
    # ------------------------------------------------------

    TEMPLATE = vcapp
    include(vsqt.pri)

它只做了一件事:通过`include(vsqt.pri)`指令,将`.pri`文件的内容包含进来。

(2)`.pri`文件: 这是一个"项目包含文件"(Project Include File)。`Qt VS Tools`非常聪明地将项目中所有与平台无关的共享信息都提取到了这里。打开`vsqt.pri`,内容会是这样:

XML 复制代码
    # ----------------------------------------------------

    # This file is generated by the Qt Visual Studio Tools.

    # ------------------------------------------------------


    HEADERS += ./vsqt.h

    SOURCES += ./main.cpp \

        ./vsqt.cpp

    FORMS += ./vsqt.ui

    RESOURCES += vsqt.qrc

可以看到,所有的头文件(`HEADERS`)、源文件(`SOURCES`)、UI设计文件(`FORMS`)和资源文件(`RESOURCES`)都被清晰地列在了这里。

这样做的好处是什么?

这种分离的策略极大地增强了项目的灵活性。`.pri`文件定义了"项目由哪些文件构成",而`.pro`文件则可以根据不同平台(如Windows, Linux, macOS)或不同编译器(如MSVC, MinGW)添加各自特定的配置。你可以创建多个`.pro`文件(如`vsqt_linux.pro`, `vsqt_win.pro`),它们都包含同一个`.pri`文件,从而轻松实现跨平台编译。

现在,你的同事只需用Qt Creator打开那个新生成的`vsqt.pro`文件,配置好他自己的编译套件(Kit),就可以无缝地开始工作了。

二、为项目"添砖加瓦":动态添加Qt模块

项目开发过程中,我们常常会遇到需要新功能的情况。比如,你最初的项目只用了`Core`和`GUI`模块,现在需要播放音频,就必须引入`Multimedia`模块。在VS中,这个操作同样非常便捷:

(1)在顶部菜单栏选择 `Qt VS Tools` -> `Qt Project Settings`。

(2)弹出的窗口中,切换到 `Qt Modules` 选项卡。

(3)这里列出了所有可用的Qt模块。找到并勾选你需要的模块,比如`Multimedia`或`OpenGL`。

(4)点击OK。

插件会自动在后台为你处理好所有繁琐的配置,包括修改项目的包含目录、库目录和链接器输入。这比手动去项目属性(`.vcxproj`)里一点点添加要安全和高效得多。

三、多版本"交响曲":管理并切换Qt版本

对于一个经验丰富的开发者来说,电脑上同时存在多个Qt版本(如为老项目准备的Qt 5.9,为主力项目准备的Qt 5.15,为探索新特性准备的Qt 6.2)是非常正常的。`Qt VS Tools`为此提供了强大的多版本管理和切换能力。

3.1 第一步:在VS中注册你所有的Qt版本

首先,你需要告诉VS你的Qt都安装在了哪里。

(1)选择 `Qt VS Tools` -> `Qt Options`。

(2)在弹出的窗口中,点击 `Add`。

(3)在"Path"一栏,选择你某个Qt版本的根目录,特别注意,要选择到具体的编译器版本,例如 `C:\Qt\5.9.0\msvc2015_64`。这个目录下必须包含`bin`, `lib`, `include`等文件夹。

(4)VS会自动识别版本并填充"Version"字段。

(5)重复此操作,将你所有的Qt版本都添加进来。你还可以选择一个作为默认版本。

3.2 第二步:为你的解决方案(Solution)切换Qt版本

当你从同事那里拿到一个项目,或者需要用新版Qt重新编译一个老项目时,就需要切换整个解决方案使用的Qt版本。

(1)在解决方案资源管理器 (Solution Explorer)中,右键点击最顶层的解决方案(Solution 'vsqt'),注意是解决方案,不是项目

(2)在右键菜单中,选择 `Change Solution's Qt Version`。

(3)在弹出的窗口中,选择一个你在上一步中已经注册好的Qt版本。

(4)点击OK。

插件会自动更新解决方案下所有Qt项目的配置,使其指向新版本的头文件和库。

四、最重要的避坑指南:32位 vs 64位与第三方库的"生死对决"

这是无数新手(甚至一些老手)都会栽跟头的地方,也是本文最重要的部分。当你切换Qt版本,特别是涉及到从32位(Win32)切换到64位(x64)时,请务必记住一条黄金法则:

你的项目配置、你选择的Qt版本、以及你链接的所有第三方库,它们的"位数"(架构)必须保持绝对一致!

让我们来想象一个灾难性的场景:

(1)你将解决方案的Qt版本切换到了`msvc2019_64`(64位)。

(2)你在VS的编译目标中,也选择了`x64`。

(3)但是,你的项目中链接了一个你自己编译的、或者是从网上下载的第三方日志库(比如log4cxx),而这个库的`.lib`和`.dll`文件是32位的。

当你点击编译时,链接器会立刻抛出成吨的错误,比如`LNK1112: module machine type 'x86' conflicts with target machine type 'x64'`或者各种`LNK2019: unresolved external symbol`。

为什么会这样?

因为32位和64位的程序在内存寻址方式、函数调用约定等方面是完全不兼容的。你不能在一个64位的程序中,去调用一个32位库里的函数。

如何解决?

**(1)保持一致:**在切换到64位编译前,请确保你拥有的所有第三方库,也都有对应的64位版本。

**(2)自行编译:**如果找不到预编译的64位版本,最好的办法就是获取第三方库的源码,用你的64位编译器(如VS 2019的x64 Native Tools Command Prompt)亲自编译出一套64位的`.lib`和`.dll`。

在过去,这个问题不突出,因为大家基本都在32位环境下工作。但随着现代应用程序对内存的需求越来越大(32位程序最多只能使用约2GB内存),64位开发已成为主流。因此,建立起"架构一致性"这根弦,能为你节省大量的调试时间。

五、总结

掌握`Qt VS Tools`的使用,是提升在Visual Studio中进行Qt开发幸福感的关键。通过本文,我们学习了:

(1)如何通过生成`.pro`和`.pri`文件,在VS和Qt Creator之间搭建协作桥梁

(2)如何通过`Qt Project Settings`,方便地为项目增删Qt模块

(3)如何通过`Qt Options`和`Change Solution's Qt Version`,在多个Qt版本间灵活切换

(4)以及最重要的,时刻警惕32位与64位的架构匹配问题,避免链接错误的深坑。

工具是开发的利器,花一些时间去熟悉它、理解它,它必将在你的开发旅程中给予丰厚的回报。

看到这里了还不给博主点一个:
⛳️ 点赞☀️收藏 ⭐️ 关注

💛 💙 💜 ❤️ 💚💓 💗 💕 💞 💘 💖
再次感谢大家的支持!
你们的点赞就是博主更新最大的动力!

相关推荐
郝学胜-神的一滴2 小时前
QAxios研发笔记(一):在Qt环境下,构建Promise风格的Get请求接口
开发语言·c++·spring boot·qt·ajax·前端框架·软件工程
AA陈超2 小时前
虚幻引擎UE5专用服务器游戏开发-21 连招技能动画蒙太奇播放
c++·游戏·ue5·游戏引擎·虚幻
无敌最俊朗@8 小时前
C++ 序列容器深度解析:vector、deque 与 list
开发语言·数据结构·数据库·c++·qt·list
Humbunklung8 小时前
VC++ 使用OpenSSL创建RSA密钥PEM文件
开发语言·c++·openssl
Humbunklung8 小时前
填坑:VC++ 采用OpenSSL 3.0接口方式生成RSA密钥
开发语言·c++·rsa·openssl 3.0
Larry_Yanan8 小时前
QML学习笔记(十五)QML的信号处理器(MouseArea)
c++·笔记·qt·学习·ui
努力学习的小廉10 小时前
我爱学算法之—— 模拟(下)
c++·算法
Larry_Yanan10 小时前
QML学习笔记(十七)QML的属性变更信号
javascript·c++·笔记·qt·学习·ui
hsjkdhs11 小时前
C++之拷贝构造(浅拷贝与深拷贝)、this指针、内联函数
c++