mt.exe:一般错误c101008d:无法将更新后的清单写入文件资源...访问被拒绝

时间:2010-09-23 04:11:12

标签: c++ visual-studio visual-studio-2008

即使我构建一个新的C ++项目并尝试构建一个发布文件,我也经常遇到这个问题。

我使用Visual Studio 2008.可能导致此问题的一件事是我的代码保存在服务器磁盘上,而不是本地硬盘上。

mt.exe:一般错误c101008d:无法将更新后的清单写入文件“.. \ Release \ PGTS_version17C.exe”的资源。该进程无法访问该文件,因为它正由另一个进程使用。

任何人都知道如何解决这个问题?感谢。

11 个答案:

答案 0 :(得分:40)

如果要嵌入清单文件,则防病毒程序可能会在嵌入清单之前锁定并扫描您的exe文件。

我建议禁用防病毒来读取您的DEBUG和RELEASE输出文件夹。

答案 1 :(得分:12)

转到Debug和/或Release文件夹,右键单击并取消设置“只读”属性。

MSDN Community找到了这个提示并解决了我的问题!

答案 2 :(得分:7)

有趣的是,我有完全相同的错误,整个项目的“重建”解决了它。

答案 3 :(得分:6)

它不是权限或实际文件访问问题(AV)...

您可以添加标志以使编译器检查清单的有效性。

此验证将解决问题,因此您无需再次重建它 这对于任何运行实际构建机器或自动构建脚本且不想手动干扰的人来说非常重要:

添加此标志:
项目属性 - >配置属性 - >清单工具 - >命令行 - >其他选项:

/validate_manifest

答案 4 :(得分:4)

禁用反病毒功能对我有用。

答案 5 :(得分:4)

如果您不需要生成清单文件,只需将其关闭即可解决问题。

  

转到项目(右键单击)

     

属性

     

链接器

     

清单文件

     

生成清单

     

将其改为否

它解决了我在 VS2008 上的问题而没有禁用防病毒功能。 ;)

享受:)

答案 6 :(得分:2)

将Visual Studio 2010打开为“以管理员身份运行”并再次重建。

答案 7 :(得分:1)

I worked around this with a "wrapper" program for mt.exe, one that reran it until it succeeded. Save the following code as 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;
}

Build this program, go to your C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin folder, rename the old mt.exe to mt-orig.exe (and the mt.exe.config to mt-orig.exe.config), and put this wrapper program in there as mt.exe. Now, when you build, it will retry running the original mt.exe until it succeeds.

Oddly, MSBuild doesn't seem to check for a zero status when deciding that mt.exe has succeeded — it seems to look for error messages written to stdout/stderr. So this program closes both of those before spawning the original mt.exe. Anyone feeling industrious can apply the advice found here to save the output of the successful run of the original mt.exe, and output it to stdout/stderr.

答案 8 :(得分:1)

试试这个:

  1. 禁用AV
  2. 临时重命名您的exe,因此它不包含任何UAC魔术字(安装,设置,补丁,升级)字样
  3. 确保您具有写入权限
  4. 使用mt命令注入清单
  5. 重命名你的exe

答案 9 :(得分:0)

如果您正在使用Hudson / Jenkins创建版本,重新启动它可以解决我的问题。

答案 10 :(得分:0)

我通过停止和禁用'Timing Service'(FireEye的一部分)来解决这个错误