使用Qt5.7.0 VS2015版本生成兼容XP的可执行程序 good(从VS2012 update1开始支持xp和c++11)

一.直接使用VS2012/VS2013/VS2015生成XP兼容的可执行程序html

Visual Studio刚发布时没打补丁,称为RTM版,以后会陆续发布补丁,进行bug修复和功能加强。VS2010及以前版本的补丁为Service Pack,VS2012及以后版本的补丁称为Update。这些补丁都是向下兼容的,好比说打了Update2补丁,就不须要再打Update1补丁了。web

微软官网上如今只能搜索到VS2010 Service Pack1https://www.microsoft.com/zh-cn/download/details.aspx?id=23691,从该补丁的系统要求能够看出VS2010支持XP、Vista和Win7,可是不支持Win8和Win10。所以用VS2010生成的可执行程序能直接在XP上运行。redis

再来搜索一下VS2012,这里以旗舰版https://www.microsoft.com/zh-cn/download/details.aspx?id=30678为例,从它的系统要求能够看出VS2012支持Win7和Win8,可是不支持XP和Win10。windows

VS201三、VS2015和VS2017的系统要求信息这里https://www.visualstudio.com/zh-cn/productinfo/vs-servicing-vs统一展现了出来,不用再去搜索了。VS2013也只支持Win7和Win8。从VS2015开始新增长了对Win10的支持。为防止网页失效,仍是截个图吧。app

也就是说理论上从VS2012开始,生成的可执行文件就不能再XP上运行了。可是因为XP用户量依然很大,微软在发布了VS2012 RTM没多久,就紧接着发布了Update1补丁,该补丁重要的改进有两处,一是在平台工具集里添加了支持生成运行于XP的选项;二是添加了对C++11特性的支持。工具

如何查看Visual Studio是否打了补丁,方法很简单,点击菜单“帮助”——>“关于 Microsoft Visual Studio”,以下图所示,从图中能够看出个人VS2012是打过Update1补丁的。ui

新建一个基于对话框的MFC工程,名为MFCApplication,而后进行以下设置。google

这样生成的MFCApplication.exe放到XP中,双击直接能够运行,不须要任何依赖,以下图所示。spa

注意“所需最低版本”必定要设置为5.01,若是设置为5.0会提示错误“LNK4010:子系统版本号5.0无效;假定为默认子系统版本”,以下图所示。.net

这里的默认子系统版本就是说,生成的可执行程序只能在VS2012默认支持的系统上运行,也就是Win7和Win8。若是设置为5.02或者其余值,虽然没这个提示了,可是依然会假定为默认子系统版本,放到XP上运行会依然会提示“不是有效的Win32应用程序”,以下图所示。

至于为什么要设置为5.01,能够参考如下两篇博客:

修改WINVER、_WIN32_WINNT和_MSC_VER 

Window系统内核版本号及其查看方法

简单的说就是5.01表示系统内核版本号,若是直接查看的话,会发现XP的内核版本号是5.1,可是Windows系统头文件中却将XP的内核版本号定义为0x0501,所以这里用的是5.01,而不是5.1。

至于VS2013和VS2015,若是只是想生成兼容XP的可执行程序,是不须要打补丁的,由于它们向下兼容VS2012。所以有博客说VS2012必须打Update3补丁纯属扯淡。VS2017还没用过,就不说了。

二.使用Qt5.7.0 VS2015生成XP兼容的可执行程序

使用Qt Creator新建一个基于窗口的test工程,而后在pro中加入:

[cpp]  view plain  copy
 
 在CODE上查看代码片派生到个人代码片
  1. win32 {  
  2. QMAKE_LFLAGS_WINDOWS = /SUBSYSTEM:WINDOWS,5.01  
  3. QMAKE_LFLAGS_CONSOLE = /SUBSYSTEM:CONSOLE,5.01  
  4.   
  5. DEFINES += _ATL_XP_TARGETING  
  6. QMAKE_CFLAGS += /D_USING_V140_SDK71_  
  7. QMAKE_CXXFLAGS += /D_USING_V140_SDK71_  
  8. LIBS += -L$$quote(C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Lib)  
  9. INCLUDEPATH += $$quote(C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Include)  
  10. }  

上面设置是参考了以下两篇文章:

Deploying Qt on XP and getting “not a valid Win32 application”

Qt for Windows - Specific Issues

可是实测时,只需在pro中加入QMAKE_LFLAGS_WINDOWS= /SUBSYSTEM:WINDOWS,5.01(若是程序基于窗口),其余的条件估计是默认设置的。

这些条件还比较好理解的,与直接使用VS时的设置相对应。SDK71就是兼容XP的库,LIBS和INCLUDEPATH给出了其路径,V140是VC的版本,即VS2015。

至于为什么用quote,可参考:Qt在pro文件中加入带空格的路径

这样设置后,生成的test.exe放到XP,双击是不能运行的,会提示缺乏Qt库,这是由于从官网下载的qt-opensource-windows-x86-msvc2015-5.7.0.exe安装包里包含的是Qt动态库,因此发布的可执行程序必须携带相关的Qt库。这里test.exe(Release版)须要Qt5Core.dll、Qt5Gui.dll、Qt5Widgets.dll和于平台相关的插件qwindows.dll,该插件在C:\Qt\Qt5.7.0VS2015\5.7\msvc2015\plugins\platforms目录中,直接将platform文件夹拷贝到test.exe同级目录便可,以下图所示。

这样一来虽然不缺Qt库了,可是会缺乏VS2015运行时库,提示“没有找到MSVCP140.dll......”,以下图所示。

毕竟该Qt5.7安装包不是静态编译的,且编译时没有指定兼容XP,因此会依赖VS2015运行时库。此时须要安装VS2015的vcredist_x86.exe,vcredist_x86.exe如何获取可参考: Qt查找依赖库的简单方法 

将获取的vcredist_x86.exe拷贝到XP中安装便可,安装界面以下图所示。

安装完成后,双击test.exe就能够正常运行了,以下图所示。

http://blog.csdn.net/caoshangpa/article/details/53690612

相关文章
相关标签/搜索