Почему установка vcredist_x86.exe не исправляет ошибку SideBySide, когда я разрабатываю EXE на одной машине и запускаю его на другой?

Проблема

Я написал проект на C++ под названием 'Foo', используя Microsoft Visual Studio 2005 Verison 8.0.50727.762 (SP.050727-7600) на Windows XP Professional Version 2002 Service Pack 3. Я собрал проект в файл Foo.exe. Затем я скопировал файл Foo.exe на Windows Server 2003 Enterprise Edition Service Pack 2. Когда я попытался запустить его, он не сработал с этой ошибкой,

C:\foo.exe
The application has failed to start because the application configuration is incorrect.
Reinstalling the application may fix the problem.

В Event Viewer > System были зарегистрированы три события.

Event ID: 32; Источник: SideBySide

Dependent Assembly Microsoft.VC80.CRT could not be found and Last Error was
The referenced assembly is not installed on your system.

Идентификатор события: 59; Источник: SideBySide

Resolve Partial Assembly failed for Microsoft.VC80.CRT.
Reference error message: The referenced assembly is not installed on your system.

Идентификатор события: 59; Источник: SideBySide

Generate Activation Context failed for C:\foo\Foo.exe.
Reference error message: The referenced assembly is not installed on your system.

Установка Microsoft Visual C++ 2005 Redistributable не помогла

  1. Скачал vcredist_x86.exe с http://www.microsoft.com/download/en/details.aspx?id=3387
  2. Установил. Программа установки создала папку C:\windows\winsxs\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_0de06acd.

Версия этого программного обеспечения, найденная в 'Add or Remove Programs', была '8.0.50727.42'.

При попытке запустить C:\foo\foo.exe, я получил те же ошибки, которые описал выше.

Установка Microsoft Visual C++ 2005 SP1 Redistributable не помогла

  1. Скачал vcredist_x86.exe с http://www.microsoft.com/download/en/details.aspx?id=5638
  2. Установил. Программа установки создала папку под названием: C:\windows\winsxs\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_6b128700.

Версия этого программного обеспечения, найденная в 'Add or Remove Programs', была '8.0.56336'.

При попытке запустить C:\foo\foo.exe, я получил те же ошибки, которые описал выше.

Копирование CRT DLLs и манифеста с той же машины (где я запускаю EXE) не помогло.

  1. Я скопировал msvcm80.dll, msvcp80.dll и msvcr80.dll из... C:\WINDOWS\WinSxS\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_0de06acd в C:\foo.
  2. Далее я скопировал C:\WINDOWS\WinSxS\Manifests\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_0de06acd.manifest в C:\foo и переименовал его в Microsoft.VC80.CRT.manifest.

Четвертая строка файла манифеста выглядела так:


Когда я попробовал запустить C:\foo\foo.exe на этот раз, ничего не получилось. Я повторил это еще раз с DLL в C:\windows\winsxs\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_6b128700 и соответствующим файлом манифеста. Это также не помогло. Я получил ту же ошибку.

В обоих случаях я получил следующие ошибки в Event Viewer > System.

Event ID: 34; Источник: SideBySide

Component identity found in manifest does not match the identity of the component requested

Event ID: 58; Источник: SideBySide

Syntax error in manifest or policy file "C:\foo\Microsoft.VC80.CRT.MANIFEST" on line 4.

Идентификатор события: 59; Источник: SideBySide

Generate Activation Context failed for C:\foo\Foo.exe. Reference error message: The manifest file contains one or more syntax errors.

Копирование DLL и манифеста CRT с машины Windows XP (где я собрал EXE) не помогло.

  1. Я скопировал msvcm80.dll, msvcp80.dll и msvcr80.dll из... C:\winnt\winsxs\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_6b128700 машины Windows XP (где я разрабатывал и собирал foo.exe) в C:\foo машины Windows Server 2003 (где я пытаюсь запустить foo.exe).
  2. Далее, я скопировал C:\winnt\winsxs\Manifests\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_6b128700.manifest в C:\foo и переименовал его в Microsoft.VC80.CRT.manifest.

Четвертая строка файла манифеста выглядела так:


При попытке запустить C:\foo\foo.exe теперь я получил те же ошибки, о которых говорилось в предыдущем разделе.

Копирование CRT DLLs и манифеста из папки Visual Studio исправило ситуацию.

  1. Скопировал msvcm80.dll, msvcp80.dll, msvcr80.dll и Microsoft.VC80.CRT.manifest из C:\Program Files\Microsoft Visual Studio 8\VC\redist\x86\Microsoft. VC80.CRT машины Windows XP (где я разработал и создал foo.exe) на C:\foo машины Windows Server 2003 (где я пытаюсь запустить его).

Четвертая строка файла манифеста выглядела так:


На этот раз я смог запустить C:\foo\foo.exe без каких-либо проблем.

Вопрос

Я ожидал, что установка 'Microsoft Visual C++ 2005 SP1 Redistributable' (vcredist_x86.exe), как описано во втором подходе, исправит ситуацию. Но этого не произошло. Копирование DLL и файлов манифеста из папки C:\Program Files\Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.CRT на машине разработки помогло. Почему так произошло?

Параметры сборки

Вдруг это поможет вам ответить на мой вопрос. Вот параметры компилятора и компоновщика, которые я взял из свойств проекта Visual Studio:

Configuration properties > C/C++ > Command Line:

/O2 /GL /D "_MBCS" /FD /EHsc /MD /Fo "Release\\\\" /Fd "Release\vc80.pdb" /W3 /nologo /c /Wp64 /Zi /TP /errorReport:prompt

Свойства конфигурации > Linker > Командная строка:

/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

41
задан pnuts 20 September 2014 в 18:31
поделиться