关于vs2012/2013的C编译器生成的exe的向后兼容xp的问题
来源:互联网 发布:火车头采集器数据导出 编辑:程序博客网 时间:2024/05/01 01:21
原文:
对于在vs2013里面使用新建项目的方式:
http://blog.sina.com.cn/s/blog_5f2e119b0101s2uy.html
问题一:编译出来的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过程,后面的参数也很容易理解,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文件就是静态编译了。
0 0
- 关于vs2012/2013的C编译器生成的exe的向后兼容xp的问题
- 关于vs2012/2013的C编译器生成的exe的向后兼容xp的问题
- VS2012编译兼容XP程序的方法
- M$可笑的“向后兼容”
- 关于C/C ++ 编译器的问题
- matlab2011b找不到编译器vs2012的问题
- 如何解决在Win7,VS2012环境中生成的c++程序在XP上提示“XXXX.exe不是有效的Win32应用程序”的问题
- 关于Android向前兼容和向后兼容问题的理解
- 关于java生成exe的问题
- vs2012 与 win7 不兼容的问题
- php7 不向后的兼容的变更
- 减小VS2012生成的exe的文件大小的一种方法
- VS2012生成的exe的图标的添加
- 关于编译器的问题
- VS2013 生成XP下的exe文件
- 关于Vs2012重新生成解决方案时提示exe访问被拒绝的处理方式
- CSS Hack和向后兼容的常见问题
- 提取了VS2012的编译器
- 如何在VS 2010中使用 VS2013的解决方案
- Unsupported major.minor version 51.0解决
- asp.net 不可识别的数据库格式,accdb
- HDU2036 改革春风吹满地
- C# 返回父页面
- 关于vs2012/2013的C编译器生成的exe的向后兼容xp的问题
- 日期字符串转时间戳比较
- 【贪心】CodeForces Round #140(226B) - Naughty Stone Piles
- 一元多项式的加法和乘法运算
- 常用算法时间空间复杂度
- java i/o流
- 第八周计算分段函数
- 安卓笔记:解决project explorer中项目旁感叹号
- ZOJ 3826 Hierarchical Notation 模拟