Tanky WooRSS

关于“没有找到mingwm10.dll”的解决方案

10 Jun 2011
这篇博客是从旧博客 WordPress 迁移过来,内容可能存在转换异常。

经常遇到这个问题,每次解决后又忘掉了,这是copy下网上总结的很不错的几篇,赞一个!


1.

没有找到mingwm10.dll,因此这个程序未能启动。重新安装应用程序可能会修复此问题。”

(windows XP) \debug 文件夹下的 *.exe 文件一双击执行就提示“没有找到mingwm10.dll,因此这个程序未能启动。重新安装应用程序可能会修复此问题。”

这个问题可能是环境变量没设置好,可以通过我的电脑->属性->高级->环境变量来修改 PATH,这样能永久修改PATH. 现在我把"D:\Qt\2010.02.1\mingw\bin;D:\Qt\2010.02.1\qt\bin"加入到PATH后,可以运行了。

研究了 几天...又发现了问题

Qt Creator编译的程序,在其工程文件夹下会有一个debug文件夹,其中有程序的.exe可执行文件。但Qt Creator默认是用动态链接的,就是可执行程序在运行时需要相应的.dll文件。我们点击生成的.exe文件,首先可能显示“没有找到mingwm10.dll,因此这个应用程序未能启动。重新安装应用程序可能会修复此问题。”表示缺少mingwm10.dll文件。

解决这个问题我们可以将相应的.dll文件放到系统中。在Qt Creator的安装目录的qt文件下的bin文件夹下(我安装在了D盘,所以路径是D:\Qt\2010.02.1\qt\bin),可以找到所有的相关.dll文件。在这里找到mingwm10.dll文件,将其复制到C:\WINDOWS\system文件夹下,即可。下面再提示缺少什么dll文件,都像这样解决就可以了

UP | HOME

在Windows下部署QT程序的总结

Table of Contents

引用说明:

本文原址链接:http://hi.baidu.com/jzinfo/blog/item/c17c3f6d4ff439fe431694c3.html

以下包括了部分网上收集的,以及qt帮助里的内容(Deploying an Application on Qt/Windows)

部署发布QT程序有两种方法

第一种,静态编译,可生成单一的可执行文件。 第二种,动态编译,需同时附上需要的dll文件。

一、静态编译

1 编译QT。

要静态编译,首先要求QT是静态编译过的。在QT目录下执行:

configure.exe -static -release make sub-src

就可以编译出静态库。如果只是用来分发程序,也可以mingw32-make release sub-src只编译一个静态库。这个过程需要1-2个小时。QT目录会变成1.8G左右。注:mingw32-make和make是一样的。

如果用VC2005平台,在编译Qt的时候,configure.exe -static -platform win32-msvc2005 然后nmake sub-src或者nmake release sub-src完成静态编译。

2 编译程序。

然后到你自己的程序目录下执行:

make clean qmake -config release make

这时会得到一个非常大的可执行程序,但也会有一个重要的问题,就是图片文件显示不出来。按照QT帮助的说法,QT里的jpeg,gif等图片的支持都是以插件的形式存在的,现在我们还没有包含任何插件。

3 加入插件

在main.cpp里:

#include <QApplication> #include <QtPlugin> //这个 Q_IMPORT_PLUGIN(qjpeg) //这个 Q_IMPORT_PLUGIN(qgif) //这个 int main(int argc, char *argv[]) { QApplication app(argc, argv); … return app.exec(); }

在.pro里加入:

QTPLUGIN += qjpeg qgif CONFIG += static

QT的帮助里就做到这里,但我编译程序时出错如下:

release/main.o(.text+0×1c9):main.cpp: undefined reference to `qt_plugin_instance_qgif()’ undefined reference to `qt_plugin_instance_qjpeg()’

经过长时间研究,发现了解决问题的办法:

4 加入LIBS

在.pro中加入: LIBS += C:/Qt/4.3.3/plugins/imageformats/libqgif.a LIBS += C:/Qt/4.3.3/plugins/imageformats/libqjpeg.a 如果QT静态编译正确的话,你应该上面这个目录下看到这两个文件libqgif.a和libqjpeg.a (据说以前的QT版本也可能是.lib或.o文件)

这时已经可以正常编译运行了。但还是需要mingwm10.dll才能运行。

5 解决MinGW的mingwm10.dll依赖问题

