使用Qt5.7.0 VS2015版本生成兼容XP的可执行程序 good(从VS2012 update1开始支持xp和c++11)
一.直接使用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
简单的说就是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.01
- DEFINES += _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就可以正常运行了,如下图所示。
http://blog.csdn.net/caoshangpa/article/details/53690612
使用Qt5.7.0 VS2015版本生成兼容XP的可执行程序 good(从VS2012 update1开始支持xp和c++11)的更多相关文章
- 使用Qt5.7.0 VS2015版本生成兼容XP的可执行程序
版权声明:本文为灿哥哥http://blog.csdn.net/caoshangpa原创文章,转载请标明出处. 一.直接使用VS2012/VS2013/VS2015生成XP兼容的可执行程序 Visua ...
- 让VC2012生成的程序支持XP系统(QT的DLL都是支持XP的,只与EXE有关)
如果用的编译器是VC2012以上,那么默认生成出的程序是不能运行在XP系统上的.所以需要修改链接参数 我们要做的是修改qmake.conf文件中的参数,文件路径根据开发环境不同而不同下面以5.1.1 ...
- jq1.9.0以上版本不兼容live()解决方法
最近一个项目里用bootstrap做图形渲染,需要用到jq1.9以上版本,而copy的js代码里用到了live()方法,故两者产生了兼容问题,下面是解决方案: $('#my').on("cl ...
- VS2015编译Qt5.7.0生成支持XP的静态库(很不错)
一.编译工具 1.VS2015 编译Qt5.7.0的所需VS版本:Visual Studio 2013 (Update1)或Visual Studio 2015 (Update2).因为Update补 ...
- 【原】webapp开发中兼容Android4.0以下版本的css hack
话说现在的手机型号越来越多,主要还是android和ios这2个巨头称霸了江湖,而他们自带的浏览器内核是webkit,那对于做移动网页开发的同事来说,一般只要做好webkit内核浏览器的展现效果就行了 ...
- QT5.1.0,QT4.8.0以及VC2010、VC2012的测试对比
QT5.1.0,QT4.8.0以及VC2010.VC2012的交叉测试对比. 测试1: 用VC2012静态编译了QT5.1.0. 编译速度很慢,生成完成后,用VC2012+QT5.1.0进行程序生成, ...
- Win10 + VS2015 下编译 Qt5.6.0
近期由于另外一个项目需要用 vs2015 ,于是把 Qt 也升级到了 5.6.0 .由于项目需要兼容 Windows xp ,所以需要自己编译 Qt .这里大致整理一下编译的过程. 安装 Active ...
- QT5.8.0+MSVC2015安装以及环境配置(不需要安装VS2015)
原文:QT5.8.0+MSVC2015安装以及环境配置(不需要安装VS2015) 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/snow_rain_ ...
- 关于Visio Studio 2012使用Nuget获取Sqlite驱动包报错:“System.Data.SQLite.EF6”的架构版本与 NuGet 的版本 2.0.30625.9003 不兼容
背景 笔者的VS2012版本比较老旧,是几年以前下载的.平时添加三方包和驱动包都是手动添加.后来了解到有Nuget这个工具,如获至宝.可是在使用过程中却出了不少问题. 最初,笔者尝试使用Nuget添加 ...
随机推荐
- 4.EasyUI学习总结(四)——EasyUI组件使用 (通过用户登录来演示dialog、ajax的使用,serialize方法的使用,前后台怎样交互等)
一.EasyUI组件的简单介绍 详细可看api: http://www.jeasyuicn.com/api/docTtml/index.htm easyUI提供了很多组件让我们使用,如下图所示: 很多 ...
- Spring+SpringMvc+Mybatis框架集成搭建教程二(依赖配置及框架整合)
依赖导入以及框架整合 (1).打开项目的pom.xml文件,声明依赖 <project xmlns="http://maven.apache.org/POM/4.0.0" x ...
- c语言for循环
#include<stdio.h>#include<windows.h>#include <limits.h>#include <math.h>void ...
- 51nod1118(水题)
题目链接: https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1118 题意: 中文题诶~ 思路: 因为机器人只能往下或者右 ...
- sql对于between和时间
在写时间条件 ,比如 把2014/3/1 到2014/3/31这个时间段做为条件 的话,很多人都会写成这样 select date from table where date between '201 ...
- node 关键点总结
1.I/O密集的地方尽量不要用require.(require是同步I/O操作) eg:正在运行一个HTTP服务器,如果在每个进入的请求上都用了require,就会遇到性能问题.所以通常在程序最初加载 ...
- Leetcode Anagrams
Given an array of strings, return all groups of strings that are anagrams. Note: All inputs will be ...
- 简单说说call 与apply
Function.call() 将函数作为对象的方法调用,例如:function.call(thisobj,args,........); thisobj 调用function的对象.在函数主体中, ...
- $Ajax简单理解
关于web开发的可能我们不能或缺的利器就是$Ajax,我们这里就不具体的将里面的原理(如果大家有时间的话可以好好的看看javascript里面的权威指南)里面讲的比较详细了 这里就在不说了.今天我们就 ...
- Working in Singapore
这篇blog主要是想说说最近以及将来一年的时间需要在Singapore工作的感受.你可能以及猜到了,我现在写这篇blog是在Singapore的Office里面. 在一个月之前还在成都工作,每天9:0 ...