msvcr90d.dll не найден в режиме отладки - PullRequest
11 голосов
/ 19 июля 2009

Я обнаружил MSVCR90D.dll не найден в режиме отладки с вопросом Visual C ++ 2008 , но ни один из приведенных ответов действительно не дает ответа на вопрос. Большинство из них указывают на отключение инкрементного связывания, но не объясняют истинную причину ошибки и как ее можно исправить без выключения инкрементного связывания.

Я хотел бы отметить, что моя ситуация немного отличается от той, что была в исходном вопросе. Я использую компилятор C ++ из Visual Studio 2008, но в Qt Creator, а не в Visual Studio.

Любой

Ответы [ 7 ]

11 голосов
/ 05 августа 2010

Простая установка VS2008 Service Pack 1 решит проблему, если это ошибка, когда Debug CRT полностью отсутствует в папке sxs.

У меня такое случилось со свежей установкой VS2008 на 64-битной Windows 7 и решением, содержащим проект VC ++. Отладочная сборка будет аварийно завершена при загрузке сборки C ++ во время выполнения с параллельной ошибкой.

В Vista и Win7 (но не в XP) ошибка SxS дает подробную информацию о том, какую именно сборку он пытался и не удалось загрузить - в данном случае это был VC90.DebugCRT 9.0.22.19. Я проверил (встроенный) манифест для сборки VC и, конечно же, он содержал ссылку на эту сборку и версию.

Проверка каталога sxs (% System Drive% \ Windows \ WinSxS) показала, что не было установлено никакого DebugCRT VC90, установленного рядом друг с другом! Я установил среды выполнения VC ++, но они не включают среду отладки. VS2008 предназначен для установки среды отладки, но ее там не было.

Оказывается, первоначальный выпуск VS2008 не устанавливает 64-битный VC ++ DebugCRT, но установка SP1 делает. Как только я это сделаю, больше не будет исключений времени выполнения и параллельных ошибок.

6 голосов
/ 19 июля 2009
  1. Вы можете использовать Dependency Walker , чтобы узнать, какую версию msvcr90d.dll ваша программа пытается найти. Может быть какой-то сторонний компонент, связанный с какой-то версией msvcr90d.dll, которой у вас нет.
  2. Вам следует проверить файл manifest.xml. Попробуйте удалить все ненужные зависимости.
4 голосов
/ 20 июля 2009

Ниже выводится компилятор. Странно, что запуск сборки во второй раз удался. Однако я подозреваю, что проблема может быть связана с этой ошибкой при запуске mt.exe, который отвечает за встраивание информации из манифеста в исполняемый файл ...

Generating Code...
link /LIBPATH:"c:\Qt\4.5.2-vc\lib" /NOLOGO /DEBUG /MANIFEST /MANIFESTFILE:"debug\formExtractor.intermediate.manifest" /SUBSYSTEM:WINDOWS "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" /OUT:debug\formExtractor.exe @.\nmD932.tmp
mt.exe -nologo -manifest "debug\formExtractor.intermediate.manifest" -outputresource:debug\formExtractor.exe;1
'mt.exe' is not recognized as an internal or external command,
operable program or batch file.
NMAKE : fatal error U1077: 'mt.exe' : return code '0x1'
Stop.
NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\BIN\nmake.exe"' : return code '0x2'
Stop.
Exited with code 2.

UPDATE

Неудачный запуск mt.exe во время процесса связывания действительно был причиной проблемы. Я добавил путь к Windows SDK (C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin) в переменную среды PATH и теперь могу запускать исполняемый файл.

Комментарии к разным ответам;


@ Шай

Выходной текстовый файл из sxstrace пуст. Понятия не имею почему. Однако в журнале приложений есть следующая информация:

Faulting application formExtractor.exe, version 0.0.0.0, time stamp 0x4a638ee1, faulting module MSVCR90D.dll, version 6.0.6002.18005, time stamp 0x49e03824, exception code 0xc0000135, fault offset 0x0006f04e, process id 0xf68, application start time 0x01ca08ba801ac5cf.

