今天编译一开源项目,他提供的是VC9的工程,我这边是VC10,首先,打开之后需要经过转换,一切正常,然后编译,出现一个简单的小的错误,更改之后编译通过,但是运行时出现下图所示的错误。

LDR: LdrpWalkImportDescriptor()解决方案_第1张图片

“应用程序正常初始化(oxc0150002)”失败,请单击“确定”,终止应用程序。

然后再调试输出信息中查看得到如下信息:

   
   
   
   
  1. LDR: LdrpWalkImportDescriptor() failed to probe F:\......\libpng.dll for its manifest, ntstatus 0xc0150002  
  2. 调试器:: 在进程加载过程中引发了未处理的无法继续的异常  
  3. 程序“[1964] Helloworld-win32.exe: 本机”已退出,返回值为 -1072365566 (0xc0150002)。 

这种情况到时比较多见了,一般都是链接库的问题,网上问这个问题的也很多,这里就给说明一下。出错信息说是libpng.dll的问题,那么我们就打开这个dll来检查一下吧。下图是该dll的版本信息:

LDR: LdrpWalkImportDescriptor()解决方案_第2张图片

基本上这版本信息上也看不出什么错误来,下面就只能查看该DLL的二进制信息了,打开之后,终于发现问题了,如下图所示:

LDR: LdrpWalkImportDescriptor()解决方案_第3张图片

选中的部分其中包含了“name="Microsoft.VC90.DebugCRT" version="9.0.21022.8"”,这里的name值说明编译该DLL是使用的VC9.0而且还是Debug版本的,而version值则是一个版本号,还真有些郁闷了,既然是发布,为什么还要编译Debug版本的呢?Debug版本需要环境高度一致才能兼容,release版本则不会有这些问题存在,如何解决这个问题呢?

方法一:卸载VC10,改装VC9,这个比较麻烦,不考虑了。
方法二:将对应版本的“Microsoft.VC90.DebugCRT”拷贝到system32中,一般位于VC的安装目录中的redist文件夹下,如下图所示,选中的Debug_NonRedist(其下的x64和x86)表示是Debug版本使用的,而另外两x64和x86则是release版本的。这里的截图暂时还是VC10的,路径为:Microsoft Visual Studio 10.0\VC\redist\Debug_NonRedist\x86

LDR: LdrpWalkImportDescriptor()解决方案_第4张图片

方法三:直接找到libpng的源代码,自己来编译DLL(个人比较推荐这种方式)。
因此,我们以后在发布程序时也需要注意这样的问题,以免出现这样的不兼容的情况。