关于 Windows 下 Qt 开发,这个问题必须要搞清楚!
小伙伴们,大家好,小北师兄又来喂饭啦,从上次写完《一个例子让你秒懂 Qt Creator 编译原理》后,师兄对于 Qt 的一些环境配置有了更深的理解,这对师兄进行 Qt 的后续学习起到了很大的促进作用。
文章首发于微信公众号 小北师兄,里面还有更多精彩内容值得你们拥有!
师兄除了工作时间外就在进行 Qt 的基础学习,说来也巧,师兄自学过程中一直在使用 Qt Creator 这个开发环境,从没有想过使用 Visual Studio 这个庞然大物。结果在学习 Qt 插件的时候就间接涉及到了 Visual Studio。下面听师兄一一道来,里面会涉及到 Windows 下 Qt 开发的一些重点问题
师兄电脑基础环境:
Win10 + Qt 5.9.9 MinGW/g++
最近师兄在学习创建 Qt 插件相关的知识,也就是《Qt Creator 快速入门》这本书的第 9 章的 9.3 小节,其中这个小节讲到了,基于插件架构可以使用自定义部件,也就是说我们可以设计一款 Qt 设计师界面中没有的部件给其他人用,当然也可以用别人设计好的部件,这确实是一个很方便的功能。
看到这里,师兄就按照书中的步骤定义了一个部件,接下来就是编译自定义部件以及将生成的动态库放到了指定目录中,师兄满怀欣喜的打开 Qt Creator 新建了一个 Widget Application 项目,心想这回可以看到刚才自定义的部件了,结果,结果,结果。。。就是什么都没发现,没有看到自己定义的部件
师兄根据书上的提示以及在帮助文档中查看 "Adding Qt Designer Plugins" 相关内容才知道是怎么回事。实际上,Windows 平台 Qt Creator 是由 Visual Studio 编译生成的程序(用的 MSVC 编译器),而 Qt Creator 编译程序时默认用的编译器是 MinGW(安装 Qt 时自动下载好的),也就是说自定义的插件是 MinGW 编译成的动态库。由于两个编译器不同,那么 Qt Creator(由 MSVC 编译器编译生成的) 无法动态加载插件(由 MinGW 编译器编译生成的库),结果就是打开 Qt Creator 后看不到自定义的插件。
问题找到了,那么如何才能在 Qt Creator 中使用自定义的插件呢?解决方法有两个:
第一,用 MinGW 编译一个 Qt Creator 出来(源码自己编译),那么 Qt Creator 就可以加载 MinGW 编译出来的插件了
第二,将当前的 Qt Creator 的编译器改成 MSVC(下载安装一个这种编译器进行配置),注意 MSVC 的版本要与 Qt Creator 的版本一致(注:Qt Creator 这个软件当时用的 MSVC 的某个版本编译生成的),然后从新编译插件程序,这样新生成的插件就可以被 Qt Creator 加载了
其中最简单就是方法二,安装 MSVC 编译器,首先要确定我们到底要下载安装哪个版本的 MSVC ,打开 Qt Creator ,点击帮助-> About Qt Creator,如下图 1 所示

图 1 Qt Creator 版本信息
可以发现该版本的 Qt Creator 是由 MSVC 2017 32 位编译器编译生成的。因此第一选择就是下载 MSVC 2017 版本的编译器;第二选择就是下载一个兼容的 MSVC 2015 版本(经过上面自定义部件实验已经验证过了,这个版本的编译器也可以)。先说结论,师兄最后下载的是 MSVC 2015。
有必要解释一下为何选择 MSVC2015。师兄在安装 Qt5.9.9 时选择了很多编译器组件(与编译器的版本对应),如图 2 所示,这里就是师兄安装的 Qt 的编译器组件

图 2 Qt 编译器组件
从图 2 中可以看到,Qt5.9.9 支持的编译器不太多,这个要追溯到师兄安装 Qt5.9.9 组件选择界面来,如下图 3 红色框所示,这是师兄安装 Qt5.9.9 时选择的组件界面,已经把该版 Qt 支持的所有 MSVC 编译器组件下载下来了。

