Qt的环境变量处理与程序发布之间的关系

前言:

个人笔记,欢迎指正。

背景:

最近研究qt如何把windows下开发的程序移植到linux(ubuntu),以及使用qt开发库程序并调用。这就少不了涉及程序发布问题。

换言之,在qt环境下可以调试或者运行开发的程序,离开qt环境直接去文件系统上运行exe是会提示缺少qt的各种库文件的。很显然,qt在运行时可以自动找到这些qt库文件。

按照我的思维,如果想在qt环境外运行开发的exe程序,需要设置系统环境变量path,添加qt的库文件路径。其实这里有个坑,不是添加了所有bin目录就行。我试过,添加多余的路径反而会导致程序报错,且不好找到问题。

所以真正有用的路径是:D:\Qt\Qt5.9.2\5.9.2\mingw53_32\bin。这里是以mingw编译器为例,msvc同理。

其实我已经想不起来是怎么确定是这个路径的了。因此还是需要整个明白。

qt:

先用qt打开一个工程,转到项目选项卡,如图:

Qt的环境变量处理与程序发布之间的关系_第1张图片

 其中最后一项“构建环境”当中,点击详情就看到:

Qt的环境变量处理与程序发布之间的关系_第2张图片

这是windows下的情况,很明显这里有环境变量设置。linux下类似,只是多了一些特有的变量,比如QTDIR之类的。

但是对比系统环境变量,即使安装了qt,也是默认没有qt相关的的内容。

Qt的环境变量处理与程序发布之间的关系_第3张图片

 很显然qt是运行时指定path的。原本我一直想弄明白它怎么玩的。

先换一下脑子,说说发布。

发布:

基于上面的情况,离开qt环境运行开发的exe,必然要报错找不到qt库文件。所以大家都知道使用windeployqt程序来输出依赖文件。

有不少大师都给出了各方面相近的说明,比如这个:

windeployqt.exe的使用与避坑(windows平台)_撬动未来的支点的博客-CSDN博客_windeployqt

归纳一下就是从命令行运行windeployqt程序时,不要随便从cmd开始,从qtcreator里面的“在此弹出命令提示”也不行。一般qt在开始菜单里有相应的快捷方式,从那里运行才可以。

Qt的环境变量处理与程序发布之间的关系_第4张图片

 所以这就是线索。右键能定位到快捷方式的位置,再查看快捷方式的属性。

Qt的环境变量处理与程序发布之间的关系_第5张图片

 它指向了一个qt编译器目录中的批处理qtenv2.bat。

直接打开bat看看有什么。

Qt的环境变量处理与程序发布之间的关系_第6张图片

Qt的环境变量处理与程序发布之间的关系_第7张图片

 原来它在更改path值。

这里要说明,windows的cmd跟linux的虚拟终端一样,它对环境变量的设置只对当前终端有效,不会影响环境变量的固有值。

还是要插一句。在学习linux的时候,理论上配置文件都是临时生效的,只要关闭系统全歇菜。但是为什么有很多配置可以是永久有效呢?因为初始化的时候,系统有自己的加载顺序。如果每次开始都先加载某个配置文件,它当然开机就有效。

这还涉及生效范围的问题,每个版本的linux可能会有区别。有兴趣的朋友可以研究一下linux配置文件的加载顺序和具体作用。

所以,我想windows也是类似的。学习linux对很多原理理解很有帮助。

分析总结:

由上面的bat文件可以看出,qt每次启动应该是执行这个批处理的,用于构建临时的环境变量。不过我没有尝试,有兴趣可以改一下这个文件,再启动qt看看效果。

因此,这就说明了一些问题:

为什么windeployqt不能在随便一个cmd中执行?因为它需要这个批处理初始化环境。

为什么离开qt环境exe就不能运行?因为没有这个bat初始化环境变量,所以手动添加后就可以运行。

为什么环境变量PATH的具体位置应该是X:\Qt\Qt5.9.2\5.9.2\mingw53_32\bin?因为通过bat的内容就可以知道qt运行环境的定义。

实践可以证明一下。随便从哪个位置打开cmd,先把qt路径加入PATH,再运行windeployqt打包,整个过程不要退出cmd窗口, 因为这里设置的PATH是当前有效。亲测没问题。

所以之前大师们总结的各种坑,这里都一定程度上有了解释,以及思考方法。

你可能感兴趣的:(c++,qt,windows,开发语言)