2011-12-23 12 views
14

Najpierw zadałem to pytanie na forum libRocket, ale biorąc pod uwagę, że dalsze badania sugerują, że jest to bardziej ogólny problem związany z C++/Visual Studio, proszę o to tutaj.Niepoprawna konfiguracja z powodu niepoprawnego manifestu

Używam programu Visual Studio C++ 2010 Express i pobrałem pełny kod źródłowy Win32 do biblioteki libRocket 1.2.1. Udało mi się skompilować go w trybie debugowania bez błędów i ostrzeżeń, a teraz próbuję uruchomić go w mojej aplikacji, która jest zbudowana na SFML 1.6.

Moja aplikacja kompiluje bez błędów i ostrzeżeń przed zrekompilowanym libRocket. Jak tylko próbuję go uruchomić, jednak pojawia się komunikat o błędzie The application was unable to start correctly (0xc0150002). Click OK to close the application.

Kiedy otwieram plik wykonywalny z Dependency Walker, otrzymuję następujący błąd:

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.

Uważam to dziwne, ponieważ pokazuje również moją aplikację i RocketCore_d.dll w zależności od MSVCP100D.DLL i MSVCR100D.DLL. Nie ma tam niezgodności. Więc następnie przeprowadzeniem 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. 

Wydaje się, że mój system brakuje Visual Studio 2008 Runtime. Czy to jest poprawne? Wersja 9.0.21022 redystrybuowanego VS2008 jest w rzeczywistości obecna w moim systemie. Ale mimo to, biorąc pod uwagę, że zrekompilowałem libRocket przy użyciu VS2010, czy nie powinien on odnosić się do środowiska wykonawczego VS2010?

Uważam ten błąd wynika z konfiguracji w nowo skompilowanego pliku manifestu libRocket za:

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

widzę gdzie to pochodzi od wniosek został pierwotnie dla VS2008 napisane, ale w jaki sposób mogę uzyskać VS2010 do wygenerować poprawny manifest? Właściwości projektu wskazują, że jest on generowany automatycznie.

Należy zauważyć, że ten problem występuje tylko w trybie debugowania, działa on bez problemu. Oczywiście bardzo chciałbym móc uruchomić go w trybie debugowania w moim systemie deweloperskim.

Wszelkie wskazówki, jak rozwiązać ten problem, są bardzo cenne!

Dzięki!

Odpowiedz

22

shouldn't it be referencing the VS2010 runtime?

Nie, VS2010 nie zapisuje już CRT w pamięci podręcznej "obok siebie". Wracamy do c: \ windows \ system32, aby go znaleźć, nie jest potrzebny żaden manifest. Microsoft zmienił zdanie po otrzymaniu zbyt wielu skarg od klientów, którzy borykali się z problemem, który masz.

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

To jest twój podstawowy problem. Twój program nie tylko jest zależny od starej wersji CRT, ale także jest złą wersją. Wersja debugowania CRT nie może zostać wdrożona i działa tylko na komputerach z zainstalowanym VS2008. Jak twoje.

Zdecydowanie trzeba to naprawić, mieszanie wersji CRT może powodować więcej problemów niż problemy z wdrażaniem. Łączymy plik .obj lub .lib, który został zbudowany z VS2008 w konfiguracji debugowania. Musisz znaleźć projekt, który wygenerował ten plik i odbudować go, aby używał poprawnej konfiguracji i wersji CRT. Jeśli nie masz pojęcia, możesz odszukać pliki .obj i .lib dla "DebugCRT".

+0

To wyjaśniło sprawę. Okazało się, że libRocket został powiązany z FreeType, który, jak sądzę, został zbudowany przy użyciu VS2008. Gdy tylko podłączyłem Rocket do zbudowanego VS2008 FreeType, mogłem uruchomić moją aplikację. Dzięki! – Laurens

+2

Czy masz na myśli "... przeciwko wbudowanemu w VS2010 FreeType" – Schollii

+0

Masz rację, jak tylko połączę Rocket z budowanym przez VS2010 typem FreeType, zadziałało. – Laurens

-3

rozwiązanie problemu @SideBySide Error

wystarczy skopiować pliki DLL i manifestu plików z wersji w folderze debugowania aplikacji.

Powiązane problemy