Неверная конфигурация сбоку по причине неправильного манифеста

Сначала я задал этот вопрос на форуме libRocket, но, учитывая, что дальнейшее исследование предполагает, что это скорее общая С++/Visual Studio Я задаюсь здесь.

Я запускаю Visual Studio С++ 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. Это верно? Версия 9.0.21022 распространяемого VS2008 на самом деле присутствует в моей системе. Но даже в этом случае, учитывая, что я перекомпилировал libRocket с использованием VS2010, не следует ли ссылаться на среду выполнения VS2010?

Я считаю, что эта ошибка связана с конфигурацией в только что скомпилированном файле манифеста libRocket:

    <dependentAssembly>
      <assemblyIdentity type="win32" name="Microsoft.VC90.DebugCRT" version="9.0.21022.8" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b">    </assemblyIdentity>
    </dependentAssembly>

Я могу видеть, откуда оно происходит, поскольку приложение было первоначально написано для VS2008, но как я могу заставить VS2010 генерировать правильный манифест? Свойства проектов указывают, что они автоматически генерируются.

Обратите внимание, что эта проблема возникает только в режиме отладки, она отлично работает в версии. Конечно, я бы предпочел иметь возможность запускать его в режиме отладки в моей системе разработчиков.

Любые указатели на то, как это решить, очень ценятся!

Спасибо!

Ответы

Ответ 1

Не следует ли ссылаться на время выполнения VS2010?

Нет, VS2010 больше не хранит ЭЛТ в бок о бок-кеш. Он возвращается в c:\windows\system32, для его поиска не требуется манифест. Microsoft передумала, получив слишком много жалоб от клиентов, которые боролись с той проблемой, с которой вы сталкиваетесь.

<assemblyIdentity type="win32" name="Microsoft.VC90.DebugCRT" .../>

Это ваша основная проблема. Не только ваша программа имеет зависимость от старой версии CRT, но и неправильная версия. Отладочная версия CRT не может быть развернута и работает только на машинах, на которых установлен VS2008. Как и ваш.

Вам определенно нужно исправить это, смешивание версий CRT может вызвать гораздо больше проблем, помимо проблем с развертыванием. Вы связываете .obj или .lib, который был построен с VS2008 в конфигурации Debug. Вам нужно будет найти проект, который сгенерировал этот файл, и перестроить его, чтобы он использовал правильную конфигурацию и версию CRT. Если у вас нет подсказки, вы можете grep файлы .obj и .lib для "DebugCRT".

Ответ 2

решение вашей проблемы @Ошибка SideBySide

просто скопируйте DLL и файлы манифеста версий в папке отладки приложения.