QtCreate运行程序和直接双击运行程序的区别!

来源:互联网 发布:大数据分析挖掘需求 编辑:程序博客网 时间:2024/04/30 14:18
Qt编程时有时会遇见,有时直接点击可以运行,而在QtCreate里运行却异常退出的情况(或者相反)?
我们来探究下,QtCreate里点击运行,和直接双击程序运行的区别?


为啥有区别?
父进程不同(所以继承的环境变量不同)
直接双击,继承的是系统的PATH变量(不知道win下有没有shell这玩意,就这么理解吧)
在QtCreate点击运行,程序的父进程是QtCreate
QtCreate启动时会继承系统的PATH环境变量,所以在你启动QtCreate后,去添加的系统环境变量,对当前已打开的QtCreate是无效的
所以此时在其中启动程序是找不到库的,也就运行不了,而直接双击程序却是可以运行的

出现原因:在我QtCreate打开后,我去配置了OpenCV的库,出现直接可以运行,QtCreate中异常退出
解决方法:重启QtCreate就行了

如果如上所说,同时使用mingw和vs 的Qt库的同学肯定有疑问了?
因为这两个库编译的程序,是不能兼容对方的库的,如果说QtCreate继承的系统PATH的话
为什么我QtCreate中可以运行,而有时直接双击库函数定位不正确呢?
为什么我在QtCreate中切换发布版本,使用不同编译器时,点击运行,程序都能正常启动的?

原因:
在切换不同发布版本时,Qt的系统环境变量就切换了(例如QT_DIR, QT_INSTALL_LIBS  和 QT_INSTALL_BINS)
同时QtCreate会根据自身的环境变量情况,在自己的PATH最前面加上相应编译器相关的Qt库路径(注意这个最前面)

由于在QtCreate中运行程序,继承的是QtCreate的PATH,而其又在最前面加了相应编译器的Qt库,所以
首先找的肯定是那个Qt库,所以就肯定可以运行
而直接双击运行,就要看你系统PATH配置的是那个编译器的Qt库了

尝试打印这个程序的环境变量
mingw
PATH发现在比系统的PATH环境变量多了(是加到最前面的,可见其心机)
D:\QtSDK\mingw\bin;D:\QtSDK\Desktop\Qt\4.8.0\mingw\lib;D:\QtSDK\Desktop\Qt\4.8.0\mingw\bin;
vs2010
PATH前多了
D:\QtSDK\Desktop\Qt\4.8.0\msvc2010\lib;D:\QtSDK\Desktop\Qt\4.8.0\msvc2010\bin;
还有些其他的

具体原因
源码Qt4RunConfiguration.cpp,可能包含原因,大概扫了一眼,貌似会基于原来的环境变量,改变运行是的环境变量
懒得看了,浪费时间
原创粉丝点击