小北师兄做品算法
首发于微信公众号 小北师兄微信
微信 ID: ncuneupa测试
因为排版缘由,文章可能读起来不太清晰,若是想看更好的排版,能够来个人公众号:小北师兄ui
你们好,我是大家的小北师兄,因为工做缘由,最近师兄在自学 Qt 相关知识,提及来师兄在校期间是研究算法的,通常都是纯 C++ 来实现命令行
当时电脑环境以 Linux 发行版 Ubuntu 为主,到了工做中就转向了 Windows,刚开始确实有一些不太习惯,在 Windows 上配置环境通常比较繁琐,并且有些问题网上还不容易找到debug
下面进入正题,使用过 Qt 的都知道,咱们通常创建一个 Qt 工程,都是在 Qt Creator 中根据向导进行创建,这样比较方便,师兄根据以前使用 CMake / Gcc 的经验,因此对 Qt 的编译过程感兴趣,这样之后出了问题,即便不上网,也能够根据本身的理解,找到问题所在3d
师兄在网上找到了一个参考资料“Qt Creator 快速入门”,(关注公众号,后台回复 "Qt" ,就能够获取这个资料的电子版及源码)。code
这本书就简单介绍了这个编译过程,师兄根据资料上的说明,以及本身的试验过程,对这个问题有了一个更深的理解。blog
小伙伴们不要失望,师兄写这篇文章可不是直接照搬资料上的内容,相信小伙伴们通读下来绝对会有收获!图片
文章目录
1 Qt Creator 新建项目及编译过程
2 命令行编译:
1.1 用 Qt 自带环境进行编译
1.2 在 Cmd 终端中直接进行编译
1.3 拓展
本机环境:Windows10 企业版 64 位 + QT5.9.9 + MinGw 5.30 32 位
1 Qt Creator 新建项目及编译过
师兄这里拿出资料上的一个例子(没有 ui 文件的),咱们在 Qt Creator 建立一个 Empty qmake project (空项目),而后本身添加 C++ 文件 main.cpp,该源文件内容以下:
#include <QApplication>#include <QDialog> #include <QLabel>int main(int argc, char **argv) { QApplication a(argc, argv); QDialog w; w.resize(400, 300); QLabel label(&w); label.move(120, 120); label.setText(QObject::tr("Hello")); w.show(); return a.exec(); }
编辑 .pro 文件,添加 greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
便可,而后编译该程序,能够看到编译输出结果以下图 1 所示
图 1 Qt Creator 编译输出结果
小伙伴请对图片上红色框起来的内容 mingw32-make
留个印象,下面还会用到这个。编译完成后就可直接正常运行。
能够看到,用 Qt Creator 建立项目/编译运行项目很是简单,几步操做下来就能够运行一个程序。
2 命令行编译:
为了了解 Qt Creator 背后为你们作的工做,须要知道如何用命令行编译这个程序。咱们先创建一个文件夹 2-2-2,而后将上面写好代码的 main.cpp 原封不动的拷贝到这个文件夹中,目前为止,准备工做完毕,接下来进入正题。
在 Windows 中,须要打开 cmd 这个终端程序(定位到 2-2-2 目录),而后按照以下命令便可编译 Qt 程序,主要步骤以下:
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
这句话mingw32-make -f Makefile.Debug
这个命令来代替(下面会说如何知道的)Note: 若是不知道到 qmake,以及 mingw32-make 都有哪些选项,可使用 --help
参数来查看,好比 qmake --help
,就会列出该命令一些选项参数介绍。
下面以两种方法进行命令行编译
1.1 用 Qt 自带环境进行编译
在电脑的菜单栏中找到 Qt5.9.9(MinGw 5.3.0 32-bit) 这个终端程序(对应到你本身的 Qt 版本便可,这个是 Qt 的运行环境),而后跳转到你的工做目录中,使用上面的命令便可。
1)打开电脑开始界面选择 Qt5.9.9(MinGw 5.3.0 32-bit) 这个终端程序,以下图 2 所示
图 2 Qt 自带环境终端
2)按照下图 3,图 4 方法进行操做便可
图 3 终端运行命令及结果
这里有两点须要注意:
在使用 qmake -project
以后,须要在生成的 .pro
文件中进行 Qt 库的包含,好比我这里就须要添加greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
这一行代码。
黄色画线地方,在这个终端中,前面必须加上 /d
才能跳转到对应的文件夹中,而后再用 qmake -project 便可生成 .pro 文件
继续按照下图 4 方式操做
图 4 终端运行命令及结果
从参考资料上,只说了默认生成 .exe 在 release 文件夹中,没有说明如何生成 debug 版本的 .exe 文件,因此我特地观察了一下 mingw32-make 的输出信息,从上图的红横线部分能够看到 mingw32-make -f Makefile.Release
是读取 Makefile.Release 文件内容进行编译的,结果输出就会进入 release 目录,因此我查看了 mingw32-make 的选项参数,发现 -f 是指定哪一个 Makefile 文件的,所以就得出mingw32-make -f Makefile.Debug
会输出到 debug 目录中,通过实验验证了。
以后经过键入以下命令 cd release &&``2-2-2.exe
就能够正常运行程序了
3)咱们能够大体看一下 Makefile 内容,以下图 5 所示
图 5 Makefile 文件内容
能够看到 CC CXX 表示用了什么编译器,这里用了 gcc/g++,连接器使用了 g++,等等,从这里均可以看到编译程序须要哪些库以及编译选项
1.2 在 Cmd 终端中直接进行编译
在 Win + R
输入 cmd 进入终端,跳转到对应文件夹中,而后运行上述命令,但要注意,你必需要配置好系统的 PATH 环境变量才行,好比我本身配置的环境变量以下图 6 所示
图 6 本机系统环境变量配置信息
以后依次运行如下命令便可
qmake -project` 以后修改 .pro 文件,在运行下面命令,`qmake && mingw32-make
cd release && 2-2-2.exe
便可运行程序
**
**
1.3 拓展
若是按照上面的方法来作,相信你们确定可以成功运行(师兄研究半天才得出的终极结论),可是师兄第一次实验就没有这么幸运了,走了好多弯路,下面师兄就把本身遇到的问题,中间思考过程以及最终结论一一说明
若是大家用过 Qt 开发过界面程序,那么确定遇到过相似下图的问题:
图 7 遇到的问题
师兄作这个实验也遇到了这个问题,首先,师兄没有使用 Qt 自带的运行环境(哈哈 师兄当时多是飘了,不过不飘就不会得出上面的终极结论分享给你们了,算了算仍是不亏的
),就直接打开了 cmd ,而后调用上面 qmake -project ,qmake,mingw32-make 直接一波操做操,心想,确定能够直接运行了
没想到现实 pia pia pia~,运行 .exe 时就出现了上面的提示,师兄当时就蒙了, QT 自带环境也是在终端运行的啊,我也是在终端运行的啊,我在安装 Qt 的时候也设置了环境变量了,为何会出现这个问题呢?
想必你们也是跟师兄有着一样的问题,先看一下这个问题,通常引发这个问题都是缺乏相应的 dll 结尾的动态连接库,那么好办了,通过我这两天对 Qt 的了解,还真的有一个解决方法,那么就是用 Qt 自带的部署程序 windeployqt
,经过这个程序就能够将一些依赖自动复制到你的文件夹中了,而后在运行就会发现解决了,如图 8 所示
图 8 利用 windeployqt 程序运行结果
图 8 中红色框都是 windeployqt 部署程序生成的,会自动的把你的依赖所有拷贝过来,这种也是将本身的程序,放到没有 Qt 环境的计算机上运行的必备操做。
到这里你觉得就完了,不不不,还远远没到,师兄以为每次命令行编译完成后都要部署一下才能运行太麻烦,说明这个方案不适用于日常的开发,只是一种可选择方案,师兄以为这个解决方案就用来发布程序就好了。
这又回到了问题的开始,还记得上面师兄说过这么一句,师兄不用 Qt 自带的环境,就在 cmd 命令行中直接键入相应的命令,以后才出现了问题,那我们就顺藤摸瓜,这个 Qt 环境与我本身直接在命令行中键入命令有什么不同吗?
打开计算机开始界面,找到 Qt 自带环境的应用程序,以下图 9 所示
图 9 Qt 自带环境探索结果
鼠标右键点击 Qt5.9.9(MinGw 5.3.0 32-bit) 以后点击“开文件位置”,获得以下图 10 所示
图 10 Qt 自带环境探索结果 2
能够看到,这里最终会调用一个 qtenv2.bat 的一个脚本文件,目标是:C:\Windows\System32\cmd.exe /A /Q /K D:\Qt\Qt5.9.9\5.9.9\mingw53_32\bin\qtenv2.bat
,(这里多说一句,咱们也能够在启动文件夹中仿照这种方法,执行本身的脚本文件,进而配置相应的环境),到对应文件夹下打开该文件,其内容以下图 11 所示:
图 11 qtenv2.bat 内容
能够看到,这里就设置了一下 PATH 的环境变量,师兄以前也在电脑上设置了环境变量,可是好像与这个有点不同,以下图 12 所示,这是师兄最开始本身电脑的环境变量
图 12 本机最开始的环境变量
通过仔细对比,师兄发现这里多了一个 D:\Qt\Qt5.9.9\Tools\QtCreator\bin;
,且顺序有一点不一样,但也仅仅是多了这一个路径而已,没想到会出现这么大的问题,师兄突发奇想,难道真的是多了一个路径才形成这样的结果吗?若是填加了这个路径,那么顺序变化会不会有影响呢?
接下来师兄就作了以下实验,我直接将这个看似多余的路径给删除了,也就是图 6 所示,而后在 cmd 中进行 qmake && mingw32-make 命令,继续运行 2-2-2.exe ,此时就会正常运行
到目前为止,咱们找到了问题所在,也就是多出来的这个路径形成的,相信你们到这里仍是会有疑问,若是不去掉这个路径还会出现这个问题吗?
师兄又作了下面几个实验,分别设置了 PATH 的环境变量,仅仅顺序不同,在 cmd 中设置一下环境变量顺序,而且重新执行 qmake mingw32-make 命令,下面仅仅列出路径的顺序及对应结果,具体实验结果图就省略了:
set PATH=D:\Qt\Qt5.9.9\5.9.9\mingw53_32\bin;D:/Qt/Qt5.9.9/Tools/mingw530_32\bin;D:\Qt\Qt5.9.9\Tools\QtCreator\bin;%PATH%
结论:这个能够运行
set PATH=D:/Qt/Qt5.9.9/Tools/mingw530_32\bin;D:\Qt\Qt5.9.9\5.9.9\mingw53_32\bin;D:\Qt\Qt5.9.9\Tools\QtCreator\bin;%PATH%
结论:能够运行,说明 Tools/mingw530_32\ 和 5.9.9\mingw53_32 互换位置也能够,它们两个顺序没有影响
set PATH=D:/Qt/Qt5.9.9/Tools/mingw530_32\bin;D:\Qt\Qt5.9.9\Tools\QtCreator\bin;D:\Qt\Qt5.9.9\5.9.9\mingw53_32\bin;%PATH%
结论:不能够运行,说明 Tools\QtCreator 路径要在 5.9.9\mingw53_32 路径后
set PATH=D:\Qt\Qt5.9.9\5.9.9\mingw53_32\bin;D:\Qt\Qt5.9.9\Tools\QtCreator\bin;D:/Qt/Qt5.9.9/Tools/mingw530_32\bin;%PATH%
结论:能够运行,说明 Tools/mingw530_32 路径能够在 Tools\QtCreator\ 路径后面
综合上面实验及其结果,师兄发现了一个有趣的现象,就是 D:\Qt\Qt5.9.9\5.9.9\mingw53_32\bin
与 D:\Qt\Qt5.9.9\Tools\QtCreator\bin
的路径顺序是强相关的。能够没有 D:\Qt\Qt5.9.9\Tools\QtCreator\bin
这个路径,若是在电脑的环境变量中添加了这个路径,那么这个路径 D:\Qt\Qt5.9.9\Tools\QtCreator\bin
必需要在 D:\Qt\Qt5.9.9\5.9.9\mingw53_32\bin
这个路径后面。
相信你们还有一个疑问:D:\Qt\Qt5.9.9\Tools\QtCreator\bin
与 D:\Qt\Qt5.9.9\5.9.9\mingw53_32\bin
路径顺序不一样是如何形成这个问题的?
师兄结合本身的经验,初步的想了一下,应该是 mingw32-make 在执行过程当中,会在系统的 PATH 路径下找到一些东西来执行,刚好,刚刚那两个路径下都有“一样”(或者可代替的)的东西
而后只有 D:\Qt\Qt5.9.9\5.9.9\mingw53_32\bin
路径下的东西才能够,师兄也分别查看了这个文件夹,很遗憾,以师兄的能力,仍是没能找到这两个路径的哪些东西是"同样的",若是有小伙伴知道这个缘由,但愿能私信告诉师兄一下。
到这里,这个问题基本上就算解决了,若是小伙伴有其余理解,或者以为师兄有哪些地方理解有问题,也能够私信师兄哈
喜欢的小伙伴请动动大家可爱的小手,多多点赞!大家的支持为我不断写出干活文章提供源源不断的动力!
推荐阅读
《据说你安装测试 OpenCV 老是不成功?你可能遇到这个坑了!》
《反复研究好几遍,我才发现关于 CMake 变量还能够这样理解!》
《安装完 Ceres 库,官方文档就能扔掉吗?这些潜在的知识你可能还不会!》
来源 | 做者 小北师兄
编辑 | 小北师兄
如需转载,请后台留言
分享给朋友或朋友圈请随意
- END -
以为不错?右下角「点我、点我、点我」