静态链接应用程序 - 减少大小

时间:2016-10-21 10:43:59

标签: c++ qt visual-studio-2012 linker static-libraries

我有一个动态链接的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?)

2 个答案:

答案 0 :(得分:1)

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

请注意,仅仅因为您明确不使用某项功能并不代表您所起诉的功能并非依赖于他人和其他人。无论是直接依赖还是间接依赖,依赖关系都是依赖关系。

10 MB并不是太破旧,而且相对于部署动态链接库,您已经节省了大量空间。二进制文件将包含所有必要的功能,如果您确实需要这些模块,则无法对其进行任何操作。此外,静态构建将具有稍微更好的性能(当然,部署方便)。

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

此外,即使库的数量较多,但大多数库都相当小,并且实际上不会在二进制大小上添加那么多。

最后你真的不想为Qt构建调试二进制文件 - 它们很庞大,需要花费很多时间。使用动态链接版本进行调试,仅构建用于发布的静态二进制文件。

答案 1 :(得分:1)

有一种工具可以显着减少名为upx

的可执行文件的大小

用法:

upx --best path/to/executable

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