msvcr90d.dll не найден в режиме отладки
Я обнаружил, что MSVCR90D.dll не найден в режиме отладки с вопросом Visual C++ 2008, но ни один из приведенных ответов не дает ответа на этот вопрос. Большинство из них указывают на отключение инкрементного связывания, но не объясняют истинную причину ошибки и то, как ее можно исправить, не отключая инкрементное связывание.
Я хотел бы отметить, что моя ситуация немного отличается от той, что была в оригинальном вопросе. Я использую компилятор C++ из Visual Studio 2008, но в Qt Creator, а не в Visual Studio.
Кто-нибудь?
7 ответов
Ниже выводится компилятор. Странно, что запуск сборки во второй раз удался. Однако я подозреваю, что проблема может быть связана с этой ошибкой при запуске 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.
ОБНОВИТЬ
Неудачный запуск mt.exe в процессе компоновки действительно был причиной проблемы. Я добавил путь к Windows SDK (C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin
) к переменной окружения PATH, и теперь я могу запустить исполняемый файл.
Комментарии к различным ответам;
@Shay
Выходной текстовый файл из 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
Файл напрямую связан с исполняемым файлом, так что я думаю, что это не ошибка какой-либо сторонней библиотеки.
Простая установка 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 делает. Как только я это сделаю, больше не будет исключений времени выполнения и параллельных ошибок.
- Вы можете использовать Dependency Walker, чтобы узнать, какую версию msvcr90d.dll ваша программа пытается найти. Может быть какой-то сторонний компонент, связанный с какой-то версией msvcr90d.dll, которой у вас нет.
- Вы должны проверить файл manifest.xml. Попробуйте удалить все ненужные зависимости.
Обновление: в моем случае я обнаружил, что в vC++ 2008 express есть "Использовать обходной путь FAT32" (находится на странице "Свойства манифеста" в свойствах конфигурации); это решает проблему. В справочной информации по этому параметру объясняется, что диски / разделы FAT32 имеют 2-секундную задержку в отметке времени, которая препятствует нормальной работе mt.exe. Это, кажется, объясняет несколько случайное поведение проблемы.
Отказ от ответственности: я не настоящий мастер Win32:)
Я никогда не использовал Qt Creator, но создает ли он правильный манифест для exe?
возможно, манифест предназначен для другой версии (например, SP1), и у вас есть только версия RTM.
Вы используете Vista? Вы можете попробовать запустить SxsTrace для диагностики проблем рядом.
У меня та же проблема с msvcr90d.dll не найден в vs2008 C++ express ed. Встроенный манифест в выходном файле.exe выглядит следующим образом, когда включена инкрементная ссылка:
xml version = "1.0" encoding = "UTF-8" standalone = "yes"?>
Монтаж>
Неудивительно, что msvcr90d.dll не удалось найти!
я попробовал 2 вещи:
A. используя шестнадцатеричный редактор, вышеупомянутое перезаписывается содержимым
Б. используйте mt.exe -manifest ./Debug/XXX.embed.manifest -outputresource:./Debug/XXX.exe
Оба метода, кажется, работают. я использовал 2-й метод в качестве команды события после сборки:
mt.exe -verbose -manifest./$(ConfigurationName)/$(TargetFileName).embed.manifest -outputresource:./$ (ConfigurationName) / $ (TargetFileName)
я не знаю, почему "неправильный" манифест встраивается в первую очередь, когда включена инкрементная ссылка. если кто-то знает почему, пожалуйста, напишите.
Спасибо!
закон
Возможно, у вас несовпадение версий? У меня была похожая вещь с Ogre, мне пришлось перекомпилировать SDK, используя для компиляции последнюю версию сторонней библиотеки.