静态链接的应用程序大小减小

Statically linked application - size reduction

本文关键字:应用程序 链接 静态      更新时间:2023-10-16

我有一个动态链接的300 KB应用程序,由于很多问题,我决定尝试静态链接构建。

我用以下命令配置Qt:

configure -c++11 -mp -static -debug-and-release -platform win32-msvc2012 -opengl desktop -opensource -confirm-license -make libs -nomake tools -nomake tests -nomake examples -no-openssl -skip webkit
在动态链接的构建中,我只需要链接到依赖项:
qtmain.lib
Qt5Gui.lib
Qt5Core.lib
Qt5Widgets.lib
Qt5Network.lib
Qt5WinExtras.lib
qwindows.lib

现在我必须使用15个库!

qtmain.lib
qtpcre.lib
Qt5Gui.lib
Qt5Core.lib
Qt5Widgets.lib
Qt5Network.lib
Qt5WinExtras.lib
opengl32.lib
imm32.lib
Ws2_32.lib
Qt5PlatformSupport.lib
qtfreetype.lib
winmm.lib
qtharfbuzzng.lib
qwindows.lib

我的意思是,如果我在解决方案中不使用正则表达式或自由类型,为什么我必须链接到qtpcreqtfreetype ?我真的需要这些吗?

我已经尝试启用完全优化。

在结果中,我的应用程序大小为10,731KB,这真的令人沮丧和沮丧。有可能降低吗?也许是外部应用程序?

(是的,我知道这是一个静态构建,它不会是一个7MB或更少的文件,但也许我可以得到低于10MB至少?)

有一个工具可以显著减小可执行文件的大小,叫做upx

用法:

upx --best path/to/executable

还考虑添加不打印输出的-q选项)。通过这种方式,您甚至可以将此工具添加到构建过程中,以避免额外的手动步骤。

额外的依赖项可能是动态构建时加载的系统库或间接依赖项。在静态构建中,这些不能用作插件,必须包含在二进制文件中。

请记住,仅仅因为你明确不使用某个功能并不意味着你使用的功能不依赖于其他人。无论依赖关系是直接的还是间接的,它都是一个依赖关系。

10 MB并不算太差,相对于部署动态链接库,您已经节省了相当多的空间。二进制文件将包含所有必要的功能,如果你真的需要这些模块,你真的不能对它做任何事情。另外,静态构建将会有稍好的性能(当然还有部署的便利性)。

我不记得默认的编译器标志,但它很可能没有针对默认大小进行优化,因此对于MSVC,您可以通过使用/O1作为最小大小来获得更小的二进制文件。请注意,这可能会导致轻微的性能下降。

另外,尽管库的数量比较多,但它们中的大多数都相当小,不会真正增加那么多的二进制文件大小。

最后,你真的不想为Qt构建调试二进制文件——它们太大了,浪费了很多时间。使用动态链接版本调试,只构建静态二进制文件供发布。