图 3 安装向导的编译器组件
发现没,这里的组件确实没有 MSVC 2017 32 位的,只有 64 位的,如果使用 MSVC2017 64 位的编译器编译插件代码,那么 Qt Creator 是无法链接 64 位的库的,那么只能放弃下载 MSVC 2017 了。
可以看到 MSVC 2015 32 位是有的,那么就决定下载 MSVC 2015,查到网上有些资料,建议直接下载个 VS2015,然后就会自带 MSVC 2015 版本了,这种对于师兄的电脑来说不太友好,因为师兄的笔记本电脑已经有了 VS2019 了,如果在下载一个 VS2015 那么电脑的空间吃不消,因此又在网上查了一下,有人说,可以到 VS 官网直接下载 VS 2015 的工具,该下载界面如下图 4 所示

图 4 VS2015 编译工具
可以看到这两个工具的说明,第一个英文名叫做 Microsoft build tools, 是一个 Windows 平台下的编译工具,包含了 MSVC(Microsoft Visual C++),第二个是 Windows 平台的基础库,是 C++ 应用程序运行的基础组件。师兄仅仅下载安装了第一个 Microsoft 生成工具,因为师兄之前安装 vs2019 时,已经默认安装了第二个。
此时 MSVC 2015 安装完毕,那么打开 Qt Creator 配置一下编译器,下图 5 所示为配置好的界面

图 5 Qt Creator 编译器配置
这个时候还要测试一下编译器是否真的配置成功,师兄打开了一个原来的工程,从新用 MSVC2015 编译,测试一下。很遗憾,编译出现了图 6 所示的编译问题,这说明师兄配置还是有点问题,不过不要慌,先看看编译的错误信息

图 6 MSVC 2015 编译结果
看一下框住的那句错误提示,可以发现,Qt Creator 内置编译器在链接阶段无法找到 rc.exe 这个程序,导致链接失败。师兄又在网上找了一下这个问题的解决方案,有的说在 VS 安装目录找到 rc.exe 以及 rcdll.dll 拷贝到 Qt 安装目录的某个目录下,比如我这里的 D:\Qt\Qt5.9.9\5.9.9\msvc2015\bin 和 C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin 目录下
这种方法师兄没有尝试过,觉得不是最好的办法,而且还有一定的局限性。
不知道你们有没有发现一个问题,比如师兄利用 Everything 搜索了一下 rc.exe ,会发现有好几个目录中都有这个文件,如图 7 所示,如果就用拷贝的方法,到底拷贝哪一个呢?这个问题也引发了一些其他问题,师兄继续往下说,后面会有答案

图 7 rc.exe 搜索结果
从图 7 中可以发现 rc.exe 主要存在目录是 C:\Program Files (x86)\Windows Kits,这个文件夹又包含了两个文件夹,如图 8 所示

图 8 Windows Kits 包含目录
从图中紫色框修改日期中可以发现,这两个目录时间与师兄安装 VS2019 以及图四 VS2015 生成工具的时间是一一对应的。至少可以说明 Windows Kits 这个文件夹是由 VS2019 安装程序创建的,存放一些工具包供给开发者使用。
既然这两个目录中都含有 rc.exe 这个程序,那么哪个才是我们需要的程序呢?
答案是,需要查看当前 Qt Creator 构建套件所使用的 Windows Kits 版本信息
打开 Qt Creator ,配置 MSVC2015 32 位构建套件,然后查看使用的系统环境变量,需要找到 Window kits 类似的环境变量,如下图 9 所示

