今天使用VS2008,想要release编译时出现“mt.exe停止工作”,网上最多在解决方法是:
清单工具--》输入和输出--》嵌入清单 默认“是” 将其值改成“否”
但这样的话生成的exe文件需要带着相关的..manifest文件才能运行。因为它没把清单嵌入进去,可见这种方法是不行的。
最终我找到了另一个解决方法(http://hi.baidu.com/herohbc/blog/item/726b02025f3cc5f709fa93e8.html):如下
昨天晚上用VS2008编译Qt的程序时,突然弹出下面的对话框,提示mt.exe已停止工作。
单击取消或者关闭程序后,给出以下错误信息:
1>------ Build started: Project: findDialog, Configuration: Debug Win32 ------
1>Compiling...
1>finddialog.cpp
1>Linking...
1>Embedding manifest...
1>Project : error PRJ0002 : Error result -1073741819 returned from 'C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\mt.exe'.
1>Build log was saved at "file://F:\temp\QT\findDialog\Debug\BuildLog.htm"
1>findDialog - 1 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
多次调试,都出现相同的问题。为了解决问题,我进行了以下试验。
1.重启VS2008,不能解决问题。
2.重启电脑,不能解决问题。
3.在Release环境下调试,弹出相同的对话框。
4.调试不是基于Qt的程序,没有任何问题,可以确定是Qt的影响。但我前几天调试Qt的程序也没有问题。
5.按照网上的帮助,在Debug环境下,将Project->findDialog Properties->Configuration Properties->Linker->Manifest File中的Generate Manifest由原来的Yes设置为No,这时可以成功地进行编译和连接,但运行的时候弹出以下对话框。
我又去网上下载了一个msvcr90d.dll文件,放到可执行程序所在的目录下,再运行程序,弹出下面的对话框。
看来并不是真的缺少文件mscvr90d.dll。
6.在Release环境下,将Generate Manifest设置为No,也可以编译和连接成功,但运行的时候依然提示缺少文件mscvr90d.dll。我觉得应该是mscvr90.dll,不知道怎么回事。
7.以前编写的Qt程序程序都可以正常运行,再一次说明了并不是真的缺少文件mscvr90d.dll。再说我也没有删除这个文件啊。
8.将以前编写的Qt程序重新调试一下,依旧不能调试成功,生成的可执行文件也不能运行。应该是VS2008和Qt的兼容出现了问题。
9.同样按照网上的帮助,将Project->findDialog Properties->Configuration Properties->C/C++->Code Generation中的Runtime Library由原来的Multi-threaded Debug DLL (/MDd)设置为Multi-threaded Debug(/MTd),调试时出现以下错误
1>------ Build started: Project: findDialog, Configuration: Debug Win32 ------
1>Compiling...
1>finddialog.cpp
1>moc_finddialog.cpp
1>qrc_finddialog.cpp
1>main.cpp
1>Generating Code...
1>Linking...
1>msvcrtd.lib(ti_inst.obj) : error LNK2005: "private: __thiscall type_info::type_info(class type_info const &)" (??0type_info@@AAE@ABV0@@Z) already defined in LIBCMTD.lib(typinfo.obj)
1>msvcrtd.lib(ti_inst.obj) : error LNK2005: "private: class type_info & __thiscall type_info::operator=(class type_info const &)" (??4type_info@@AAEAAV0@ABV0@@Z) already defined in LIBCMTD.lib(typinfo.obj)
1>LIBCMTD.lib(crt0init.obj) : warning LNK4098: defaultlib 'msvcrtd.lib' conflicts with use of other libs; use /NODEFAULTLIB:library
1>F:\temp\QT\findDialog\Debug\findDialog.exe : fatal error LNK1169: one or more multiply defined symbols found
1>Build log was saved at "file://F:\temp\QT\findDialog\Debug\BuildLog.htm"
1>findDialog - 3 error(s), 1 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
这次是连接错误。在Release环境下,也出现上述错误信息。
10.经过这么多的试验,依然没有解决问题。最近既没有装新的软件也没有对VS2008的配置进行修改,想来想去只有一个可能,那就是Windows Update导致的。打开Windows Update的更新历史记录
可以发现,用于Windows 7 x86的Microsoft.Net Framework 4 Client Profile(KB982670)是最可能导致问题出现的更新。在控制面板的程序卸载窗口中卸载掉该程序,重新启动电脑后,再调试Qt程序,一切OK了!
该更新的说明如下:Microsoft .NET Framework 4 Client Profile 提供了 .NET Framework 4 中的一部分功能。Client Profile 可优化客户端应用程序并且能够尽可能快地部署 Windows Presentation Foundation (WPF) 和 Windows 窗体。
Qt恰恰是设计用户界面的,二者不兼容也就可以理解了。
注:估计大家很少遇到与本文完全一样的问题。我写这篇文章的目的是演示如何用排除法一步步的解决问题,毕竟每个人遇到的问题不一样,单靠去网上搜索是行不通的,关键还是养成一种分析问题和解决问题的能力。呵呵,本人文采不好,多包涵。
按上前面的说明,本人删除了Microsoft .NET Framework 4 Client Profile确实可以 正常release了。