让用VS2012/VS2013编写的程序在XP中顺利执行

  微软为了推销自家平台,默认配置下VS2012和VS2013编写的应用程序仅仅能在Vista/Win7/Win8上执行。但幸好还保留了生成XP程序的设置项。XP和Win2003的用户还是大量存在的,我们程序软件的公布不能不考虑他们。

  1. 项目菜单->项目属性->配置属性->常规->平台工具集,选择“VS2013WindowsXP(v120_xp)”;

  2. 项目菜单->项目属性->配置属性->常规->MFC的使用。选择在静态库中使用MFC;

  3. 项目菜单->项目属性->链接器->系统->子系统->控制台或窗体windows(依据你的项目类型选择),第二项版本设成5.01。

  4. C/C++->代码生成->执行库,选择“多线程调试(/MTd)";

  5. 还须要至少带有Update3(或4)。这一点我没有验证,由于我直接安装的就是带有Update3的VS2013。

  以上就OK了。

缺点仍然有。比如静态编译的EXE比正常动态要大不少,眼下我尚未试出动态编译后在XP中能执行的方法,--只是这个不要紧,由于VS2013版本号如此之高,客户的电脑上非常难自带配有它的执行库,你即使动态编译。公布软件时也还是要带上执行库的。仅仅只是在多个程序时仅仅需带一份执行库罢了。

  另外,我在实际大项目中用上述方法,仍有出错现象发生。以后再研究吧。

普通情况下上述方法就能够了。

  在网上另外发现了这个贴子,说得非常具体,包含非IDE的命令行编译,一起贴到以下:

  问题一:编译出来的exe在xp上面执行提示“不是有效的win32应用程序”

  在vs2012/2013版本号里面,其自带的c编译器cl.exe。若直接使用cl a.c编译。那么生成出来的exe放在vista及以上版本号直接执行没有问题。可是在xp上则会出来“不是有效的win32应用程序”的出错提示。这是由于vs2012/2013自带的c编译器默认情况下生成的exe会默认仅仅支持vista及以上版本号的windows系统。

  解决方法:

  对于使用命令行cl.exe直接编译的方式:

先用cl a.c编译一遍。此时会生成a.exe和a.obj两个文件。此时,再运行 link b.obj /subsystem:console,5.01,它会链接一个新的a.exe出来,此时的exe就能够在xp上运行了。相比vs2010以及曾经版本号的编译器编译,会多第二步的link过程。后面的參数也非常easy理解。subsystem,5.01。此处的5.01是指的windows内核版本号号,5.01表示windows 2000 with sp1,即此exe能够在win2000 sp1及以上的windows中运行。

  当然,这个地方的/subsystem后面有非常多參数,上面给的console,5.01是指命令行程序。假设是有GUI即有窗体的程序,改成windows,5.01就可以。。!

注意!

!此处的5.01一定不要想当然改成5.0就变成windows 2000 不带sp1的版本号。实际上,5.0并不被vs2013的编译所承认,会报警告不认5.0。就会依照默认的不带5.01的方式编译,这样就无法在vista下面的系统中执行生成的exe了。

  对于在vs2013里面使用新建项目的方式:

右击对应的项目。选择“属性”,在项目属性页中的“配置属性”以下的“常规”里面,把“平台工具集”,由“Visual Studio 2013 (v120)”改成“Visual Studio 2013 - Windows XP (v120_xp)”。确定之后,又一次生成项目就可以。当然这里按这样改动的话,就仅仅能在winxp及以上的版本号系统里面执行了。

  问题二:用vs2010/2012/2013编译出来的exe在未安装vc++执行库的机器上执行时提示”未找到MSVCR120D.DLL“从而无法执行

  这是个老问题了,无非就是执行库动态编译和静态编译的问题了。dll动态载入的话有个优点,它能够降低生成的exe文件的体积,可是缺点就是假设相应的系统环境变量或者exe所在的文件夹里面找不到其所须要的dll文件的话,程序就会拒绝执行。而静态编译就是把全部须要的库都静态编译到exe文件中面。这样就能够在全部的系统平台上都能执行。但它也有一个缺点,就是生成的exe文件由于已经带了部分库的代码,所以体积会相对动态编译出来的exe大(详细大多少要依据库的内容才干确定)。

  解决方法:

  对于直接使用cl.exe和link.exe编译连接的方式:

直接在cl.exe编译的时候或者在makefile里面把编译參数加上/MT就可以。

  对于在vs2013里面使用新建项目的方式:

右击对应的项目,选择“属性”,在项目属性页中的“配置属性”以下的“C/C++”以下的“代码生成”一项。由默认的“多线程调试DLL (/MDd)”,改成“多线程 (/MT)”。确定之后。又一次生成项目就可以。

这样所得的exe文件就是静态编译了。

时间: 07-26

让用VS2012/VS2013编写的程序在XP中顺利执行的相关文章

【Visual Studio】让用VS2012/VS2013编写的程序在XP中顺利运行(转)

