关于 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 开 ...
随机推荐
- babylin使用思路
- [刷题] 455 Assign Cookies
要求 贪心算法的关键:判断问题是否可以用贪心算法解决 给小朋友们分饼干,每个小朋友"贪心指数"为g(i),饼干大小值s(i) g(i):小朋友需要的饼干大小的最小值 若s(j)&g ...
- exec函数族实例解析-(转自blankqdb)
fork()函数通过系统调用创建一个与原来进程(父进程)几乎完全相同的进程(子进程是父进程的副本,它将获得父进程数据空间.堆.栈等资源的副本.注意,子进程持有的是上述存储空间的"副本&quo ...
- Centos 6.5 启动报错 "Kernel panic - not syncing: Attempted to kill init"解决办法
某一天,开发同事突然告诉我服务器上自己的虚拟机连不上了,我登陆到服务器CAS管理界面,重启虚拟机后发现报错了 问题:Kernel panic - not syncing: Attempted to k ...
- Oracle和MySQL差异总结
常用功能差异 锁差异: • Oracle锁加在数据块上 • InnoDB 是在索引上加锁,所以MySQL锁的粒度没有Oracle 精细. 导入导出: • Oracle采用EXP /IMP ,EXPDP ...
- CentOS7安装开发工具套件时报错解决方案
操作系统:CentOS 7.2 执行安装命令时显示以下信息: [root@DEV-CMDB-DB02 ~]# yum -y groupinstall "Development Tools&q ...
- Go语言安装配置
一.Go语言下载 官方下载地址:https://golang.google.cn/dl/ 选择自己需要的版本下载即可. 二.Go语言安装 下载完成之后,双击go1.16.4.windows-amd64 ...
- Django(44)drf序列化源码分析(1)
序列化与反序列化 一般后端数据返回给前端的数据格式都是json格式,简单易懂,但是我们使用的语言本身并不是json格式,像我们使用的Python如果直接返回给前端,前端用的javascript语言 ...
- 十、.net core(.NET 6)搭建ElasticSearch(ES)系列之Java环境搭建和Node.js环境搭建
安装java jdk环境:我此处使用的是jdk16版本.下载地址: https://www.oracle.com/java/technologies/javase-jdk16-downloads.ht ...
- stream的groupby出来的map是有顺序的map
stream分组后的map是有序map List<RedisInstanceTypeDto> typeDtoList = ModuleHelper.mapAll(redisInstance ...