Ответ 1
Если вы вставляете файл манифеста, ваша антивирусная программа может блокировать и сканировать ваш exe файл перед встраиванием манифеста.
Я рекомендую отключить антивирус от чтения выходных папок DEBUG и RELEASE.
У меня часто возникает эта проблема, даже когда я создаю новый проект на С++ и пытаюсь создать файл выпуска.
Я использую Visual studio 2008. Одна вещь, которая может вызвать эту проблему, - мой код сохраняется на диске сервера, а не на локальном жестком диске.
mt.exe: общая ошибка c101008d: Не удалось записать обновленный манифест в ресурс файла "..\Release\PGTS_version17C.exe". Процесс не может получить доступ к файлу, потому что он используется другим процессом.
Кто-нибудь знает, как это решить? Спасибо.
Если вы вставляете файл манифеста, ваша антивирусная программа может блокировать и сканировать ваш exe файл перед встраиванием манифеста.
Я рекомендую отключить антивирус от чтения выходных папок DEBUG и RELEASE.
Перейдите в папку Debug
и/или Release
, щелкните правой кнопкой мыши и отмените, рекурсивно, свойство Read-Only.
Забавно, что у меня была такая же ошибка, и "перестройка" на всем проекте решила ее.
Если вам не нужно генерировать файл манифеста, просто установите его, чтобы решить проблему.
Перейти к проекту (щелкните правой кнопкой мыши)
свойства
компоновщика
Манифестные файлы
Создать манифест
измените его Да на Нет
Он разрешает проблему для меня на VS2008 без отключения Антивируса.;)
Наслаждайтесь:)
отключение Антивируса для меня.
Это не разрешение или проблема с доступом к файлу (AV)...
Вы можете добавить флаг, чтобы заставить компилятор проверить правильность манифеста.
Эта проверка исправит проблему, поэтому вам больше не придется ее перестраивать.
Это очень важно для всех, кто запускает реальный Build-Machine или автоматический buildscript, где вы не хотите вмешиваться вручную:
Добавить этот флаг:
Свойства проекта → Свойства конфигурации → Инструмент манифеста → Командная строка → Дополнительные параметры:
/validate_manifest
Откройте visual studio 2010 как "Запуск от имени администратора" и снова перестройте.
Я работал над этим с помощью программы "wrapper" для 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.
Попробуйте следующее:
Если вы используете Hudson/Jenkins для создания перезапуска релизов, он решил проблему для меня.
Я решил эту ошибку, остановив и отключив "службу синхронизации" (часть FireEye)