新しいC++プロジェクトをビルドしてリリースファイルをビルドしようとしても、この問題がよく発生します。
Visual Studio 2008を使用しています。この問題の原因の1つは、ローカルハードディスクではなくサーバーディスクにコードが保存されていることです。
mt.exe:一般エラーc101008d:ファイル "..\Release\PGTS_version17C.exe"のリソースへの更新されたマニフェストの書き込みに失敗しました。別のプロセスによって使用されているため、プロセスはファイルにアクセスできません。
誰もこれを解決する方法を知っていますか?ありがとう。
マニフェストファイルを埋め込む場合、ウイルス対策プログラムは、マニフェストを埋め込む前にexeファイルをロックおよびスキャンする場合があります。
DEBUGおよびRELEASE出力フォルダーの読み取りからアンチウイルスを無効にすることをお勧めします。
Debug
および/またはRelease
フォルダーに移動し、右クリックして、読み取り専用プロパティを再帰的に設定解除します。
MSDN Community でこのヒントを見つけて、私の問題を解決しました!
面白いことに、まったく同じエラーが発生し、プロジェクト全体で「再構築」することで解決しました。
それはアクセス許可や実際のファイルアクセスの問題(AV)ではありません...
フラグを追加して、コンパイラにマニフェストの有効性をチェックさせることができます。
この検証により問題が修正されるため、再度再構築する必要はありません。
これは、手動で干渉したくない実際のビルドマシンまたは自動ビルドスクリプトを実行している人にとって非常に重要です。
このフラグを追加します。
プロジェクトプロパティ->構成プロパティ->マニフェストツール->コマンドライン->追加オプション:
/validate_manifest
アンチウイルスを無効にするとうまくいきました。
マニフェストファイルを生成する必要がない場合は、それをオフに設定するだけで問題を解決できます。
プロジェクトに移動(右クリック)
プロパティ
リンカ
マニフェストファイル
マニフェストを生成
はいからいいえに変更します
VS2008でアンチウイルスを無効にせずに問題を解決します。 ;)
楽しい :)
Visual Studio 2010を「管理者として実行」として開き、再構築します。
これを試して:
_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に出力できます。
「タイミングサービス」(FireEyeの一部)を停止して無効にすることで、このエラーを解決しました
Hudson/Jenkinsを使用してリリースを再起動すると、問題が解決しました。