• 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是当前有效。亲测没问题。

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

  • 相关阅读:
    华为云安装Docker,在其中安装Tomcat运行Html项目一步到位
    华为机试真题 C++ 实现【处理器问题】【2022.11 Q4 新题】
    AntPathMatcher路径匹配器,Ant风格的URL
    人工智能时代大模型算法之文心大模型4.0
    Dijkstra求最短路—priority堆优化;
    51单片机LED8*8点阵显示坤坤跳舞打篮球画面
    【深度学习 01】线性回归+PyTorch实现
    UE5笔记【一】安装、第一个关卡:光线、原点、平面;光线、天空、云朵;内容抽屉;运动控制;
    ZYNQ7020开发(二):zynq linux系统编译
    YOLO系列目标检测算法-YOLOv5
  • 原文地址:https://blog.csdn.net/u012999461/article/details/126500200