mt.exe: общая ошибка c101008d: не удалось записать обновленный манифест в ресурс файла... Доступ запрещен
У меня часто возникает эта проблема, даже когда я создаю новый проект C++ и пытаюсь создать файл релиза.
Я использую Visual Studio 2008. Единственное, что может вызвать эту проблему, - мой код сохраняется на диске сервера, а не на локальном жестком диске.
mt.exe: общая ошибка c101008d: не удалось записать обновленный манифест в ресурс файла "..\Release\PGTS_version17C.exe". Процесс не может получить доступ к файлу, потому что он используется другим процессом.
Кто-нибудь знает, как решить эту проблему? Благодарю.
13 ответов
Если вы встраиваете файл манифеста, ваша антивирусная программа может заблокировать и сканировать ваш exe-файл перед встраиванием манифеста.
Я рекомендую отключить антивирус для чтения ваших папок вывода DEBUG и RELEASE.
Идти к Debug
и / или Release
папку (и), щелкните правой кнопкой мыши и отмените, рекурсивно, свойство только для чтения.
Нашел этот совет в сообществе MSDN и решил мою проблему!
Это не права доступа или проблема с доступом к файлу (AV)...
Вы можете добавить флаг, чтобы компилятор проверял правильность манифеста.
Эта проверка исправит проблему, поэтому вам больше не придется ее перестраивать.
Это очень важно для тех, кто использует настоящий Build-Machine или автоматический buildscript, где вы не хотите вмешиваться вручную:
Добавьте этот флаг:
Свойства проекта -> Свойства конфигурации -> Инструмент манифеста -> Командная строка -> Дополнительные параметры:
/validate_manifest
Как ни странно, у меня была та же самая ошибка, и "перестроение" на всем проекте решило ее.
Откройте Visual Studio 2010 как "Запуск от имени администратора" и перестройте заново.
Если вам не нужно создавать файл Manifest, просто отключите его, чтобы решить проблему.
Перейти к проекту (щелкните правой кнопкой мыши)
свойства
Linker
Файлы манифеста
Создать Манифест
изменить это да на нет
Это решает проблему для меня на VS2008 без отключения Антивируса.;)
Наслаждаться:)
Я работал с этим с помощью программы-оболочки для mt.exe
тот, который рерант, пока это не удалось. Сохраните следующий код как mt-wrapper.cpp
:
#include <windows.h>
#include <stdio.h>
#include <process.h>
// Build from a Visual Studio Command Prompt with "cl /O2 /Gy /Femt.exe mt-wrapper.cpp"
int __cdecl wmain(int argc, WCHAR **argv, WCHAR **env)
{
// Stop outputting text.
fclose(stdout);
fclose(stderr);
// Run the original mt.exe, which has been renamed to mt-orig.exe .
for (;;)
{
// Try to run the original mt.
intptr_t iStatus = _wspawnve(_P_WAIT, L"C:\\Program Files (x86)\\Microsoft SDKs\\Windows\\v7.0A\\Bin\\mt-orig.exe", argv + 1, env);
if (iStatus == 0)
break;
// Try again, after a short wait.
::Sleep(100);
}
return 0;
}
Создайте эту программу, перейдите к C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin
папку, переименуй старую mt.exe
в mt-orig.exe
(и mt.exe.config
в mt-orig.exe.config
), и поместите эту программу-обертку туда как mt.exe
, Теперь, когда вы соберете, он попытается запустить оригинальный mt.exe
пока это не удастся.
Как ни странно, MSBuild, похоже, не проверяет нулевой статус, когда решает, что mt.exe
удалось - похоже, он ищет сообщения об ошибках, записанные в stdout/stderr. Так что эта программа закрывает оба из них, прежде чем порождать оригинал mt.exe
, Любой, кто чувствует себя трудолюбивым, может применить найденный здесь совет, чтобы сохранить результат успешного запуска оригинала. mt.exe
и выведите его в stdout/stderr.
В моем случае ни одно из представленных здесь предложений не сработало. Я использую сборку Ninja с VS 2019, и сборка случайно не работает только в Jenkins. Отключить манифест в нашем случае не вариант. В качестве обходного пути я отключил манифест на этапе компоновки, однако добавил пользовательскую цель с шагом POST_BUILD для встраивания манифеста с помощью mt.exe.
отключить манифест на этапе ссылки
target_link_options(target_name PRIVATE /MANIFEST:NO)
добавить этап пост-сборки. измените № 1 (используется для exe) на № 2, если используете dll
add_custom_command(TARGET target_name POST_BUILD
COMMAND mt.exe -manifest manifest_file -outputresource:$<TARGET_FILE:target_name>;#1
COMMENT "Adding custom manifest on target_name"
VERBATIM)
С вышеуказанным обходным решением теперь нет сбоев на сервере Jenkins.
Попробуй это:
- Отключить AV
- Временно переименуйте ваш exe-файл, чтобы он не содержал никаких слов волшебных слов UAC (установка, настройка, исправление, обновление)
- убедитесь, что у вас есть права на запись
- используйте команду mt для внедрения манифеста
- переименовать обратно свой exe
Если ваш проект хранится в Dropbox, вам нужно выйти из Dropbox для сборки. Это также проблема при использовании Unreal Engine.
Я решил эту ошибку, остановив и отключив "Службу синхронизации" (часть FireEye)
Если вы используете Hudson/Jenkins для создания перезапусков релизов, это решило проблему для меня.