小伙伴们,大家好,小北师兄又来喂饭啦,从上次写完《一个例子让你秒懂 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\binC:\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 ToolsMicrosoft Visual Studio 14.0

安装 VS2019 独有的目录:

Microsoft SDKsMicrosoft Visual Studio

安装图 4 Microsoft Build Tool 2015 以及 VS2019 后都会有的目录:

MSBuildWindows Kits

喜欢的小伙伴请动动你们可爱的小手,多多点赞!你们的支持为我不断写出干活文章提供源源不断的动力!

关于 Windows 下 Qt 开发,这个问题必须要搞清楚!的更多相关文章

  1. Windows下Qt开发环境:OpenGL导入3DMax模型(.3DS)

    参考:http://blog.csdn.net/cq361106306/article/details/41876541 效果: 源代码: 解释: CLoad3DS.h为加载3DMax模型的头文件,C ...

  2. QT + OpenCV + MinGW 在windows下配置开发环境

           由于研究项目需要,最近开始接触C++界面设计,关于“QT + OpenCV + MinGW在windows下配置开发环境”着实让人头疼,单次配置时间相当长,也十分不容易,本人第一次配置成 ...

  3. 关于windows下QT以及QT creator的安装

    普及  之  windows下qt的安装及配置   qt介绍 : Qt,分为商业.开源两个版本,商业版需要花钱购买license,而开源版本则遵守GPL协议,提供了源码,用户需要自行编译,才能生产动态 ...

  4. 【Objective-C】Windows下Objective-C开发环境配置

    [Objective-C]Windows下Objective-C开发环境配置 ftp://ftpmain.gnustep.org/pub/gnustep/binaries/windows/   最近打 ...

  5. windows下STM32开发环境的搭建

    一.概述 1.说明 笔者已经写了一篇Linux下STM32开发环境的搭建 ,这两篇文章的最区别在于开发环境所处的系统平台不一样,而其实这个区别对于开发环境的搭建其实影响不大,制作局部上的操作上发生了改 ...

  6. windows下spark开发环境配置

    http://www.cnblogs.com/davidwang456/p/5032766.html windows下spark开发环境配置 --本篇随笔由同事葛同学提供. windows下spark ...

  7. 【1】windows下IOS开发基础环境搭建

    一.目的 本文的目的是windows下IOS开发基础环境搭建做了对应的介绍,大家可根据文档步骤进行mac环境部署: 二.安装虚拟机 下载虚拟机安装文件绿色版,点击如下文件安装 获取安装包:       ...

  8. Metabase在Windows下的开发环境配置

    Metabase在Windows下的开发环境配置 */--> pre.src {background-color: #292b2e; color: #b2b2b2;} Metabase在Wind ...

  9. [b0007] windows 下 eclipse 开发 hdfs程序样例

    目的: 学习使用hdfs 的java命令操作 相关: 进化: [b0010] windows 下 eclipse 开发 hdfs程序样例 (二) [b0011] windows 下 eclipse 开 ...

随机推荐

  1. C++ primer plus读书笔记——第13章 类继承

    第13章 类继承 1. 如果购买厂商的C库,除非厂商提供库函数的源代码,否则您将无法根据自己的需求,对函数进行扩展或修改.但如果是类库,只要其提供了类方法的头文件和编译后的代码,仍可以使用库中的类派生 ...

  2. 北航OO(2020)第四单元博客作业暨学期总结

    一.第四单元架构设计 1.第一次作业 我在本次作业中设置了多个储存结构:Directory,ElementsInName,ElementsInId,Cache. Directory: 顾名思义,这是个 ...

  3. win10下卸载ubuntu的合理操作

    这里不推荐使用第三方软件,因为可能会被植入病毒,而且windows自带的命令行工具足以完成任务! win10系统自带的一个命令行工具--diskpart 在cmd中输入"diskpart&q ...

  4. Envoy :V3APi 开启 TLS

    方案架构 本次实例与官方Envoy front_proxy Example相似,首先会有一个Envoy单独运行.ingress的工作是给其他地方提供一个入口.来自外部的传入连接请求到这里,前端代理将会 ...

  5. 有没有一种组合字体,中文是宋体,英文是times new roman?

    有没有一种组合字体,中文是宋体,英文是times new roman? 由于日常科研工作书写需要,想问问各位大神有没有一种字体,中文是宋体,西文是times new roman,这样写论文好方便啊有没 ...

  6. python中类属性和数据属性的解释

    python中的类叫class object,类的实例叫instance object. 类 Class Objects 类拥有两种操作,1.类属性 attribute references 2.实例 ...

  7. Linux创建RAID1_实战

    Linux创建RAID1实战 Linux创建RAID1 RAID1俗称镜像,它最少由两个硬盘组成,且两个硬盘上存储的数据均相同,以实现数据冗余 RAID1读操作速度有所提高,写操作理论上与单硬盘速度一 ...

  8. HDFS 的内存存储是什么?

    引言 HDFS 的定位就是一个文件系统,用于存储文件,而 HDFS 对于文件的存储方式有两种: 内存存储 异构存储 内存存储 什么是内存存储? 首先,我们来了解一下到底什么是 "内存存储&q ...

  9. CentOS 7网络配置

    修改配置文件 CentOS 7下的网络配置文件路径为:/etc/sysconfig/network-scripts/ifcfg-interfacename 配置文件ifcfg-interface-na ...

  10. Linux C 文件IO

    文件IO 2021-05-31 12:46:14 星期一 目录 文件IO 基础IO open 错误 creat read 一个例子 write close lseek 文件空洞 unlink删除 io ...