我是使用Qt的新手,我不知道很多东西。
作为测试,我使用基于最新 Qt5.1 的 Visual Studio 2012 和Qt-VS-Add-in创建了一个简单的应用程序
编译应用程序后,它对我不起作用(给出错误),我在互联网上搜索,发现很多人说我必须从目录中复制下面提到的那些dll:
C:\Qt\Qt5.1.0\5.1.0\msvc2012\bin\
DLL我必须复制才能使我的应用程序正常工作:
icudt51.dll
icuin51.dll
icuuc51.dll
libEGL.dll
libGLESv2.dll
Qt5Core.dll
Qt5Gui.dll
Qt5Widgets.dll
我的问题是这些dll的大小,它们大约是“37 MB”而我的应用程序本身只是“30 KB”!所以,那些Qt库将为我的应用程序添加至少37 MB [我不认为它与我下载的其他基于Qt的应用程序一起发生]。有没有任何解决方案可以让我最终得到一个小的.exe文件?!
我听到有些人说我必须为Microsoft C ++编译器添加一个dll,你能为我解释一下这个吗?
注意:我在StackOverFlow上遇到了很多问题,但我找不到任何可以帮助我的东西,所以请不要将此标记为重复,因为如果我找到了清楚的话回答我不会发布这个问题!
任何帮助都将不胜感激。
答案 0 :(得分:25)
更新:使用windeployqt.exe
!它的效果非常好。
http://doc.qt.io/qt-5/windows-deployment.html#the-windows-deployment-tool
使用windeployqt的最简单方法是添加bin目录 你的Qt安装(例如)到PATH变量然后 运行:
windeployqt <path-to-app-binary>
更新:经过进一步测试,windeployqt
没有为我复制所有的MingW dll。 (使用MingW 4.9.1在Windows 10上使用Qt 5.4进行测试)。因此,您需要在部署之前手动获取最后3个dll:
libgcc_s_dw2-1.dll
libstdc++-6.dll
libwinpthread-1.dll
这
C:\Qt\5.4\mingw491_32\bin
我想你的列表中可能还有一些额外内容......我会仔细检查以下链接中的文档......
以下是关于它的权威文件:
http://doc.qt.io/qt-5/windows-deployment.html
http://doc.qt.io/qt-5/windows-deployment.html#application-dependencies
令人惊叹的Qt图书馆可以做很多事,但它们有点大。一些旧版本的Qt可能会小一些。
对于Qt 4.8,msvc QtCore4.dll
为2.5 MB,QtGui4.dll
为8.4 MB。
以下是Windows在运行时跟踪库的方式:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms682586(v=vs.85).aspx
如果你静态链接,那么你的EXE应该抓住它需要的库并构建到一个独立的exe中。它仍然可能依赖于msvc可再发行组件。有关它的更多信息,请参阅下一节。但它现在编译你引用到EXE中的.lib
,你的exe不再指向其他动态链接的库。获取静态链接的exe环境确实需要更多时间。
您的exe肯定会变大,因为它现在包含您之前引用的库的二进制信息。
https://www.google.com/search?q=qt+static+linking
编辑:
静态构建exe,意味着您没有使用LGPL版本。
意味着如果您使用的是LGPL,则必须让目标文件易于访问最终用户。
我认为@peppe描述得很好(见下面的评论):
从技术上讲,即使你的应用程序没有使用LGPL,你也可以在LGPL下使用Qt时静态链接。唯一棘手的要求是保持第三方能够根据不同的Qt版本重新链接您的应用程序。但你可以很容易地遵守这一点,f.i。通过提供应用程序的巨大目标文件(.o),只需要与任何Qt版本链接。
http://blog.qt.io/blog/2009/11/30/qt-making-the-right-licensing-decision/
查看底部附近的图表。如果您正在使用商业版本,那么您可以静态链接,而无需担心目标文件。
可再发行的依赖项与运行时库链接器选项有关。
http://msdn.microsoft.com/en-us/library/aa278396(v=vs.60).aspx
/MD, /ML, /MT, /LD
(使用运行时库)
要在开发环境中查找这些选项,请单击“项目”菜单上的“设置”。然后单击“C / C ++”选项卡,再单击“类别”框中的“代码生成”。请参阅“使用运行时库”下拉框。
下面的这两个链接谈论了一些旧版本的visual studio,但推理应该仍然有效。
http://www.davidlenihan.com/2008/01/choosing_the_correct_cc_runtim.html
How do I make a fully statically linked .exe with Visual Studio Express 2005?
希望有所帮助。
答案 1 :(得分:7)
只需打开终端执行your_qt_installpath/version/compiler/bin/windeployqt.exe YourApplication.exe
即可。它会自动将所有必需的库和东西复制到你的exe所在的文件夹中,你可以分发它。
答案 2 :(得分:1)
对于Windows,您需要添加qminimal.dll
和qwindows.dll
,您必须将它们放在名为platforms
的文件夹中。
即使您的程序很小,您仍然会调用大型库来执行图形界面。如果大小非常重要,你应该做一个控制台项目。
PS:您可以通过dependency walker打开您的exe来检查您真正需要的所有库。
答案 3 :(得分:1)
我找到了另一种解决方法而无需再次重新编译Qt!
[此解决方案可能会影响应用程序执行时间]
压缩所有二进制文件后,我们想获得一个.exe文件,所以我们可以使用
Enigma Virtual Box [http://enigmaprotector.com/en/downloads.html]将所有.dll文件与主可执行文件合并,我们最终会得到一个小的.exe文件!
我现在就这样做,因为我无法在当前机器上使用我自己的配置重新编译Qt。
答案 4 :(得分:1)
我认为 Qt5.2 需要更少的dll。
Qt5Core.dll
Qt5Gui.dll
Qt5Widgets.dll
在Windows中你还需要在“平台”文件夹中使用“qwindows.dll”。 试一试。
答案 5 :(得分:1)
减小DLL大小的可能性是通过用Alax Alrufaie提到的UPX压缩它们。另一种方法是将其包装到安装程序(例如Inno Setup)中。如果您想将它分发给最终用户,后一个特别有用。我有一个简单的应用程序需要Qt5Core.dll,Qt5Gui.dll,Qt5Widgets.dll和qwindows.dll(在文件夹&#34;平台&#34;)大约17 MB。创建安装文件后,它缩小到5 MB。