我最初在libRocket论坛上提出了这个问题,但鉴于进一步调查显示这更像是一般C ++ / Visual Studio相关问题,我在这里问。
我正在运行Visual Studio C ++ 2010 Express并已将完整的Win32源代码下载到libRocket 1.2.1。我已经成功地在调试模式下编译它而没有错误或警告,我现在正试图让它在我的应用程序中运行,该应用程序是在SFML 1.6之上构建的。
我的应用程序编译时没有错误或警告针对重新编译的libRocket。但是,只要我尝试运行它,就会收到一条错误消息The application was unable to start correctly (0xc0150002). Click OK to close the application.
当我使用Dependency Walker打开我的可执行文件时,我收到以下错误:
Error: The Side-by-Side configuration information for "ROCKETCORE_D.DLL" contains errors. The application has failed to start because its side-by-side configuration is incorrect.
我发现这很奇怪,因为它还显示我的应用程序和RocketCore_d.dll,具体取决于MSVCP100D.DLL和MSVCR100D.DLL。那里没有不匹配。然后我执行了sxstrace
:
=================
Begin Activation Context Generation.
Input Parameter:
Flags = 0
ProcessorArchitecture = Wow32
CultureFallBacks = en-US;en
ManifestPath = Binaries\Debug\RocketCore_d.dll
AssemblyDirectory = Binaries\Debug\
Application Config File =
-----------------
INFO: Parsing Manifest File Binaries\Debug\RocketCore_d.dll.
INFO: Manifest Definition Identity is (null).
INFO: Reference: Microsoft.VC90.DebugCRT,processorArchitecture="x86",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="9.0.21022.8"
INFO: Resolving reference Microsoft.VC90.DebugCRT,processorArchitecture="x86",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="9.0.21022.8".
INFO: Resolving reference for ProcessorArchitecture WOW64.
INFO: Resolving reference for culture Neutral.
INFO: Applying Binding Policy.
INFO: No publisher policy found.
INFO: No binding policy redirect found.
INFO: Begin assembly probing.
INFO: Did not find the assembly in WinSxS.
INFO: Attempt to probe manifest at C:\Windows\assembly\GAC_32\Microsoft.VC90.DebugCRT\9.0.21022.8__1fc8b3b9a1e18e3b\Microsoft.VC90.DebugCRT.DLL.
INFO: Did not find manifest for culture Neutral.
INFO: End assembly probing.
INFO: Resolving reference for ProcessorArchitecture x86.
INFO: Resolving reference for culture Neutral.
INFO: Applying Binding Policy.
INFO: No publisher policy found.
INFO: No binding policy redirect found.
INFO: Begin assembly probing.
INFO: Did not find the assembly in WinSxS.
INFO: Attempt to probe manifest at C:\Windows\assembly\GAC_32\Microsoft.VC90.DebugCRT\9.0.21022.8__1fc8b3b9a1e18e3b\Microsoft.VC90.DebugCRT.DLL.
INFO: Attempt to probe manifest at Binaries\Debug\Microsoft.VC90.DebugCRT.DLL.
INFO: Attempt to probe manifest at Binaries\Debug\Microsoft.VC90.DebugCRT.MANIFEST.
INFO: Attempt to probe manifest at Binaries\Debug\Microsoft.VC90.DebugCRT\Microsoft.VC90.DebugCRT.DLL.
INFO: Attempt to probe manifest at Binaries\Debug\Microsoft.VC90.DebugCRT\Microsoft.VC90.DebugCRT.MANIFEST.
INFO: Did not find manifest for culture Neutral.
INFO: End assembly probing.
ERROR: Cannot resolve reference Microsoft.VC90.DebugCRT,processorArchitecture="x86",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="9.0.21022.8".
ERROR: Activation Context generation failed.
End Activation Context Generation.
我的系统似乎缺少Visual Studio 2008运行时。它是否正确? VS2008可再发行组件的9.0.21022版实际上存在于我的系统中。但即便如此,考虑到我使用VS2010重新编译了libRocket,它不应该引用VS2010运行时吗?
我认为这个错误源于新编译的libRocket清单文件中的配置:
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.VC90.DebugCRT" version="9.0.21022.8" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"> </assemblyIdentity>
</dependentAssembly>
我可以看到它的来源,因为应用程序最初是为VS2008编写的,但是如何让VS2010生成正确的清单呢?项目属性表明它正在自动生成。
请注意,此问题仅发生在调试模式下,它在发布时运行良好。我当然非常希望能够在我的开发人员系统上以调试模式运行它。
关于如何解决这个问题的任何指示非常感谢!
谢谢!
答案 0 :(得分:22)
不应该引用VS2010运行时吗?
不,VS2010不再将CRT存储在并行缓存中。它回到c:\ windows \ system32,找不到它需要清单。微软在收到太多客户的抱怨之后改变了主意,因为客户遇到了这类问题。
<assemblyIdentity type="win32" name="Microsoft.VC90.DebugCRT" .../>
这是你的核心问题。您的程序不仅依赖于旧版本的CRT,它也是错误的版本。无法部署CRT的调试版本,仅适用于安装了VS2008的计算机。和你的一样。
你肯定需要解决这个问题,混合CRT版本会导致除部署问题之外的更多问题。您正在使用Debug配置中的VS2008链接.obj或.lib。您需要找到生成该文件并重建它的项目,以便它使用正确的配置和CRT版本。如果您没有任何线索,那么您可以将.obj和.lib文件grep为“DebugCRT”。
答案 1 :(得分:-3)
解决您的问题@ SideBySide Error
只需在应用程序调试文件夹中复制版本的dll和manifest文件。