在 VS2015 中构建会出现 SideBySide 错误
Posted
技术标签:
【中文标题】在 VS2015 中构建会出现 SideBySide 错误【英文标题】:Building in VS2015 gives SideBySide error 【发布时间】:2016-01-13 04:54:40 【问题描述】:我有一个在 VS2013 中运行的 x86 C++ 应用程序,我正在升级到 VS2015。构建和链接工作正常,但运行时出现错误:
无法启动程序。此应用程序无法启动,因为 应用程序配置不正确。查看清单文件 对于可能的错误。重新安装应用程序可能会解决此问题 问题。有关详细信息,请参阅应用程序事件日志。
应用程序事件日志显示:
“MyApp.exe”的激活上下文生成失败。 相关程序集 Microsoft.VC80.DebugCRT,processorArchitecture="x86",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="8.0.50727.762" 找不到。 详细诊断请使用sxstrace.exe。
所以我运行 sxstrace 并得到:
=================
Begin Activation Context Generation.
Input Parameter:
Flags = 0
ProcessorArchitecture = Wow32
CultureFallBacks = en-US;en
ManifestPath = MyApp.exe
AssemblyDirectory = MyApp\Debug\
Application Config File =
-----------------
INFO: Parsing Manifest File MyApp.exe.
INFO: Manifest Definition Identity is (null).
INFO: Reference: Microsoft.VC80.DebugCRT,processorArchitecture="x86",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="8.0.50727.762"
INFO: Resolving reference Microsoft.VC80.DebugCRT,processorArchitecture="x86",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="8.0.50727.762".
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.VC80.DebugCRT\8.0.50727.762__1fc8b3b9a1e18e3b\Microsoft.VC80.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.VC80.DebugCRT\8.0.50727.762__1fc8b3b9a1e18e3b\Microsoft.VC80.DebugCRT.DLL.
INFO: Attempt to probe manifest at MyApp\Debug\Microsoft.VC80.DebugCRT.DLL.
INFO: Attempt to probe manifest at MyApp\Debug\Microsoft.VC80.DebugCRT.MANIFEST.
INFO: Attempt to probe manifest at MyApp\Debug\Microsoft.VC80.DebugCRT\Microsoft.VC80.DebugCRT.DLL.
INFO: Attempt to probe manifest at MyApp\Debug\Microsoft.VC80.DebugCRT\Microsoft.VC80.DebugCRT.MANIFEST.
INFO: Did not find manifest for culture Neutral.
INFO: End assembly probing.
ERROR: Cannot resolve reference Microsoft.VC80.DebugCRT,processorArchitecture="x86",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="8.0.50727.762".
ERROR: Activation Context generation failed.
End Activation Context Generation.
我不确定这有什么帮助,如果我在 VS2015 中从头开始构建应用程序,我仍然不明白为什么会出现此错误。我尝试安装对应于版本 8.0.50727.762 的Microsoft Visual C++ 2005 SP1 Redistributable Package (x86),但没有帮助。
很多关于这个主题的旧帖子(例如Why installing vcredist_x86.exe doesn't fix SideBySide error when I develop an EXE on one machine and run it on another one?)都提到检查构建生成的 .manifest 文件,但我找不到。 VS2015 不再生成它们了吗?
【问题讨论】:
您可能正在链接到使用 VS 2005 编译的库,而您正在尝试使用 VS 2015 编译和链接您的应用程序。这种不兼容性可能会导致问题。你有图书馆的源代码吗?您能否对整个解决方案进行完整的重新编译和链接,包括您正在使用的任何库依赖项? 我确实有一些第三方库,但是为什么它在VS2013中可以工作,为什么安装VS2005依赖项没有帮助? 两者都有,但不是用 VS2015 构建的静态链接的会出现链接器错误,直到我重建它们,所以它们没问题。 部分3rd方库生成或有props文件;如果你在文本编辑器中打开它,可能会有一些 xml 或脚本告诉它可能依赖的其他库的版本,或者它期望使用哪个版本的 VS。您可能必须自己改变这些;例如,在处理音频时,我使用 OGG-Vorbis 和 OpenAL。我不记得究竟哪个依赖于另一个,但我认为 Vorbis 依赖于 Ogg 并且 Vorbis 有一个必须手动修改的道具文件。 【参考方案1】:您使用的一个库是针对 Vs2005 (Microsoft.VC80.DebugCRT) 的 Debug 运行时构建的。这些调试文件不是普通 Visual C++ 2005 SP1 Redistributable Package 的一部分。
进行试错搜索以确定哪个库并获取使用发布 Dll 的发布版本,这些 Dll 是 Redistributable Package 的一部分。
【讨论】:
问题是“试错搜索”。我不敢相信没有更好的方法来做到这一点! 对于可以使用depends.exe的DLL,但我不知道如何检查.lib文件。【参考方案2】:您使用的是什么类型的 3d 派对库,它们是如何链接的?例如,您使用的是 DLL、库还是两者都使用?如果您使用的是静态链接的第 3 方库,那么它们必须使用与您使用的相同版本的 VS 和相同的代码生成标志进行编译和构建。你可能还想访问这些库的开发者网站,看看它们是否有更新的版本以及已经用你当前版本的 VS 编译的版本。如果他们只有 2010、12 或 13,它们应该可以工作,但您必须在 2015 年打开它们并自己构建它们
例如;我使用 libpng、openal、ogg-vorbis、glm 等,对于我的应用程序所依赖的所有第 3 方库,我创建了一个文件目录来存储它们,并在我的主机上创建了环境变量,以便于链接过程.对于除了 glm 之外的所有这些库,因为 glm 是一个仅限标头的库,我必须为我正在使用的每个版本的 Visual Studio 创建不同的环境变量;例如 OGG-Vorbis 是 2 个用于音频的不同库;所以我会有 OGG_SDK_2010, VORBIS_SDK_2010 ... OGG_SDK_2015, VORBIS_SDK_2015 这些库是他们网站上的最新版本,这些库是在我可能正在使用的每个版本的 Visual Studio 的发布和调试版本中加载和构建的。
在我重做电脑之前,我确实有 VS2008、2010、2012、2013 和 2015;现在我重新安装了我的操作系统,我目前只有 VS2013 和 2015。所以我的任何 VS2008、VS2010 和 VS2012 的旧程序我都必须首先将它们移植到 2013 并修复任何依赖项并处理任何弃用。一旦该过程完成,我就可以将它们移植到 2015 年。
现在,根据我将我的一个程序从 2013 年移植到 2015 年的经验,有一些必须完成的过程,但是,我不记得究竟必须做些什么做完了。我知道确实需要一些时间来阅读不同的线程并反复试验才能使一切正常工作。
也可能是您正在使用尚未更新的库,并且目前没有更多工作或支持正在为它完成,您可能拥有的库依赖项本身可能被视为已弃用,如果那是这种情况,那么您可能需要进行一些研究才能找到适合您需求的替代库。一旦你找到了合适的库,接下来就是剥离所有旧的方法调用,并用对新库的等效调用替换它们。但是在某些情况下,这可能涉及对现有程序的完全重写。
例如;我使用 OpenGL,当我第一次开始学习它时,我使用的是 1.0 版,用于渲染调用的所有内容都在 CPU 上完成。现在我正在使用 Modern OpenGL 并在 GPU 上使用 GLSL 着色器,并成功创建了 3D 图形着色器渲染引擎;从 OpenGL 1.0 到 4.5 的过渡需要考虑很多,OpenGL 的同一个库或 API 的两个版本之间的差异是一个挑战。从旧版本的编译器移植到新版本有时相当容易,就像从 2012 移植到 2013 一样,没有太大的开销变化,但有时从旧版本移植到新版本可能很乏味,例如从 2005 年到 2015 年。
另外不要忘记检查这些 3rd 方库道具文件,以确保它们指向正确的 VS 版本。
【讨论】:
【参考方案3】:@magicandre1981 的回答是正确的,但没有提供任何线索来帮助追踪它。我最终注意到,当 Visual Studio 链接我的应用程序时,它会打印出来:
glew32sd.lib(glew.obj) : warning LNK4099: PDB 'vc80.pdb' was not found with 'glew32sd.lib(glew.obj)' or at 'MyApp\Debug\vc80.pdb'; linking object as if no debug info
我从glew source code 重建了glew32sd.lib,我的问题得到了解决。
【讨论】:
以上是关于在 VS2015 中构建会出现 SideBySide 错误的主要内容,如果未能解决你的问题,请参考以下文章