Подтвердить что ты не робот

Msvcr90d.dll не найден в режиме отладки

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

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

Кто-нибудь?

4b9b3361

Ответ 1

Ниже выведено из компилятора. Странно, что запуск сборки во второй раз преуспевает. Однако я подозреваю, что проблема может быть связана с этой ошибкой с запуском 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 во время процесса связывания действительно была причиной проблемы. Я добавил путь к SDK Windows (C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin) в переменную среды PATH, и теперь я могу запустить исполняемый файл.

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


@Shay

Выходной файл txt из 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?
Что это за черт?


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

Dependency Walker находит 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 связан с напрямую с исполняемым файлом, поэтому я не думаю об ошибке какой-либо сторонней библиотеки.

Ответ 2

Просто установите VS2008 с пакетом обновления 1 (SP1), чтобы устранить проблему, если это ошибка, когда в папке sxs отсутствует полный отладочный CRT.

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

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

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

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

Ответ 3

  • Вы можете использовать Dependency Walker, чтобы узнать, какую версию msvcr90d.dll вы пытаетесь найти. Возможно, какой-то сторонний компонент связан с некоторой версией msvcr90d.dll, которой у вас нет.
  • Вы должны проверить файл manifest.xml. Попробуйте удалить все ненужные зависимости.

Ответ 4

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

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

Ответ 5

update: в моем случае я обнаружил, что vС++ 2008 express имеет "Использовать FAT32 Work-around" (найденный на странице свойств "Свойства манифеста" ); это решает проблему. Справочная информация для этой опции объясняет, что диски/разделы FAT32 имеют 2-секундную задержку в отметке времени, которая предотвращает правильную работу mt.exe. Это, по-видимому, объясняет несколько случайное поведение проблемы.

Ответ 6

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

Ответ 7

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

<? xml version = "1.0" encoding = "UTF-8" standalone = "yes"? > < assembly manifestVersion = "1.0" xmlns = "urn: schemas-microsoft-com: asm.v1" >
< </сборки >

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

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

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

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

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

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

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

Спасибо!

Lex