web-dev-qa-db-ja.com

mt.exe:一般エラーc101008d:更新されたマニフェストをファイルのリソースに書き込めませんでした...アクセスが拒否されました

新しいC++プロジェクトをビルドしてリリースファイルをビルドしようとしても、この問題がよく発生します。

Visual Studio 2008を使用しています。この問題の原因の1つは、ローカルハードディスクではなくサーバーディスクにコードが保存されていることです。

mt.exe:一般エラーc101008d:ファイル "..\Release\PGTS_version17C.exe"のリソースへの更新されたマニフェストの書き込みに失敗しました。別のプロセスによって使用されているため、プロセスはファイルにアクセスできません。

誰もこれを解決する方法を知っていますか?ありがとう。

36
Jackie

マニフェストファイルを埋め込む場合、ウイルス対策プログラムは、マニフェストを埋め込む前にexeファイルをロックおよびスキャンする場合があります。

DEBUGおよびRELEASE出力フォルダーの読み取りからアンチウイルスを無効にすることをお勧めします。

42
Zamboni

Debugおよび/またはReleaseフォルダーに移動し、右クリックして、読み取り専用プロパティを再帰的に設定解除します。

MSDN Community でこのヒントを見つけて、私の問題を解決しました!

12
Girardi

面白いことに、まったく同じエラーが発生し、プロジェクト全体で「再構築」することで解決しました。

7
AnyOneElse

それはアクセス許可や実際のファイルアクセスの問題(AV)ではありません...

フラグを追加して、コンパイラにマニフェストの有効性をチェックさせることができます。

この検証により問題が修正されるため、再度再構築する必要はありません。
これは、手動で干渉したくない実際のビルドマシンまたは自動ビルドスクリプトを実行している人にとって非常に重要です。

このフラグを追加します。
プロジェクトプロパティ->構成プロパティ->マニフェストツール->コマンドライン->追加オプション:

/validate_manifest
6
Yochai Timmer

アンチウイルスを無効にするとうまくいきました。

4
ross

マニフェストファイルを生成する必要がない場合は、それをオフに設定するだけで問題を解決できます。

プロジェクトに移動(右クリック)

プロパティ

リンカ

マニフェストファイル

マニフェストを生成

はいからいいえに変更します

VS2008でアンチウイルスを無効にせずに問題を解決します。 ;)

楽しい :)

4
Neilkantha

Visual Studio 2010を「管理者として実行」として開き、再構築します。

2
RAK

これを試して:

  1. AVを無効にする
  2. UACの魔法の言葉(インストール、セットアップ、パッチ、アップグレード)が含まれないように、exeの名前を一時的に変更します
  3. 書き込み権限があることを確認してください
  4. mtコマンドを使用してマニフェストを注入します
  5. exeの名前を変更します
1
quick nisip

_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_を生成する前に両方を閉じます。勤勉だと思う人は誰でも here のアドバイスを適用して、元の_mt.exe_の正常な実行の出力を保存し、stdout/stderrに出力できます。

1
ulatekh

「タイミングサービス」(FireEyeの一部)を停止して無効にすることで、このエラーを解決しました

0
gd73

Hudson/Jenkinsを使用してリリースを再起動すると、問題が解決しました。

0
CEamonn