在Makefile.release里找到:

LFLAGS = -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc -static -Wl,-s -Wl -mthreads -Wl, -subsystem,windows

删除其中的”-mthreads”

quote:

一般只有用到 threads的时候才用到mingwm10.dll,我们通常遇到的”缺少mingwm10.dll”问题,可以在程序qmake生成 makefile.release文件后删除”-mthreads”参数即可,一般在 “LFLAGS”后面。当然,这只是临时解决方案,每次都要手动修改,也可以在编译QT前先修改qmake.h,不过不推荐这种方法。其实, mingwm10.dll也就十多K,每次发布程序时一起打包也无所谓。 更多信息可以参考: http://lists.trolltech.com/qt-interest/2006-08/thread00942-0.html http://lists.trolltech.com/qt-interest/2005-10/thread00381-0.html#msg00553

这时编译同样得到一个非常大的可执行程序(我写的这个贪吃蛇一共500多行,生成的exe有8M)。用AspPack压缩一下。就可以发给用户了(这时是2.6M)。

quote: “这样编译出来的程序比较大,可以先用strip命令去掉程序里面一些无用信息后,用ASPack或者UPX之类的压缩加壳软件压缩一下,两者的压缩率基本都达到30%多一点,压缩效果还是很明显的。”

二、动态编译

动态编译就很容易了。用QT的默认安装,把生成的release下的exe文件,和下面几个核心文件放在一个文件夹里:

MINGWM10.DLL QTGUI4.DLL QTCORE4.DLL

VC2005编译程序运行时需要的几个dll文件 Microsoft.VC80.CRT.manifest 位于x:\Program Files\Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.CRT msvcm80.dll msvcp80.dll msvcr80.dll QtCore4.dll QtGui4.dll

这样就可以运行了。但图片文件还是可能显示不出来,解决办法:把程序文件夹里,建立一个imageformats目录(必须是这个名字),把qt目录下的plugin/imageformats目录下对应的dll文件copy过去。这样动态连接就完成了。

注:可以用微软的Dependency Walker tool工具,就是一个depends.exe的程序,来查看一个exe文件跟哪些dll关联。

注:需要在完全没有装QT的系统上测试发布的程序有没有DLL依赖问题。

Author: Le Cao

Date: 2010-10-12 18:02:28 CST


2.

今天刚刚装了Qt,并运行了Qt的一个简单的example,然后运行了生成在\debug 文件夹下的 *.exe 文件,但双击执行就提示“没有找到mingwm10.dll,因此这个程序未能启动。重新安装应用程序可能会修复此问题。” 这个问题可能是环境变量没设置好,可以通过:我的电脑->属性->高级->环境变量来修改PATH,这样能永久修改PATH。现在我把"C:\Qt\2009.04\mingw\bin;C:\Qt\2009.04\qt\bin"加入到PATH后,可以运行了。

下面来看看mingwm10.dll的作用:

MinGW的全称是Minimalistic GNU for Windows,它提供了基于GNU GCC 和其他相关程序( make、autoconf 等等)构造Win32 程序所必需的头文件和库。也许你首先会想到Cygwin。两者都是可以将Unix 下程序在Win32下编译运行的办法。但所不同的是,Cygwin中是将完整的POSIX 系统调用映射到本地API,使用一个模拟POSIX 调用的dll。因此在实际执行时的效率比不上本地编译代码。另外一点:Cygwin的License 是GPL,也就是说你在Cygwin上平台的代码必须开放。(这个是很难让人接受的,仅仅因为移植代码就要开放源码)

而MinGW 与Cygwin的上述两点恰好相反,它将代码编译成Win32 本地代码,使用msvcrt.dll的C运行时库。而且MinGW的其他运行库不以GPL License保护,这也意味着你使用MinGW编译的代码不必公开源码。msvcrt.dll本身是随Win32平台发行的,因此这是一个完全免费的环境。

有人会问:有Visual C++、Borland C++ 等等,为什么还要用MinGW ?第一、它们不是免费的;第二、移植Unix下的C/C++程序将十分痛苦。

目前,开源社区中Unix下许许多多著名的库和程序都有了MinGW的版本(因为移植方便)。同时Win32本地 API 和其他一些库,比如DirectX 7/8/9,OpenGL都被移植到了MinGW 下,它是理想的跨平台解决方案。

