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

Posted

技术标签:

【中文标题】mt.exe:一般错误 c101008d:无法将更新的清单写入文件资源...访问被拒绝【英文标题】:mt.exe : general error c101008d: Failed to write the updated manifest to the resource of file ... Access is denied 【发布时间】:2011-04-16 01:56:18 【问题描述】:

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

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

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

有人知道如何解决这个问题吗?谢谢。

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

为了完整起见symantec.com/business/support/… 你是救生员! +1,这对我帮助很大。 即使是WindowsDefender 似乎也停留在这种状态。 我将文件夹添加到排除列表中,tenforums.com/tutorials/… 如果您有 Windows Defender,请使用以下步骤并关闭实时保护:wisecleaner.com/how-to/…【参考方案2】:

转到Debug 和/或Release 文件夹,右键单击并以递归方式取消设置只读属性。

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

【讨论】:

这正是我所需要的。 这不是问题,因为错误仍然发生。这似乎是一些间歇性问题 - 有时编译工作,有时它不会......一旦系统升级到 Windows 10(我的公司与该图像一起使用的任何有效负载)就会出现。在我的旧 Windows 7 系统下从来没有问题。【参考方案3】:

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

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

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

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

/validate_manifest

【讨论】:

这解决了我的问题。如你所说,通常是 Build-Machineautomatic buildscript【参考方案4】:

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

【讨论】:

【参考方案5】:

禁用防病毒对我有用。

【讨论】:

任何特定品牌的防病毒软件? 如果安装了avast antivirus,就会出现这个问题。【参考方案6】:

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

【讨论】:

【参考方案7】:

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

转到项目(右键单击)

属性

链接器

清单文件

生成清单

将“是”改为“否”

它为我解决了 VS2008 上的问题,而无需禁用防病毒。 ;)

享受:)

【讨论】:

在 VS2010 上也为我工作【参考方案8】:

我使用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,直到成功为止。

奇怪的是,在确定mt.exe 已成功时,MSBuild 似乎并没有检查零状态——它似乎在寻找写入 stdout/stderr 的错误消息。所以这个程序在生成原始mt.exe 之前关闭了这两个程序。有心的人可以借鉴here找到的建议,保存原mt.exe运行成功的输出,输出到stdout/stderr。

【讨论】:

我已将您的代码用作github 上的项目的基础。希望你不会介意。 @ElDorado:我当然不介意!谢谢夸奖!【参考方案9】:

试试这个:

    禁用 AV 临时重命名您的 exe,使其不包含任何 UAC 魔术词(安装、设置、补丁、升级) 确保您具有写入权限 使用 mt 命令注入清单 重命名你的exe文件

【讨论】:

【参考方案10】:

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

【讨论】:

【参考方案11】:

我通过停止和禁用“计时服务”(FireEye 的一部分)解决了这个错误

【讨论】:

【参考方案12】:

如果您的项目存储在 Dropbox 中,您必须退出 Dropbox 才能构建。这也是使用虚幻引擎时的一个问题。

【讨论】:

如果这是一个已知问题,您能否提供一个链接到它的记录位置?

以上是关于mt.exe:一般错误 c101008d:无法将更新的清单写入文件资源...访问被拒绝的主要内容,如果未能解决你的问题,请参考以下文章

vs2005 一般错误 C10100b1(C++)

MT.EXE程序测试报告

vs2008编译成功,生成mt.exe时出错

为软件提升管理员权限(mt.exe)

为软件提升管理员权限(mt.exe)

为软件提升管理员权限(mt.exe)