一.直接使用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中加入:

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

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

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.8.0+VS2015+OpenCV4.1.2 配置Windows 32位和64位平台

    目录 一  目的 二 使用资源 1. QT5.8.0 Windows32位版本 2. OpenCV4.1.2源码 3. CMake 3.18.0 Windows64位版本 4. winsdksetup ...

  2. UG二次开发教程(基于NX12.0/VS2015版本)

    ** UG二次开发教程(基于NX12.0/VS2015版本) 安装教程 ** UG NX12.0安装 NX12.0 安装包下载地址: 链接:https://pan.baidu.com/s/1I0CCF ...

  3. 解决Picasso在Android 5.0以下版本不兼容https导致图片不显示

    近期在项目中遇到了一个问题,使用picasso加载图片在Android5.0以下版本图片显示不来. 由于之前在几个项目中都使用过picasso而且未出现类似问题,觉得值得好好研究一下. 简单定位一下问 ...

  4. 太阳神三国杀学习第一步--编译并运行(qt5.7.0+vs2015)

    起因:     很早就想寻找一个开源的c++项目进行学习,也在很早就发现了太阳神三国杀这个项目,但是之前在github中下载后总是草草编译一直没有编译成功过,最近又重燃斗志决定深入研究一下. 分析应该 ...

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

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

  6. VS2015编译Qt5.7.0生成支持XP的静态库

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

  7. Qt5.9.0下载与安装(windows版本)

    1.下载 Qt5.9.0开源版本官网下载 选择图中2.3GB的安装包,即可进行下载 2.安装 双击安装包,弹出qt5.9.0的安装界面 点击下一步 这里的账户如果没有,可以不填,直接点Next 点击下 ...

  8. okhttp与jdk版本不兼容分析

    1.背景 最近在部署应用的时候,代码几乎没有太大改动.结果报了如下错误[clientBuilder.sslSocketFactory(SSLSocketFactory) not supported o ...

  9. 用VS2015编译Qt5.6.0,WebEngine支持XP

    准备工作 1.下载icu库.openssl库 2.安装activePerl.python.git(请将git的bin目录加入path环境变量) 3.修改控制面板->区域->管理->更 ...

最新文章

  1. java数据结构-HashMap
  2. linux监控是否运行脚本,监控网站是否可以正常打开的Shell脚本分享
  3. 《剑指offer》求1+2+3+...n(不用if、else、乘除等)
  4. Sentinel如何通过限流实现服务的高可用性
  5. 省选专练【POI2015】Podzial naszyjnika
  6. C# visionpro搜索区域拖动改变事件
  7. 近期生活中将会发生的一点变化!
  8. 转:HTTP ---HTTP头的编码问题(Content-Disposition)
  9. Python的time,datetime,string相互转换
  10. wx2540h配置教程_H3C无线AP控制器EWP-WX2540H 无线AP 无线云台控制器 无线控制器
  11. w ndows7旗舰版网卡驱动,windows7万能网卡驱动官方下载
  12. MAC 青花瓷(Charles)爪机HTTPS 抓包
  13. aic值检验 p值_R语言入门之独立性检验
  14. 赶紧收藏!网上疯传的150个ChatGPT「超级提问模型」,都在这里了
  15. 木板切割最优matlab,矩形木板最优切割方案的设计与实现
  16. BibTeX的使用方法
  17. php转换时间戳的一些方法
  18. 【精品盘点】2020年最受欢迎的6个知识库整理软件!
  19. linux查看riak版本,Riak学习(一):Linux Centos 下安装 Riak 服务
  20. Java入门篇——安装Java SE14

热门文章

  1. oracle 11g从DBF文件恢复数据
  2. Java怎么除以2_哪个更好的选项用于将整数除以2?
  3. WPS文档设置空格下划线
  4. loj 6184 无心行挽 虚树+DP+倍增
  5. Qt编写安防视频监控系统1-通道切换
  6. Qt编写安防视频监控系统5-视频回放
  7. 2022年度“十大基础研究关键词”在深发布
  8. 计算机编程背那个英语词汇,编程英语词汇
  9. CODEVS 1258 关路灯
  10. SSR是什么?Vue中怎么实现?