Версия 6.0.6002.18005?
Какого черта это?


@ Кирилл В. Лядвинский

Зависимость Уокер находит msvcr90d.dll используемый qtwebkit4.dll файл в
c:\windows\winsxs\x86_microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_9.0.30729.1_none_bb1f6aa1308c35eb\MSVCR90D.DLL

, но не находит (другую версию?) msvcr90d.dll файл, связанный напрямую с исполняемым файлом. Однако DW, похоже, нигде не показывает свою версию?

Конкурс файла formExtractor.intermediate.manifest

<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level='asInvoker' uiAccess='false' />
      </requestedPrivileges>
    </security>
  </trustInfo>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*' />
    </dependentAssembly>
  </dependency>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type='win32' name='Microsoft.VC90.DebugCRT' version='9.0.21022.8' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
    </dependentAssembly>
  </dependency>
</assembly>

Из файла манифеста похоже, что исполняемый файл связан с версией msvcr90d.dll, отличной от qtwebkit4.dll. Странно то, что обе версии msvcr90d.dll находятся в папке c:\windows\winsxs в следующих подпапках
x86_microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_9.0.21022.8_none_96748342450f6aa2 а также x86_microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_9.0.30729.1_none_bb1f6aa1308c35eb

Есть идеи?


@ knight666

Я использую фреймворк Qt, который я скомпилировал, используя именно тот компилятор, который я сейчас использую, поэтому я думаю, что здесь нет несоответствия Кроме того, Dependency Walker показывает, что отсутствующий файл msvcr90d.dll связан напрямую с исполняемым файлом, поэтому я думаю, что это не ошибка какой-либо сторонней библиотеки.

3 голосов
/ 05 августа 2009

обновление: в моем случае я обнаружил, что в vc ++ 2008 express есть «Использовать обходной путь FAT32» (находится на странице «Свойства манифеста» в свойствах конфигурации); это решает проблему. В справочной информации по этому параметру объясняется, что диски / разделы FAT32 имеют 2-секундную задержку в отметке времени, которая препятствует нормальной работе mt.exe. Это, кажется, объясняет несколько случайное поведение проблемы.

3 голосов
/ 19 июля 2009

Отказ от ответственности: я не настоящий мастер Win32:)

Я никогда не использовал Qt Creator, но создает ли он правильный манифест для exe?
возможно, манифест предназначен для другой версии (например, SP1), и у вас есть только версия RTM.
Вы используете Vista? вы можете попробовать запустить SxsTrace для диагностики проблем рядом.

1 голос
/ 05 августа 2009

У меня такая же проблема с msvcr90d.dll, не найденным в vs2008 c ++ express ed. Встроенный манифест в выходном файле .exe выглядит следующим образом при включении инкрементной ссылки:

<? Xml version = "1.0" encoding = "UTF-8" standalone = "yes"?>

Не удивительно, что msvcr90d.dll не удалось найти!

Я попробовал 2 вещи:

A. с использованием шестнадцатеричного редактора, вышеупомянутое перезаписывается содержимым , найденным в ./Debug/XXX.embed.manifest

B. используйте mt.exe -manifest ./Debug/XXX.embed.manifest -outputresource: ./ Debug / XXX.exe

Кажется, оба метода работают. я использовал 2-й метод в качестве команды события после сборки:

mt.exe -verbose -manifest ./$(ConfigurationName)/$(TargetFileName).embed.manifest -outputresource: ./$ (ConfigurationName) / $ (TargetFileName)

Я не знаю, почему «неправильный» манифест встраивается в 1-е место, когда включена инкрементная ссылка. если кто-то знает почему, пожалуйста, напишите.

Спасибо!

закон

1 голос
/ 20 июля 2009

Возможно, у вас несовпадение версий? У меня была похожая вещь с Ogre, мне пришлось перекомпилировать SDK, используя для компиляции последнюю версию сторонней библиотеки.

...