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

问题描述 投票:0回答:14

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

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

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

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

c++ visual-studio visual-studio-2008
14个回答
52
投票

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

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


16
投票

转到

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

MSDN 社区找到了这个技巧并解决了我的问题!


14
投票

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

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

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

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

/validate_manifest

8
投票

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


5
投票

禁用防病毒软件对我有用。


4
投票

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

转到项目(右键单击)

属性

链接器

清单文件

生成清单

将“是”更改为“否”

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

享受:)


3
投票

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


3
投票

我使用

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。


1
投票

试试这个:

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

1
投票

就我而言,这里提出的建议都不起作用。我在 VS 2019 中使用 Ninja 构建,并且构建仅在 Jenkins 中随机失败。在我们的例子中,禁用清单不是一个选项。作为解决方法,我在链接阶段禁用清单,但添加了带有 POST_BUILD 步骤的自定义目标,以使用 mt.exe 嵌入清单。

在链接阶段禁用清单

target_link_options(target_name PRIVATE /MANIFEST:NO)

添加构建后步骤。如果使用 dll,请将 #1(用于 exe)更改为 #2

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 服务器现在没有出现故障。


0
投票

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


0
投票

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


0
投票

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


0
投票

我也有同样的问题。 并且禁用防病毒解决方案不是一个选择,因为公司政策规定不能禁用防病毒解决方案。 并且公司政策不允许为防病毒扫描指定例外文件夹。 但我发现每次构建解决方案(而不是重建)时,防病毒解决方案锁定的二进制文件(dll 或 exe)都会发生变化。 因此,在尝试构建解决方案 10 次或更多次之后,我终于成功构建了整个解决方案。 只需在第一次重建后多次尝试构建解决方案即可。

© www.soinside.com 2019 - 2024. All rights reserved.