如何通过CMake设置MSVC嵌入清单?Qt6编译mt.exe报错求助
Qt6 Windows编译mt.exe c101008d错误解决
问题背景
编译Qt6执行cmake --build .时出现mt.exe写入清单失败错误:
cmd.exe /C "cd . && D:\un-setup\cmake\bin\cmake.exe -E vs_link_dll --intdir=qtbase\src\gui\CMakeFiles\Gui.dir --rc=C:\PROGRA~2\WINDOW~4\10\bin\100220~1.0\x64\rc.exe --mt=C:\PROGRA~2\WINDOW~4\10\bin\100220~1.0\x64\mt.exe --manifests -- C:\PROGRA~1\MICROS~2\2022\COMMUN~1\VC\Tools\MSVC\1430~1.307\bin\Hostx64\x64\link.exe /nologo @CMakeFiles\Gui.rsp /out:qtbase\bin\Qt6Guid.dll /implib:qtbase\lib\Qt6Guid.lib /pdb:qtbase\bin\Qt6Guid.pdb /dll /version:6.4 /machine:x64 /debug -DYNAMICBASE -NXCOMPAT -LARGEADDRESSAWARE && cd ." MT: command "C:\PROGRA~2\WINDOW~4\10\bin\100220~1.0\x64\mt.exe /nologo /manifest qtbase\bin\Qt6Guid.dll.manifest /outputresource:qtbase\bin\Qt6Guid.dll;#2" failed (exit code 0x1f) with the following output: mt.exe : general error c101008d: Failed to write the updated manifest to the resource of file "qtbase\bin\Qt6Guid.dll".
已尝试临时关闭Windows Defender、用Process Monitor排查锁定进程,均无效。
解决方案一:通过Qt Configure禁用清单嵌入
Qt的configure.bat支持直接传递CMake变量,修改configure命令,添加链接器参数关闭DLL的清单嵌入:
../configure.bat -prefix d:\Qt6 -DCMAKE_SHARED_LINKER_FLAGS="/MANIFEST:NO"
该参数会让CMake在编译DLL时跳过嵌入清单的步骤,彻底避免mt.exe的写入操作。如果需要同时禁用可执行文件的清单嵌入,可追加参数:
-DCMAKE_EXE_LINKER_FLAGS="/MANIFEST:NO"
修改后重新执行configure和编译即可。
解决方案二:彻底禁用Windows Defender
若上述方法无效,可彻底关闭Defender(注意:会降低系统安全性,编译完成后建议恢复):
方法A:组策略(仅Windows专业版/企业版)
- 按下
Win + R,输入gpedit.msc打开本地组策略编辑器 - 导航至:
计算机配置 > 管理模板 > Windows组件 > Microsoft Defender防病毒 - 找到关闭Microsoft Defender防病毒策略,双击设置为
已启用 - 重启电脑生效
方法B:注册表(所有Windows版本)
- 按下
Win + R,输入regedit打开注册表编辑器 - 导航至:
HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows Defender - 若不存在
Windows Defender项,右键新建项并命名 - 在右侧右键新建DWORD(32位)值,命名为
DisableAntiSpyware,设置值为1 - 重启电脑生效
内容的提问来源于stack exchange,提问作者wieniawski
相关产品推荐
相关产品推荐

