Ошибка MSB6006: "mt.exe" вышел с кодом 31
Я столкнулся с этой проблемой сегодня, перенося VS2008 решение VS2010. Проблема возникла в любом из следующих сценариев:
- Реконструкция решения
- Очистить, затем Build Solution
Если бы я сделал вторую сборку после любого из них, проблема не появилась. Используя Google, все, что я действительно придумал, - это годовые блоги от Microsoft, говорящие, что они не могут воспроизвести проблему или что она исправлена в будущей версии.
Лучшее, что я нашел, было здесь: Блог разработчиков Mikazo Tech: устранение ошибок MT.exe в Visual Studio 2010
В приведенной выше статье говорилось, что проблема связана с генерацией Manifest и что решение состоит в отключении Manifests в настройках в Linker → Manifest. Мне не нужны Manifests для этого проекта, но я все еще не был удовлетворен.
Я решил это и просто буду отвечать на свой вопрос, потому что я не нашел эту конкретную ошибку (код 31) в StackOverflow.
Ответы
Ответ 1
Используя монитор процессов и dbgview, я обнаружил, что msmpeng (Microsoft Security Essentials) обращался к файлу, только когда mt.exe хотел получить его исключительно. Исключение каталога разработки решило проблему.
Разумеется, это временное решение.
Ответ 2
ПРЕДУПРЕЖДЕНИЕ. Эта точная ошибка также может возникнуть в результате открытия окна проводника Windows в папке, содержащей *.exe, которую вы в настоящее время пытаетесь создать.
Например: Explorer открывается в /.../MyProj/Debug/
при попытке создать версию вашего кода Debug
в Visual Studio.
Я злюсь на себя за ~ 10 минут, прежде чем осознать это.
Ответ 3
В моих проектах для промежуточных и выходных каталогов были установлены следующие значения:
- Промежуточный адрес: $(Конфигурация)\
- Output Dir: $(SolutionDir) bin\$(Конфигурация)\
В C/С++ → Выходные файлы у меня было следующее:
- Расположение списка ASM: $(IntDir)\
- Имя файла объекта: $(IntDir)\
- Название файла базы данных программы: $(OutDir)\$(TargetName).pdb
В разделе Linker → Manifest File я имел:
- Файл манифеста: $(IntDir) $(TargetName) $(TargetExt).intermediate.manifest
Исключение заключалось в том, чтобы удалить конечный \
из моего раздела C/С++ → Output Files (поскольку он уже является частью этих переменных):
- Местоположение списка ASM: $(IntDir)
- Имя файла объекта: $(IntDir)
- Название файла базы данных программы: $(OutDir) $(TargetName).pdb
Обычно удвоение использования $(IntDir)
или $(OutDir)
с завершающим \
, похоже, не вызывает проблем, хотя это и плохое. Я не могу вспомнить сейчас, сделал ли я это случайно или если процесс конверсии сделал это, но по какой-то причине он, кажется, испортил MT.exe.
Надеюсь, это полезно для всех, кто сталкивается с этой проблемой. Ваши настройки могут быть разными, но учтите, что это может быть связано с неправильно сформированными именами файлов.
Ответ 4
Попробуйте отключить Защитник Windows (или, возможно, другое антивирусное программное обеспечение). Защитник Windows, как известно, блокирует файлы, потому что MT.EXE запускается после завершения компоновщика. WD прыгает посередине, чтобы проверить новый EXE и заблокировать его для MT.EXE.
Ответ 5
удаление "базы данных отладки программ" в папке "debug" работало для меня.
Эта проблема возникла, когда я запускал .exe в папке отладки с высоким приоритетом.
Ответ 6
Запустите VS как администратор. Он решил проблему для меня.
Ответ 7
У меня есть проект (*.sln), написанный в visual studio c 8.0. Недавно он был перенесен на VC10. Когда я выбираю "Режим выпуска", он был скомпилирован успешно. Но если я выберу "Режим отладки", произошла ошибка "MSB6006 mt.exe code 31".
Я обнаружил, что в режиме отладки он использовал неправильный подпроект для запуска.
После исправления подзаголовка запуска все идет хорошо.
---- новый статус ---
Это не решит проблему. Это просто заставляет проблему временно исчезнуть путем перестройки - все. Кроме того, существуют другие ошибки, вызванные миграцией. "Resources.h" пропущен из нового проекта, а "winres.rc" сокращается.
Ответ 8
В моем случае это была проблема с TortoiseGit. Удаление папок Debug и Release из репозитория GIT решило проблему.
Ответ 9
Предоставляя кредит https://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/c5a3e2c3-fbf4-4268-a551-8cee195be586/test-case-13-for-vista-certification?forum=windowscompatibility, я обнаружил, что это было устранено путем исправления символа '-' в командной строке post build. Я считаю, что некоторые плохие усилия копирования/вставки заменили дефис тире.
Ответ 10
Проверьте, есть ли у вас антивирусное программное обеспечение, такое как AVG. Исключить файлы манифеста в списке исключений антивирусного программного обеспечения.
Ответ 11
Найдите предупреждения MSB8012. Вероятно, у вас есть другая спецификация вывода для выходного значения С++ и значения Output Linker.