关于 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\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

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

相关文章