图 9 MSVC 环境变量
从图中的黄色画线部分就可以发现,直接指向 Windows Kits\10 这个目录,因为师兄使用的是 32 位的 MSVC2015,因此根据图 7 的搜索结果很快就能找到 rc.exe,既然已经找到了 rc.exe ,那么就可以按照网上的做法将 rc.exe 以及 rcdll.dll 拷贝到对应的目录。
师兄没有立刻进行拷贝,师兄觉得不能因为提示说找不到 rc.exe 就简单拷贝这个,如果拷贝完了还缺少其他东西呢,拷贝总不是一个很好的解决方案,师兄再次查看了一下图 6 编译时的输出信息,发现了编译的流程,它开始用 cl.exe 进行单元编译,然后调用 link.exe 进行链接,然后就输出了这条错误信息 LINK : fatal error LNK1158: cannot run 'rc.exe',这里可以推断出,应该是 link.exe 程序内部调用了 rc.exe 这个程序,结果 link.exe 程序始终找不到 rc.exe 这个程序。这里大家是不是很熟悉,师兄在上一篇《一个例子让你秒懂 Qt Creator 编译原理》中就遇到有类似的场景,而且特意观察了一下 Makefile.Debug 文件的内容,这些对于解决问题都是很有帮助的。
那么最正统的解决方案是修改系统的环境变量,只要将确定好的 rc.exe 所在的目录添加到系统的 PATH 环境变量中即可(这点与 Linux 差不多),如图 10 所示即为师兄电脑的环境变量,这也是师兄觉得最好的解决方法。之后从新打开 Qt Creator 以及之前的测试工程,发现编译运行成功。

