版权声明:本文为灿哥哥http://blog.csdn.net/caoshangpa原创文章,转载请标明出处。

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

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

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

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

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

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

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

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

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

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

这里的默认子系统版本就是说,生成的可执行程序只能在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中加入:

  1. win32 {
  2. QMAKE_LFLAGS_WINDOWS = /SUBSYSTEM:WINDOWS,5.01
  3. QMAKE_LFLAGS_CONSOLE = /SUBSYSTEM:CONSOLE,5.01
  4. DEFINES += _ATL_XP_TARGETING
  5. QMAKE_CFLAGS += /D_USING_V140_SDK71_
  6. QMAKE_CXXFLAGS += /D_USING_V140_SDK71_
  7. LIBS += -L$$quote(C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Lib)
  8. INCLUDEPATH += $$quote(C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Include)
  9. }

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

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就可以正常运行了,如下图所示。

使用Qt5.7.0 VS2015版本生成兼容XP的可执行程序的更多相关文章

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

    一.直接使用VS2012/VS2013/VS2015生成XP兼容的可执行程序 Visual Studio刚发布时没打补丁,称为RTM版,之后会陆续发布补丁,进行bug修复和功能增强.VS2010及之前 ...

  2. jq1.9.0以上版本不兼容live()解决方法

    最近一个项目里用bootstrap做图形渲染,需要用到jq1.9以上版本,而copy的js代码里用到了live()方法,故两者产生了兼容问题,下面是解决方案: $('#my').on("cl ...

  3. VS2015编译Qt5.7.0生成支持XP的静态库(很不错)

    一.编译工具 1.VS2015 编译Qt5.7.0的所需VS版本:Visual Studio 2013 (Update1)或Visual Studio 2015 (Update2).因为Update补 ...

  4. 【原】webapp开发中兼容Android4.0以下版本的css hack

    话说现在的手机型号越来越多,主要还是android和ios这2个巨头称霸了江湖,而他们自带的浏览器内核是webkit,那对于做移动网页开发的同事来说,一般只要做好webkit内核浏览器的展现效果就行了 ...

  5. Win10 + VS2015 下编译 Qt5.6.0

    近期由于另外一个项目需要用 vs2015 ,于是把 Qt 也升级到了 5.6.0 .由于项目需要兼容 Windows xp ,所以需要自己编译 Qt .这里大致整理一下编译的过程. 安装 Active ...

  6. QT5.8.0+MSVC2015安装以及环境配置(不需要安装VS2015)

    原文:QT5.8.0+MSVC2015安装以及环境配置(不需要安装VS2015) 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/snow_rain_ ...

  7. 关于Visio Studio 2012使用Nuget获取Sqlite驱动包报错:“System.Data.SQLite.EF6”的架构版本与 NuGet 的版本 2.0.30625.9003 不兼容

    背景 笔者的VS2012版本比较老旧,是几年以前下载的.平时添加三方包和驱动包都是手动添加.后来了解到有Nuget这个工具,如获至宝.可是在使用过程中却出了不少问题. 最初,笔者尝试使用Nuget添加 ...

  8. Hadoop生态圈-通过CDH5.15.1部署spark1.6与spark2.3.0的版本兼容运行

    Hadoop生态圈-通过CDH5.15.1部署spark1.6与spark2.3.0的版本兼容运行 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在我的CDH5.15.1集群中,默 ...

  9. mysql 安装流程 兼容8.0.0以上版本 解决修改密码规则问题

    背景介绍: 第一次安装mysql服务端,版本8.0.6 遇到了问题:1:不知道流程:2:8.0以上版本密码加密规则修改的解决方案:   1:下载mysql 服务端 https://dev.mysql. ...

随机推荐

  1. 【bzoj2809】[Apio2012]dispatching (左偏树)

    我们需要枚举根,然后从其子树内选尽量多的点,薪水不超过M,可是暴力复杂度不对.于是考虑自下而上合并树(开始每棵树内只有一个节点,就是自己) 每个树是一个堆,我们维护树的节点个数和薪水总和,合并时,不断 ...

  2. github相关

    1 某次release的源码 某次release的源码在release列表中,不在branch中,tag和release是在一起的.所以,下载某个release的源码应该去release中找,而不应该 ...

  3. NSArray, NSSet, NSDictionary

    一.Foundation framework中用于收集cocoa对象(NSObject对象)的三种集合分别是: NSArray 用于对象有序集合(数组)NSSet 用于对象无序集合(集合) NSDic ...

  4. BZOJ_3998_[TJOI2015]弦论_后缀自动机

    BZOJ_3998_[TJOI2015]弦论_后缀自动机 Description 对于一个给定长度为N的字符串,求它的第K小子串是什么. Input 第一行是一个仅由小写英文字母构成的字符串S 第二行 ...

  5. vss操作说明

    vss命令行   一.环境变量配置 “我的电脑”->“属性”->“高级”->“系统环境变量” 1) 添加追加环境变量 名称为:Path:值为:VSS应用程序所在目录 例如:D:\Pr ...

  6. hdu 3507(DP+斜率优化)

    Print Article Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)To ...

  7. 关于ArcGis for javascript的使用

    1.引用ArcGis for javascript核心类库的两种方式: 1.1.下载js包,解压缩放入项目中 1.1.1.下载核心类库压缩文件, 下载地址: https://developers.ar ...

  8. VMware 12安装Mac OS X 10.11&解决上网的问题

    近日想在Win10上安装Mac OS 玩玩,于是上网搜了相关资源,查看了相关经验分享,开始着手安装.系统很快成功安装,但最大问题是虚拟机中的Mac OS无法上网.费了很长时间,最终看到Ping通结果, ...

  9. 莫比乌斯反演总结——Chemist

    懵逼乌斯反演果然名不虚传,自闭了两天的我打算学习一下这一块比较实用的数论内容. (注:1.为了区分狄尼克雷卷积与乘法,本篇文章中乘号全部省略,卷积全部用" * "表示.2.用gcd ...

  10. linux 重名名、删除文件操作

    linux下重命名文件或文件夹的命令mv既可以重命名,又可以移动文件或文件夹. 例子:将目录A重命名为B mv A B 例子:将/a目录移动到/b下,并重命名为c mv /a /b/c 删除文件夹 r ...