原文转自 http://blog.csdn.net/asanscape/article/details/38752655 微软为了推销自家平台,默认配置下VS2012和VS2013编写的应用程序只能在Vista/Win7/Win8上运行.但幸好还保留了生成XP程序的设置项.XP和Win2003的用户还是大量存在的,我们程序软件的发布不能不考虑他们. 1. 项目菜单->项目属性->配置属性->常规->平台工具集,选择"VS2013WindowsXP(v120_xp)&quo

用VS2012 VS2013编写的程序无法再xp运行的解决方法

所需最底版本填写5.01就行了,另外要带上12/13的依赖库,直接静态编译MFC就行了.

VS2013编写的C#程序,在xp下会报错说“不是合法的win32程序”。

VS2013编写的程序,在xp下会报错说“不是合法的win32程序”. 这个用C++编写的程序可以经过设置后在XP下运行,主要的“平台工具集”里修改就可以.方法见: http://blog.csdn.net/civilman/article/details/40109685 但是,用C#编写的程序,项目属性里是没有“平台工具集”的选项的,运行时会报错说不是正常的win32程序. DotNet版本为2.0,在xp下已经安装dotnet20. 请问,有谁知道如何让VS2013编写的C#程序在XP下运

Qtcreator编写ros程序:无法启动进程"catkin_make" -DCMAKE_BUILD_TYPE=Debug

利用Qtcreator编写ROS程序,你必须先进行相应的配置:在启动qtcreator环境时先把ros环境添加进.(即~/.bashrc文件) 1 版本问题 QT4 与 QT5 sudo    gedit ~/.local/share/applications/DigiaQtOpenSource-qtcreator.desktop     (qt5       默认安装的路径下) 当打开文件是空时,关闭.按照路径打开文件 cd ~/.local/share/applications/ gedit

2-使用记事本编写JAVA程序

第一步:使用记事本编辑,myProgram.java,源文件后缀名为.java 第二步:编译,javac,编译过后生成.class文件,即字节码文件 第三步:使用解释器,java 详细:新建记事本——更改文件名(包括后缀名,改为.java)——编写程序——编译——解释 测试代码: public class HelloWorld{ public static void main(String[] args){ System.out.println("welcome to imooc!")

编写JAVA程序

一.编写JAVA程序 编写JAVA程序,输出一行文本信息:“Hello world”,选择编辑器eclipse,打开之后编写程序 1 public class Hello{ 2 3 public static void main(String[] args){ 4 System.out.println("Hello world"); 5 } 6 } 行1:开始声明一个类,类名为hello,class是JAVA的关键字,用来定义类,public为访问说明 行3:是JAVA应用程序必须包含

编写一个程序找出100~999之间所有的水仙花数

如果一个3位数等于其各位的立方和,称该数为水仙花数. 如,所以407是一个水仙花数,编写一个程序找出100~999之间所有的水仙花数. 1 #include<stdio.h> 2 #include<stdlib.h> 3 //判断水仙花数,是则返回1 4 int isNarcissus(int n); 5 6 int main() 7 { 8 int i; 9 for(i = 100; i < 1000; i++) 10 if(isNarcissus(i)) 11 print

编写词法分析程序

Note: 这学期修了严厉的Mr.J的编译原理,不定期更新笔记! 欢迎指正! TEST 语言的词法规: 标识符:字母打头,后接任意字母或数字 保留字:标识符的子集,包括:if,else,for,while,do, int,write,read, 无符号整数:由数字组成,但最高位不能为0,允许一位的0, 分界符:(.).;.{.} 运算符:+.-.*./.=.<.>.>=.<=.!=.== 注释符:/* */ 正则表达式: 标识符:        ( a|b|--|z|A|B--|Z

用python + hadoop streaming 编写分布式程序(二) -- 在集群上运行与监控

写在前面 前文:用python + hadoop streaming 编写分布式程序(一) -- 原理介绍,样例程序与本地调试 为了方便,这篇文章里的例子均为伪分布式运行,一般来说只要集群配置得当,在伪分布式下能够运行的程序,在真实集群上也不会有什么问题. 为了更好地模拟集群环境,我们可以在mapred-site.xml中增设reducer和mapper的最大数目(默认为2,实际可用数目大约是CPU核数-1). 假设你为Hadoop安装路径添加的环境变量叫$HADOOP_HOME(如果是$HAD

linux中VI编写C程序。。。

在linux中编写C程序时不像编写shell那样开头要#!/bin/bash,但是在C程序中要指定头文件(头文件是只输入输出,宏等,而且要首先声明,也是必须要开始就声明的) 写好C代码后要给C文件赋予可执行权限(chmod  755  xx.c) 然后用gcc编译(方法和shell类似,shell是bash xx.sh   ,    而C是gcc xx.c ,C的程序文件名都是以 .c 结尾 , shell是都是以 .sh 结尾) 以下上实例: [[email protected] ~]# vi