但经使用发现mingw编译的程序有的还需要mingwm10.dll这个dll。

经搜索:mingwm10.dll是mingw的一个动态链接库,但不是C运行时库.

Even when using VC++ you have to ship the C runtimes, unless you use VC++ 6 which has the same C runtime as shipped with Windows already.

Volker

NOT true, because "-mthreads" is just needed for thread-safe exception handling. Since Qt DOES NOT use exceptions at all, you can safly remove this flag on a MinGW32-System.

有-mthreads链接选项则需要这个dll。怎样静态链接进去,还没有发现。

If you wish to remove the dependency on mingwm10.dll as well, here are the steps I followed. Note: there is some discussion around the forums as to whether this is a valid solution. It seems to work for me so far.

Edit c:\qt\qt4.2.3\mkspecs\win32-g++\qmake.conf and remove all occurrences of "-mthreads". Recompile Qt as above. Compile your project and the dependency on mingwm10.dll will be no longer.

I created a MT application with u++, and run it withouth mingw10.dll successfully. This is not supposed to be possible. Multithreaded applications should be built with the "-mthreads" option given to the compiler, which will trigger dynamic linking to mingw10.dll. It is promissed that a future version of MinGW will remove this severe inconvenience. There are long discussions about this topic on the Qt forum.

That -mthreads is needed, because it makes the compiler generate thread-safe versions of some codes. It links with mingwm10.dll as the dll framework provide the only documented way a certain cleanup code could be triggered after each thread terminates. (VC++ uses an undocumented way) So I can no longer hope that you somehow miraculosly removed the dependency on mingwm10.dll.

Ok, for the benefit of Anonymous, this is how you get rid of mingwm10.dll.

Edit the file $QTDIR\mkspecs\win32-g++\qmake.conf and remove all instances of -mthreads. Then recompile your app. The mingwm10.dll is no longer a dependancy Disclaimer: No-one seems to be entirely sure what that DLL is there for. The best explanation I've seen is that it has something to do with propagating exceptions in multithreaded programs. However, Qt doesn't use exceptions, so unless you use them yourself, it shouldn't be a problem. I haven't had any problems with the DLL removed, and many others have reported smooth sailing as well. However, this could create problems if you use exceptions and threads in your program.

As far as I know mingw-compiled multithreaded applicaions should always be dynamically linked to mingwm10.dll, so this file should be available on computers running the application. It seems that U++ somehow removes this nasty limitation. How is that possible?

Technorati : gnu, mingw Del.icio.us : gnu, mingw Ice Rocket : gnu, mingw Flickr : gnu, mingw Zooomr : gnu, mingw Buzznet : gnu, mingw Riya : gnu, mingw 43 Things : gnu, mingw

