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.exemt.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.

Попробуй это:

  1. Отключить AV
  2. Временно переименуйте ваш exe-файл, чтобы он не содержал никаких слов волшебных слов UAC (установка, настройка, исправление, обновление)
  3. убедитесь, что у вас есть права на запись
  4. используйте команду mt для внедрения манифеста
  5. переименовать обратно свой exe

Если ваш проект хранится в Dropbox, вам нужно выйти из Dropbox для сборки. Это также проблема при использовании Unreal Engine.

Я решил эту ошибку, остановив и отключив "Службу синхронизации" (часть FireEye)

Если вы используете Hudson/Jenkins для создания перезапусков релизов, это решило проблему для меня.

Другие вопросы по тегам