【问题标题】:Error MSB6006: "mt.exe" exited with code 31错误 MSB6006:“mt.exe”以代码 31 退出
【发布时间】:2013-05-21 22:43:29
【问题描述】:

我今天在将 VS2008 解决方案迁移到 VS2010 时遇到了这个问题。问题出现在以下任一情况:

  1. 重建解决方案
  2. 清洁后构建解决方案

如果我在其中任何一个之后进行了第二次构建,问题就不会出现。使用 Google 时,我真正想到的只是来自 Microsoft 的多年前的博客,他们说他们无法重现该问题,或者该问题已在未来的版本中得到修复。

我发现最好的东西在这里:Mikazo Tech Blog: Solve MT.exe Errors in Visual Studio 2010

在上面的文章中说问题与Manifest生成有关,解决方法是在Linker-->Manifest下的设置中关闭Manifests。我不需要此项目的清单,但我仍然不满意。

我已经解决了这个问题,我只是要回答我自己的问题,因为我没有在 StackOverflow 上发现这个特定的错误(代码 31)。

【问题讨论】:

  • Mikazo 技术博客的链接现已断开。

标签: visual-studio-2010


【解决方案1】:

警告:在包含您当前尝试构建的 *.exe 的文件夹中打开 Windows 资源管理器窗口也可能导致此错误。

例如:资源管理器在 /.../MyProj/Debug/ 中打开,同时尝试在 Visual Studio 中构建代码的 Debug 版本。

在意识到这一点之前,我对自己生气了大约 10 分钟。

【讨论】:

  • 您是否在 Windows 资源管理器中突出显示了目标文件,或者仅仅是打开该文件夹的行为?
  • 它只是打开并坐在那里。奇怪,我知道。我一关闭它就没有问题了。
【解决方案2】:

使用进程监视器和 dbgview 我发现 msmpeng (Microsoft Security Essentials) 正在访问该文件,而 mt.exe 想要独占使用它。排除开发目录解决了这个问题。 当然,这仍然是一种解决方法。

【讨论】:

  • 我还没有验证这一点,但这似乎是迄今为止最合理的解决方案 =)
  • 我遇到了这个问题,这就是原因。但是,我的解决方案是将输出目录和中间目录更改为防病毒未扫描的目录(我在公司网络上,无法配置我的防病毒)。
  • 只是为了验证;这个解决方案有效!谢谢! :)
  • 同样的事情在一夜之间发生在我们身上,完全出乎意料。不再有 Microsoft Security Essentials,它现在称为 Windows Defender。它位于设置 -> 更新和安全 -> Windows Defender -> 添加排除项。
  • 我也是今天早上第一次看到同样的问题。打开 Security Essentials 并排除我的 Visual Studio 项目文件夹也为我修复了它。感谢您的解决方案。
【解决方案3】:

在我的项目中,中间和输出目录设置为:

  • 中间目录:$(配置)\
  • 输出目录:$(SolutionDir)bin\$(Configuration)\

C/C++-->输出文件下,我有以下内容:

  • ASM 列表位置:$(IntDir)\
  • 对象文件名:$(IntDir)\
  • 程序数据库文件名:$(OutDir)\$(TargetName).pdb

Linker-->Manifest File 下,我有:

  • 清单文件:$(IntDir)$(TargetName)$(TargetExt).intermediate.manifest

解决方法是从我的 C/C++-->输出文件 部分中删除尾随的 \(因为它已经是这些变量的一部分):

  • ASM 列表位置:$(IntDir)
  • 对象文件名:$(IntDir)
  • 程序数据库文件名:$(OutDir)$(TargetName).pdb

通常情况下,使用$(IntDir)$(OutDir) 与尾随\ 的双重使用似乎不会造成麻烦,即使这是不好的做法。我现在不记得是我偶然做的还是转换过程做的,但无论出于何种原因,它似乎一直在搞砸MT.exe

我希望这对遇到此问题的其他人有用。您的设置可能会有所不同,但请考虑它可能与格式不正确的文件名有关。

【讨论】:

    【解决方案4】:

    尝试关闭 Windows Defender(或可能的其他防病毒相关软件)。众所周知,Windows Defender 会锁定文件,因为 MT.EXE 在链接器完成后运行。 WD 跳到中间检查新建的 EXE 并将其锁定为 MT.EXE。

    【讨论】:

    • ^This:仅排除 devenv.exe 的进程或自己生成的构建是不够的。它必须是构建所在的文件夹。
    【解决方案5】:

    感谢https://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/c5a3e2c3-fbf4-4268-a551-8cee195be586/test-case-13-for-vista-certification?forum=windowscompatibility,我发现通过修复构建后命令行中的“-”字符解决了这个问题。我相信一些糟糕的复制/粘贴工作已经用破折号代替了连字符。

    【讨论】:

    • 这也是我的问题,但奇怪的是构建后命令在 Visual Studio 2013 中有效,但在 Visual Studio 2017 中无效,并且开始出错。非常奇怪的坏性格。
    【解决方案6】:

    删除“调试”文件夹中的“程序调试数据库”对我有用。

    当我以高优先级运行调试文件夹中的 .exe 时发生此问题。

    【讨论】:

      【解决方案7】:

      以管理员身份运行 VS。它为我解决了这个问题。

      【讨论】:

        【解决方案8】:

        我有一个用 Visual Studio c 8.0 编写的项目 (*.sln)。最近迁移到VC10。当我选择“发布模式”时,它已成功编译。但是如果我选择“调试模式”,就会出现错误“MSB6006 mt.exe code 31”。

        我发现,在调试模式下,它使用了错误的子项目来启动。 修复启动子项目后,到目前为止一切正常。

        ---- 新状态 --- 这不会解决问题。它只是通过全部重建使问题暂时消失。此外,还有其他由迁移引起的故障。新项目中缺少“resources.h”,并且“winres.rc”被缩短。

        【讨论】:

        • 它只是通过全部重建使问题暂时消失。
        【解决方案9】:

        就我而言,这是 TortoiseGit 的问题。从 GIT 存储库中删除 Debug 和 Release 文件夹解决了这个问题。

        【讨论】:

          【解决方案10】:

          检查您是否有任何防病毒软件,例如 AVG。排除杀毒软件排除列表中的清单文件。

          【讨论】:

            【解决方案11】:

            查找 MSB8012 警告。对于 C++ 输出值和链接器输出值,您可能有不同的输出规范。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2012-10-18
              • 2020-06-19
              • 2013-02-28
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-03-01
              相关资源
              最近更新 更多