图 10 添加后的系统环境变量
到这里,其实 MSVC 2015 这个编译才算是配置成功,紧接着师兄从新编译文章最开始说的自定义组件程序,这回终于可以在 Qt Creator 的集成 Qt designer 界面中看到自定义的部件了,大功告成,
实际上,师兄在解决上述问题的时候也查阅了很多资料,觉得 Windows C 盘目录是一个盲区,因此特意查看了一下 Windows 系统 C 盘目录的含义,重点关注了 VS2019 安装后会生成哪些相关的重点目录, 师兄一直在找 VS2019 安装的 log 文件(类似 Linux 系统安装软件包时会自动记录安装的位置信息以及安装内容),但是很遗憾,没有找到这样的文件,导致师兄无法真的知道 VS2019 到底新建立了哪些目录,只能根据自己安装 VS2019 的时间进行推测。
因为 C 盘的 Program Files(x86) 是应用程序安装目录,因此师兄主要把这个目录与 Visual Studio 以及有关 C++ 应用开发的相关文件夹列出来(不一定全,这几个文件夹对于日常开发来说是有用的)
安装图 4 Microsoft Build Tool 2015 后单独拥有的目录:
Microsoft Visual C++ Build Tools,Microsoft Visual Studio 14.0
安装 VS2019 独有的目录:
Microsoft SDKs,Microsoft Visual Studio
安装图 4 Microsoft Build Tool 2015 以及 VS2019 后都会有的目录:
MSBuild,Windows Kits
喜欢的小伙伴请动动你们可爱的小手,多多点赞!你们的支持为我不断写出干活文章提供源源不断的动力!
关于 Windows 下 Qt 开发,这个问题必须要搞清楚!的更多相关文章
- Windows下Qt开发环境:OpenGL导入3DMax模型(.3DS)
参考:http://blog.csdn.net/cq361106306/article/details/41876541 效果: 源代码: 解释: CLoad3DS.h为加载3DMax模型的头文件,C ...
- QT + OpenCV + MinGW 在windows下配置开发环境
由于研究项目需要,最近开始接触C++界面设计,关于“QT + OpenCV + MinGW在windows下配置开发环境”着实让人头疼,单次配置时间相当长,也十分不容易,本人第一次配置成 ...
- 关于windows下QT以及QT creator的安装
普及 之 windows下qt的安装及配置 qt介绍 : Qt,分为商业.开源两个版本,商业版需要花钱购买license,而开源版本则遵守GPL协议,提供了源码,用户需要自行编译,才能生产动态 ...
- 【Objective-C】Windows下Objective-C开发环境配置
[Objective-C]Windows下Objective-C开发环境配置 ftp://ftpmain.gnustep.org/pub/gnustep/binaries/windows/ 最近打 ...
- windows下STM32开发环境的搭建
一.概述 1.说明 笔者已经写了一篇Linux下STM32开发环境的搭建 ,这两篇文章的最区别在于开发环境所处的系统平台不一样,而其实这个区别对于开发环境的搭建其实影响不大,制作局部上的操作上发生了改 ...
- windows下spark开发环境配置
http://www.cnblogs.com/davidwang456/p/5032766.html windows下spark开发环境配置 --本篇随笔由同事葛同学提供. windows下spark ...
- 【1】windows下IOS开发基础环境搭建
一.目的 本文的目的是windows下IOS开发基础环境搭建做了对应的介绍,大家可根据文档步骤进行mac环境部署: 二.安装虚拟机 下载虚拟机安装文件绿色版,点击如下文件安装 获取安装包: ...
- Metabase在Windows下的开发环境配置
Metabase在Windows下的开发环境配置 */--> pre.src {background-color: #292b2e; color: #b2b2b2;} Metabase在Wind ...
- [b0007] windows 下 eclipse 开发 hdfs程序样例
目的: 学习使用hdfs 的java命令操作 相关: 进化: [b0010] windows 下 eclipse 开发 hdfs程序样例 (二) [b0011] windows 下 eclipse 开 ...
随机推荐
- 有关80386cpu在保护模式下的虚拟地址,线性地址和实际物理地址的关系
80386cpu是8086cpu的升级版,其具有32位的寄存器.(32根地址线和32根数据线) 8086cpu其是16位的寄存器但是其地址线有20根,其寻址范围为2的20次方,但是有一个16位的寄存器 ...
- MySQL从库维护经验分享
前言: MySQL 主从架构应该是最常用的一组架构了.从库会实时同步主库传输来的数据,一般从库可以作为备用节点或作查询使用.其实不只是主库需要多关注,从库有时候也要经常维护,本篇文章将会分享几点从库维 ...
- [BD] HBase
NoSQL数据库 关系型数据库:用表格的行-列来保存数据,OLTP,写入多,行式存储 非关系型数据库:只用来存储数据,业务逻辑由应用程序处理,OLAP,查询多,列式存储 常见NoSQL数据库 Redi ...
- 76-Java安装Eclipse并创建第一个HelloWorld.md
76-Java安装Eclipse并创建第一个HelloWorld.md 首先确定已经安装Java系统环境,若未安装,请参考博客Java环境windows搭建 访问Eclipse官网 下载完成直接发送快 ...
- 利用redis未授权访问漏洞(windows版)
0x00 原理 首先需要知道的是,redis是一种非关系型数据库.它在默认情况下,绑定在0.0.0.0:6379 ,若不采取相关策略,比如添加防火墙限制非信任IP访问,会使得redis服务暴露到公 ...
- Manjaro Linux安装singularity-container
技术背景 容器化技术在各种生产领域已经得到了广泛的应用,这得益于容器的轻量化(相比于虚拟机而言),安全性(隔离弱于虚拟机,但是权限控制得当的情况下也可以认为是安全隔离的)以及系统级虚拟化带来的高可用性 ...
- 论文阅读:MDNet: Learning Multi-Domain Convolutional Neural Networks for Visual Tracking
前言 CVPR2016 来自Korea的POSTECH这个团队 大部分算法(例如HCF, DeepLMCF)只是用在大量数据上训练好的(pretrain)的一些网络如VGG作为特征提取器,这些做法 ...
- A100计算能力
A100计算能力 A100 GPU支持新的计算功能8.0.表1比较了NVIDIA GPU架构的不同计算功能的参数. 表1.计算能力:GP100 vs. GV100 vs. GA100. MIG架构 尽 ...
- TVM中的调度原语
TVM中的调度原语 TVM是一种用于高效内核构造的领域专用语言. 本文将展示如何通过TVM提供的各种原语来调度计算. from __future__ import absolute_import, p ...
- ARMed解决方案对DSP的战争
ARMed解决方案对DSP的战争 ARM体系结构简化了数字信号处理 ARM与数字信号处理(DSP)有什么关系? ARM似乎在处理领域处于领先地位.该处理器已将其视为其最大的细分市场之一,这主要是由于该 ...