关于vs2012/2013的C编译器生成的exe的向后兼容xp的问题
2014-06-10 13:30
375 查看
转自: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以下的系统***诵猩傻膃xe了。
对于在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文件就是静态编译了。
问题一:编译出来的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以下的系统***诵猩傻膃xe了。
对于在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文件就是静态编译了。
相关文章推荐
- 关于vs2012/2013的C编译器生成的exe的向后兼容xp的问题
- 关于vs2012/2013的C编译器生成的exe的向后兼容xp的问题
- 关于vs2012生成exe文件无法在xp运行解决方法
- 关于visual studio 2013生成exe文件找不到问题
- 关于MSSQL2000 SP4 和SP3 生成的备份文件不兼容的问题
- 如何解决在Win7,VS2012环境中生成的c++程序在XP上提示“XXXX.exe不是有效的Win32应用程序”的问题
- 关于Qt程序不兼容xp系统的问题
- 关于使用MyEclipse自动生成Hibernate和Struts出现的jar不兼容的问题(antlr.collections.AST.getLine()I)
- 关于程序在vs中可以运行,而生成的exe运行不正常的问题
- 关于Android向前兼容和向后兼容问题的理解
- 关于VS2008问题“无法找到“XXX.exe”的调试信息,或者调试信息不匹配。未使用调试信息生成二进制文件。“
- 关于java生成exe的问题
- 关于QT应用在XP系统上兼容运行的问题
- 关于jar生成exe时出现背景图片无法显示的问题
- 关于windows下c++生成的exe发布时的依赖dll问题
- [09-19]关于双击*.exe就生成*~.exe(第2版)
- 关于spoolsv.exe进程耗尽CPU资源问题的解决方法
- 关于在不同编译器下中文的乱码问题!
- 关于Freemarker生成静态文件的问题
- 关于系统进程lsass.exe的病毒问题