“没有找到mingwm10.dll,因此这个程序未能启动。重新安装应用程序可能会修复此问题。”(windows XP) 1》\debug 文件夹下的 .exe 文件一双击执行就提示“没有找到mingwm10.dll,因此这个程序未能启动。重新安装应用程序可能会修复此问题。” 这个问题可能是环境变量没设置好,可以通过 我的电脑->属性->高级->环境变量来修改 PATH,这样能永久修改PATH. 现在我把"F:\ProgramFiles\Qt\2009.01\mingw\bin;F:\ProgramFiles\Qt\2009.01\qt\bin"加入到PATH后,可以运行了。 2》用 Qt designer 设计好 *.ui 之后, 要得到所需要的 *.h/.cpp 文件时, 需要用到 uic.exe。一开始以为只要把uic.exe拷到.ui同一文件夹下就可以了,当执行 uic *.ui -o *.h 时,提示“没有找到mingwm10.dll,因此这个程序未能启动。重新安装应用程序可能会修复此问题。” 之后试了下把 *.ui 拷到 uic.exe 的文件夹下(F:\ProgramFiles\Qt\2009.01\qt\bin),用命令行 cmd 切换到该目录下,再在执行 uic *.ui -o *.h, 可以得到相应的 *.h 文件了。另外,在Qt designer中好像可以直接通过工具栏 "窗体-->查看代码" 来获得 *.h 的代码, copy出来就OK了. 有一点需要注意:qt4之前的版本是需要 uic *.ui -o *.h / uic *.ui -o *.cpp 来得到 **.h/.cpp的,而在 qt4 中之需要得到 **.h. 关于这一点在另一篇文章 "Qt4与Qt3的主要不同" 中有比较详细的说明. 既然要更新控件,那么你就需要使用QDesigner工具来重新画界面了,OK,重画只是纯体力劳动,好说。界面画好后,使用uic来根据界面生成代码文件,QT3的uic可以自动生成.h和.cpp文件,假设你在制作一个名叫TestDialog的对话框,那么 QT3的uic生成的文件则是TestDialog.h和TestDialog.cpp,所有的界面初始化工作都在cpp文件中执行,之后程序的逻辑代码也将加入这个文件,那么对于一个已经完成逻辑功能的对话框来说,如果要修改界面布局,你就不得不重新用uic生成.h和.cpp文件,然后将其中界面相关的代码复制到你已经修改的文件中,此时决不能直接用uic直接生成到修改过的文件上,因为那样你的代码将全部被冲掉。这一点上,QT4进步了,因为QT4中推荐的方法是,使用uic根据界面文件生成一个h文件,以前面的TestDialog为例,生成的文件叫做uiTestDialog.h,其中会实现一个名为UiTestDialog的类,包含了界面所有控件的加载功能,而程序的逻辑功能依然使用TestDialog.h,和 TestDialog.cpp这两个功能,并在TestDialog.h中用多重继承的方法,从刚才的UiTestDialog类来继承出实际的 TestDialog类,在TestDialog的构造函数中,只需要使用UiTestDialog::setupUi()方法,就可以构建出整个界面,并且由于是从UiTestDialog继承来的,在逻辑代码中也可以方便的访问所有控件。从这一点来说,QT4的方法是个巨大的进步,因为uixxx.h中不再包含任何用户自己写的代码了,此时你想更改界面布局的话,只需要用QDesigner修改界面,再用uic生成uixxx.h文件,直接替换原文件就可以了。当然,QT的uixxx.h文件还有其它的使用方法,不一定要使用多重继承的方法,在这里我只是介绍了我认为最方便的方法。另外,如果你所设计的界面比较复杂,需要将某部分界面独立在其它Widget中设计和写逻辑代码,那么最上层的Dialog的ui_xxx.h文件还是需要手动修改的,不过相对于QT3,这样的修改还是非常简单的。

HTML generated by org-mode TAG=7.01g in emacs 23


3.

今天刚刚装了Qt,并运行了Qt的一个简单的example,然后运行了生成在\debug 或\release文件夹下的 *.exe 文件,但双击执行就提示“没有找到mingwm10.dll,因此这个程序未能启动。重新安装应用程序可能会修复此问题。”

现在我给你你想要的结果!

1,我的电脑->属性->高级->环境变量来修改PATH,这样能永久修改PATH。

现在我把"C:\Qt\2009.04\mingw\bin;C:\Qt\2009.04\qt\bin"加入到PATH后,可以运行了。

这种方法看起来有点高级,不过不是什么好办法。那在其他电脑上运行怎么办?在设置一下?呵呵

2,把需要的那几个dll文件放在你exe文件所在目录release或debug。这样有个不好的地方就是那个目录release或debug会增加20M左右,这可不是好事。这个好在什么也不用设置,直接把release拷过去就可以运行。可以在任何微软windows里跑了,呵呵!

3,把需要的那几个dll文件放在你电脑系统c->windows->win32里,这样的话,运行其他的基于qt的应用也没有问题了,可以说是一劳永逸。最好的解决办法,对学习qt的我们来说。

这里我说的那几个dll,就是你运行时找不到的那几个dll,不是一个,报错时是一个一个的报。通常是mingwm10.dll,QtCore4.dll,QtGui4.dll。这3个是必备的,其他的就看你程序中用到什么了。这个我就不多说了。

最后你要的那些文件在你的qt安装目录里的bin里,如:C:\Qt\2009.04\qt\bin


另外,在搜索这两个dll时,QtCore4.dll,QtGui4.dll,发现/bin和/qt/bin下都有,不过在/qt/bin下的都要大一些,网上是这么解释的:

qt目录下的是qt4.5.2完整的开发框架( 库) qt/bin 下的dll 是运行你编写的qt程序所必须的。

/bin 下面得这些dll是给你的qtcreator用的,如果你自己编译qtcreator的话,就没有这些东西,而是直接用 qt/bin下的dll了。

反正我是选择了/qt/bin下的dll