VS2008 - debug版 - 由于应用程序配置不正确,应用程序未能启动。重新安装应用程序可能会纠正这个问题。
文章目录
- VS2008 - debug版 - 由于应用程序配置不正确,应用程序未能启动。重新安装应用程序可能会纠正这个问题。
- 概述
- 笔记
- VS2008安装环境
- VS2008测试程序设置
- 默认报错的情况
- 措施1
- 措施2
- 备注 - exe清单文件的问题
- 是否使用静态库?
- _BIND_TO_CURRENT_VCLIBS_VERSION的出处?
- 将VS2008生成的程序在winxpSp3上运行的几种方法的比较
- 备注
- 备注 - 如果不是刚需,可以用VS2013
- END
VS2008 - debug版 - 由于应用程序配置不正确,应用程序未能启动。重新安装应用程序可能会纠正这个问题。
概述
装完VS2008, 写个测试程序,试试是否可以正常在winxpSp3上用。
只将exe拷贝过去,报错如下:
---------------------------
C:\Documents and Settings\lostspeed\桌面\test\test_winxp_vs2008.exe
由于应用程序配置不正确,应用程序未能启动。重新安装应用程序可能会纠正这个问题。
---------------------------
确定
---------------------------
采取了2个措施,报错消失,可以正常运行。
笔记
VS2008安装环境
win10x64, 安装顺序如下,只安装vc++.
VS2008测试程序设置
完全编译
默认报错的情况
措施1
在顶层头文件中加入宏 _BIND_TO_CURRENT_VCLIBS_VERSION
WINVER版本虽然不是0x0501, 先不管他。
将exe拷贝到winxpSp3中运行。
看到报错信息还是一样,并没有说缺啥DLL.
措施2
拷贝exe依赖的VS2008的DLL, 针对这个测试程序,就只拷贝DEBUG版的DLL, 具体可以用depend去看。
这个默认的测试程序,没有使用MFC/ATL, 且是debug/win32, 那么只拷贝VS2008 debug/x86的DLL到winxpSp3就行。
C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\redist\Debug_NonRedist\x86\Microsoft.VC90.DebugCRT
将这4个东西(DLL和清单文件),都拷贝到winxpSp3中。
可以看到,这回就正常了。
备注 - exe清单文件的问题
默认的清单文件嵌入在exe内部。
是否使用静态库?
如果没有特殊需求,当然不能采用静态库。
因为程序大了之后,不可避免的会用第三方库,人家大多数都会使用动态库。
如果将整个程序都改为静态库包含,不现实。
_BIND_TO_CURRENT_VCLIBS_VERSION的出处?
_BIND_TO_CURRENT_VCLIBS_VERSION 并没有MS官方文档说明,不知道是哪个大神第一次采用这种方法,第一个用这个宏的一定是MS内部的人,要不谁知道有这东西?
仅在VS2008的头文件crtassem.h中可以看到这个宏大概干了啥。
C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\crtassem.h
能大致知道,VS2008有2个版本的DLL, 一个是VS2008原版用的,一个是VS2008SP1打补丁之后的版本。
那么大致知道,在工程中是否定义这个宏,就指定了使用哪个版本的DLL.
也许是使用了这个宏,对DLL版本的要求就不那么严。
将VS2008生成的程序在winxpSp3上运行的几种方法的比较
首先排除使用静态链接,各种弊端。
如果是让debug版程序到winxpSp3上运行,就定义宏。
如果是release程序到winxpSp3上运行,就安装VS2008发行包,再运行我们自己的程序就正常。
备注
这个问题,也在网上查了一下,好多同学都是各种原因,各种解释,看的脑袋疼。
自己试验后,发现就多做这2步,就清净了。
可能因为VS2008出的比较早,报错信息也就不那么明确,这个报错看的人一愣一愣的。
备注 - 如果不是刚需,可以用VS2013
可能是因为VS2008出的比较早,非要在工程中定义宏来让DLL版本依赖宽松一些。
VS2013做的比较好(没有UCRT补丁依赖,原生支持winxpsp3),工程不用定义宏,只要工具链采用xp链,编译完,将DLL拷贝全后,在winxpsp3中直接正常用。