在VS2015中构建会出现SideBySide错误

时间:2016-01-13 04:54:40

标签: c++ windows-7 visual-studio-2015

我有一个适用于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中从头开始构建应用程序,我仍然不明白为什么我会收到此错误。我尝试安装Microsoft Visual C++ 2005 SP1 Redistributable Package (x86),对应版本8.0.50727.762,但它没有帮助。

很多关于此主题的较旧帖子(例如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不再生成它们吗?

3 个答案:

答案 0 :(得分:1)

您使用过的库之一是针对Vs2005的调试运行时(Microsoft.VC80。调试 CRT)构建的。这些调试文件是 NOT 正常的Visual C ++ 2005 SP1可再发行组件包的一部分。

做一个试验&错误搜索以确定哪个库并获取使用版本Dlls的发行版本,这些版本是Redistributable Package的一部分。

答案 1 :(得分:0)

您使用的是哪种类型的3D派对库以及它们是如何链接的?例如,您使用DLL,Libs还是两者兼而有之?如果您使用的是静态链接的第三方库,则必须使用相同版本的VS编译和构建它们,并使用相同的代码生成标记。您可能还想访问这些库的开发人员网站,并查看他们是否有更新的版本以及已使用当前版本的VS编译的版本。如果他们只有2010年,12年或13年他们应该工作,但你必须在2015年打开它们并自己构建

例如;我使用libpng,openal,ogg-vorbis,glm&对于我的应用程序所依赖的所有第三方库,我创建了一个存储它们的文件目录,并在主机上创建了环境变量,以便更轻松地进行链接。对于除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&所以我的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年。

另外不要忘记检查这些第三方库道具文件,以确保它们指向正确版本的VS.

答案 2 :(得分:0)

@ 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并解决了我的问题。