Numéro
J'ai écrit un projet C++ appelé 'Foo' en utilisant Microsoft Visual Studio 2005 Verison 8.0.50727.762 (SP.050727-7600) sur Windows XP Professional Version 2002 Service Pack 3. J'ai construit le projet dans Foo.exe. Puis, j'ai copié le fichier Foo.exe sur un Windows Server 2003 Enterprise Edition Service Pack 2. Lorsque j'ai essayé de l'exécuter, il a échoué avec cette erreur,
C:\foo.exe
The application has failed to start because the application configuration is incorrect.
Reinstalling the application may fix the problem.
Dans Event Viewer > System, trois événements ont été enregistrés.
ID de l'événement : 32 ; Source : SideBySide
Dependent Assembly Microsoft.VC80.CRT could not be found and Last Error was
The referenced assembly is not installed on your system.
ID de l'événement : 59 ; Source : SideBySide
Resolve Partial Assembly failed for Microsoft.VC80.CRT.
Reference error message: The referenced assembly is not installed on your system.
ID de l'événement : 59 ; Source : SideBySide
Generate Activation Context failed for C:\foo\Foo.exe.
Reference error message: The referenced assembly is not installed on your system.
L'installation de Microsoft Visual C++ 2005 Redistributable n'a pas résolu le problème.
- Téléchargé vcredist_x86.exe à partir de http://www.microsoft.com/download/en/details.aspx?id=3387
- Installé. Le programme d'installation a créé un dossier appelé
C:\windows\winsxs\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_0de06acd
.
La version de ce logiciel trouvée dans 'Ajout/Suppression de programmes' était '8.0.50727.42'.
En essayant d'exécuter C:\foo\foo.exe J'ai obtenu les mêmes erreurs que celles décrites ci-dessus.
L'installation de Microsoft Visual C++ 2005 SP1 Redistributable n'a pas résolu le problème.
- Téléchargé vcredist_x86.exe à partir de http://www.microsoft.com/download/en/details.aspx?id=5638
- Je l'ai installé. Le programme d'installation a créé un dossier appelé :
C:\windows\winsxs\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_6b128700
.
La version de ce logiciel trouvée dans 'Ajout/Suppression de programmes' était '8.0.56336'.
En essayant d'exécuter C:\foo\foo.exe J'ai obtenu les mêmes erreurs que celles décrites ci-dessus.
La copie des DLL et du manifeste CRT depuis la même machine (où j'exécute l'EXE) n'a pas réglé le problème.
- J'ai copié
msvcm80.dll
,msvcp80.dll
ymsvcr80.dll
deC:\WINDOWS\WinSxS\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_0de06acd
àC:\foo
. - Ensuite, j'ai copié
C:\WINDOWS\WinSxS\Manifests\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_0de06acd.manifest
àC:\foo
et l'a renommé enMicrosoft.VC80.CRT.manifest
.
La quatrième ligne du fichier manifeste ressemblait à ceci :
<assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version="8.0.50727.42"
processorArchitecture="x86"
publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
Quand j'ai essayé de lancer C:\foo\foo.exe cette fois, ça n'a pas marché. J'ai répété cette chose encore une fois avec les DLLs en C:\windows\winsxs\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_6b128700
et le fichier manifeste correspondant. Cela n'a pas aidé non plus. J'ai obtenu la même erreur.
Dans les deux cas, j'ai obtenu les erreurs suivantes dans Event Viewer > System.
ID de l'événement : 34 ; Source : SideBySide
Component identity found in manifest does not match the identity of the component requested
ID de l'événement : 58 ; Source : SideBySide
Syntax error in manifest or policy file "C:\foo\Microsoft.VC80.CRT.MANIFEST" on line 4.
ID de l'événement : 59 ; Source : SideBySide
Generate Activation Context failed for C:\foo\Foo.exe. Reference error message: The manifest file contains one or more syntax errors.
La copie des DLLs et du manifeste CRT depuis la machine Windows XP (où j'ai construit l'EXE) n'a pas résolu le problème.
- J'ai copié
msvcm80.dll
,msvcp80.dll
ymsvcr80.dll
deC:\winnt\winsxs\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_6b128700
de la machine Windows XP (où j'ai développé et construit foo.exe) àC:\foo
de Windows Server 2003 (où j'essaie d'exécuter foo.exe). - Ensuite, j'ai copié
C:\winnt\winsxs\Manifests\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_6b128700.manifest
àC:\foo
et l'a renommé enMicrosoft.VC80.CRT.manifest
.
La quatrième ligne du fichier manifeste ressemblait à ceci :
<assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version="8.0.50727.762"
processorArchitecture="x86"
publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
En essayant d'exécuter C:\foo\foo.exe J'ai maintenant les mêmes erreurs que celles mentionnées dans la section précédente.
La copie des DLLs CRT et du manifeste depuis le dossier Visual Studio l'a réparé.
- Copié
msvcm80.dll
,msvcp80.dll
,msvcr80.dll
yMicrosoft.VC80.CRT.manifest
deC:\Program Files\Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.CRT
de la machine Windows XP (où j'ai développé et construit foo.exe) pourC:\foo
de la machine Windows Server 2003 (où j'essaie de l'exécuter).
La quatrième ligne du fichier manifeste ressemblait à ceci :
<assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version="8.0.50727.6195"
processorArchitecture="x86"
publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
Cette fois, je pourrais courir C:\foo\foo.exe sans aucun problème.
Question
Je m'attendais à ce que l'installation de "Microsoft Visual C++ 2005 SP1 Redistributable" (vcredist_x86.exe), comme décrit dans la deuxième approche, règle le problème. Mais ce n'est pas le cas. En copiant les DLLs et les fichiers manifestes de l'application C:\Program Files\Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.CRT
de la machine de développement a réglé le problème. Pourquoi était-ce le cas ?
Options de construction
Au cas où cela vous aiderait à répondre à ma question. Voici les options du compilateur et de l'éditeur de liens que j'ai récupérées dans les propriétés du projet Visual Studio :
Propriétés de configuration > C/C++ > Ligne de commande :
/O2 /GL /D "_MBCS" /FD /EHsc /MD /Fo"Release\\" /Fd"Release\vc80.pdb" /W3 /nologo /c /Wp64 /Zi /TP /errorReport:prompt
Propriétés de configuration > Linker > Ligne de commande :
/OUT:"C:\MixedBag\Release\Foo.exe" /NOLOGO /MANIFEST /MANIFESTFILE:"Release\Foo.exe.intermediate.manifest" /DEBUG /PDB:"c:\MixedBag\release\Foo.pdb" /OPT:REF /OPT:ICF /LTCG /MACHINE:X86 /ERRORREPORT:PROMPT kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib