版权声明:本文为灿哥哥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. 2016/4/1 PDO:: 数据访问抽象层 ? :

    ①PDO方式连接 数据库 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&q ...

  2. Django模板语言(二)

    1,装饰器:在不改变原函数的调用方式情况下为原函数增加一些功能(遵循开放封闭的原则) def outter(fn): def inner(*args, **kwargs): # 可以在执行函数前执行一 ...

  3. Koa2学习(二)async/await

    Koa2学习(二)async/await koa2中用到了大量的async/await语法,要学习koa2框架,首先要好好理解async/await语法. async/await顾名思义是一个异步等待 ...

  4. scala wordcount kmeans

    scala wordcount   kmeans k-means算法的输入对象是d维向量空间的一些点,对一个d维向量的点集进行聚类. k-means聚类算法会将集合D划分成k个聚簇.

  5. spring boot实现文件上传下载

    spring boot 引入”约定大于配置“的概念,实现自动配置,节约了开发人员的开发成本,并且凭借其微服务架构的方式和较少的配置,一出来就占据大片开发人员的芳心.大部分的配置从开发人员可见变成了相对 ...

  6. leetcode 400 Add to List 400. Nth Digit

    Find the nth digit of the infinite integer sequence 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ... Note:n is ...

  7. eclipse相关技巧总结

    原文:http://licoolxue.iteye.com/blog/619983 eclipse作为被广泛使用的ide,基本的使用技巧每个人都会一些,然而可能并未充分发掘其潜力,也许我们并没有真正认 ...

  8. 《JAVA与模式》之迭代子模式

    迭代子模式又叫游标(Cursor)模式,是对象的行为模式.迭代子模式可以顺序地访问一个聚集中的元素而不必暴露聚集的内部表象(internal representation). 聚集和JAVA聚集 多个 ...

  9. Java Socket实战之四:传输压缩对象

    转自:http://developer.51cto.com/art/201202/317546.htm 上一篇文章说到了用Java Socket来传输对象,但是在有些情况下比如网络环境不好或者对象比较 ...

  10. Sencha Cmd使用

    通过Sencha Cmd辅助开发基于ExtJS4 MVC的项目 http://www.ineeke.com/archives/1465/ ExtJS4.2:Sencha Cmd 介绍:http://w ...