即使我构建一个新的 C++ 项目并尝试构建发布文件,我也经常遇到这个问题。
我使用Visual studio 2008。可能导致此问题的一件事是我的代码保存在服务器磁盘上,而不是本地硬盘上。
mt.exe:一般错误 c101008d:无法将更新的清单写入文件“..\Release\PGTS_version17C.exe”的资源。该进程无法访问该文件,因为该文件正在被另一个进程使用。
有人知道如何解决这个问题吗?谢谢。
如果您要嵌入清单文件,您的防病毒程序可能会在嵌入清单之前锁定并扫描您的 exe 文件。
我建议禁用防病毒软件读取 DEBUG 和 RELEASE 输出文件夹。
这不是权限或实际文件访问问题(AV)...
您可以添加一个标志来让编译器检查清单的有效性。
此验证将解决问题,因此您无需再次重建它。
这对于任何运行实际构建机器或自动构建脚本(您不想手动干预)的人来说非常重要:
添加此标志:
项目属性 -> 配置属性 -> 清单工具 -> 命令行 -> 其他选项:
/validate_manifest
有趣的是,我遇到了完全相同的错误,并且对整个项目进行“重建”解决了它。
禁用防病毒软件对我有用。
如果不需要生成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
直到成功。
奇怪的是,当确定
mt.exe
已成功时,MSBuild 似乎不会检查零状态 - 它似乎会查找写入 stdout/stderr 的错误消息。 因此,该程序在生成原始 mt.exe
之前关闭了这两个程序。任何勤奋的人都可以应用here找到的建议来保存原始mt.exe
成功运行的输出,并将其输出到stdout/stderr。
试试这个:
就我而言,这里提出的建议都不起作用。我在 VS 2019 中使用 Ninja 构建,并且构建仅在 Jenkins 中随机失败。在我们的例子中,禁用清单不是一个选项。作为解决方法,我在链接阶段禁用清单,但添加了带有 POST_BUILD 步骤的自定义目标,以使用 mt.exe 嵌入清单。
target_link_options(target_name PRIVATE /MANIFEST:NO)
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 服务器现在没有出现故障。
如果您使用 Hudson/Jenkins 创建版本,重新启动它可以解决我的问题。
我通过停止并禁用“计时服务”(FireEye 的一部分)解决了这个错误
如果您的项目存储在 Dropbox 中,则必须退出 Dropbox 才能构建。这也是使用虚幻引擎时的一个问题。
我也有同样的问题。 并且禁用防病毒解决方案不是一个选择,因为公司政策规定不能禁用防病毒解决方案。 并且公司政策不允许为防病毒扫描指定例外文件夹。 但我发现每次构建解决方案(而不是重建)时,防病毒解决方案锁定的二进制文件(dll 或 exe)都会发生变化。 因此,在尝试构建解决方案 10 次或更多次之后,我终于成功构建了整个解决方案。 只需在第一次重建后多次尝试构建解决方案即可。