关于 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 开 ...
随机推荐
- MongoDB评论管理
MongoDB简介 文章评论数据分析 相较于一般数据,文章评论一般有如下特点: 数据量巨大.通常评论量要比帖子.文章大很多 写入操作频繁. 价值较低.一般来说,我们的主要目标还是在帖子(文章)本身. ...
- python爬虫——《英雄联盟》英雄及皮肤图片
还记得那些年一起网吧开黑通宵的日子吗?<英雄联盟>绝对是大学时期的风靡游戏,即使毕业多年的大学同学相聚,难免不怀念一番当时一起玩<英雄联盟>的日子. 今天就给大家分享一下英雄及 ...
- Codeforces Round #660 (Div. 2)
A. Captain Flint and Crew Recruitment 题意:定义了一种数(接近质数),这种数可以写成p*q并且p和q都是素数,问n是否可以写成四个不同的数的和,并且保证至少三个数 ...
- JVM内存溢出后服务还能运行吗
文章开篇问一个问题吧,一个java程序,如果其中一个线程发生了OOM,那进程中的其他线程还能运行吗? 接下来做实验,看看JVM的六种OOM之后程序还能不能访问. 在这里我用的是一个springboot ...
- LVHA爱恨原则
关于link 和 visited是否访问过,讲得应该是对浏览器而言该网页之前是否访问过, 而不是只对单次生成页面而言
- [笔记] c和指针
1.简介 2.基本概念 3.指针 计算机内存的最小单位是位(bit),每个位可以容纳值0或1,单独的位用处不大,通常许多位合成一组作为一个单位,以存储较大范围的值 每个字节包含8位,可以存储无符号值0 ...
- zabbix官方源替换为阿里云的zabbix源,一键脚本。(安装zabbix报错curl#18 - "transfer closed with 2988713 bytes remaining to read":15 ETA Trying other mirro)
最近突然安装zabbix总是报错,比如 (24/27): t1lib-5.1.2-14.el7.x86_64.rpm | 166 kB 00:00:00 zabbix-web-4.4.6-1.el7. ...
- Ansible_使用jinja2模板部署自定义文件
一.jinja2简介 1.jinja2模板 1️⃣:Ansible将jinja2模板系统用于模板文件,Ansible还使用jinja2语法来引用playbook中的变量 2️⃣:变量和逻辑表达式置于标 ...
- shell基础之综合练习
0.脚本一键完成下面所有操作1.准备2台centos7系统的服务器,远程互相免密登录,以下所有题目过程中开启防火墙2.给1号机和2号机使用光盘搭建本地yum源(永久生效)3.给服务器1添加2块硬盘,1 ...
- MyBatis 高级查询环境准备(八)
MyBatis 高级查询 之前在学习 Mapper XML 映射文件时,说到 resultMap 标记是 MyBatis 中最重要最强大也是最复杂的标记,而且还提到后面会详细介绍它的高级用法. 听到高 ...