Нужно понять, как создается манифест для программы C ++ - PullRequest
3 голосов
/ 09 февраля 2010

Когда я запускаю исполняемый файл, который я создал, я получаю следующую ошибку:

Система не может выполнить указанную программу

Я сразу подумал, что это проблема зависимости с одной из перераспределяемых библиотек VC8.0 (msvcr80d.dll и др.). У нас было несколько проблем с исправленными версиями этих DLL, которые влияли на наши программы.

Когда я открыл свой исполняемый файл в Dependency Walker, отображаются следующие ошибки:

Error: The Side-by-Side configuration information in "w:\MYPROGRAM.EXE.manifest" 
       contains errors. This application has failed to start because the
       application configuration is incorrect. Reinstalling the application may
       fix this problem (14001).
Warning: At least one delay-load dependency module was not found.
Warning: At least one module has an unresolved import due to a missing export
         function in a delay-load dependent module.

Если я открою файл манифеста для моего исполняемого файла, в нем будет следующее:

<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type='win32' name='Microsoft.VC80.DebugCRT' version='8.0.50727.762' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
    </dependentAssembly>
  </dependency>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type='win32' name='Microsoft.VC80.DebugCRT' version='8.0.50727.4053' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
    </dependentAssembly>
  </dependency>
</assembly>

Кажется, в нем 2 копии зависимой сборки Microsoft.VC80.DebugCRT.

Версия сборки 8.0.50727.4053 отсутствует в моей параллельной конфигурации (я полагаю, что эта версия поставляется с патчем Visual Studio, который не установлен).

Если я удаляю эту сборку из файла манифеста, исполняемый файл работает нормально.

Однако, когда я перестраиваю свое приложение, манифест заново генерируется, и дополнительная зависимость добавляется снова.

Что вызывает добавление этой зависимости в манифест? Я предполагаю, что это как-то связано с другой библиотекой DLL, от которой мое приложение зависит от того, будет ли оно создано на другом ПК с другим набором распространяемых библиотек DLL, но я хочу это подтвердить.

Обновление:

Я перепробовал множество предложений в этом блоге , но без особой удачи. Одна странная вещь состоит в том, что манифест, сгенерированный, когда я делаю сборку Release, не включает запись 8.0.50727.4053, но сборка Debug включает.

1 Ответ

1 голос
/ 09 февраля 2010

Вы правы. Обновление безопасности для Visual C ++ 2005 с пакетом обновления 1 (SP1) вынуждает ваше приложение использовать более новые версии CRT и MFC (8.0.50727.4053 вместо 8.0.50727.762). Поскольку это может быть совместимо, лучше использовать новый. Вы должны распространять с вашим приложением также vcredist_x86.exe.

Как и сейчас, VS C ++ не сканирует зависимости, поэтому манифест генерируется из ядра VS (вы можете вручную управлять им с помощью настроек проекта). Мне кажется, что обновление VS было установлено на ПК разработчика, поэтому VS отразило это в манифесте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...