• 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打开一个工程,转到项目选项卡,如图:

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

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

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

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

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

    发布:

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

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

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

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

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

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

    直接打开bat看看有什么。

     原来它在更改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是当前有效。亲测没问题。

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

  • 相关阅读:
    注意力机制及代码实现
    I2C,UART,SPI(STM32、51单片机)
    MFC Windows 程序设计[337]之历史下拉列表框(附源码)
    单链表的建立(头插法、尾插法)(数据结构与算法)
    全志T113 开发QT播放器导入libcedarc遇到问题
    计算机视觉入门-纹理表示、平均表示法、Mean Shift、图像分割
    【TCP/IP】【调试】丢包、流不通、错包等问题查证手段系列之二——防火墙
    List类的超详细解析!(超2w+字)
    关于软件开发的若干总结(2022-08-27)
    Linux tar命令最佳实践《Linux零基础实战》
  • 原文地址:https://blog.csdn.net/u012999461/article/details/126500200