静态链接的应用程序 - 尺寸减小
Statically linked application - size reduction
我有一个 300 KB
动态 link 应用程序,由于很多问题,我决定尝试静态 linking 构建。
我使用以下配置 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
在动态 linked 构建中,我只需要 link 依赖项:
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
我的意思是,如果我没有在我的解决方案中使用正则表达式或自由类型,为什么我必须 link 而不是 qtpcre
或 qtfreetype
?我真的需要所有这些吗?
我尝试启用完全优化。
在结果中,我的应用程序大小为 10,731KB,这真是令人沮丧和沮丧。有没有可能减少它?可能是外部应用程序?
(是的,我知道这是一个静态构建,不会是 7MB 或更少的文件,但也许我至少可以低于 10MB?)
额外的依赖项可能是系统库,否则动态构建会动态加载或间接依赖项。在静态构建中,它们不能用作插件,必须包含在二进制文件中。
请记住,仅仅因为您明确不使用某项功能并不意味着您所起诉的功能不依赖于其他人和其他人。依赖就是依赖,不管是直接依赖还是间接依赖
10 MB 还算不错,相对于部署动态 link 库,您已经节省了大量 space。二进制文件将包含所有必要的功能,如果您确实需要这些模块,您将无能为力。此外,静态构建的性能会稍微好一些(当然还有部署便利性)。
我不记得默认的编译器标志,但它很可能默认情况下没有针对大小进行优化,因此对于 MSVC,您可以通过使用 /O1
作为最小大小来获得更小的二进制文件。请注意,这可能会导致性能略有下降。
此外,尽管库的数量更多,但它们中的大多数都相当小,不会真正增加二进制文件的大小。
最后,您真的不想为 Qt 构建调试二进制文件 - 它们很大,而且会浪费很多时间。使用动态 link 版本进行调试,仅为发布构建静态二进制文件。
有一个工具可以显着减小可执行文件的大小,称为 upx
用法:
upx --best path/to/executable
还考虑添加 -q
不会打印输出的选项)。这样您甚至可以将此工具添加到您的构建过程中以避免额外的手动步骤。
我有一个 300 KB
动态 link 应用程序,由于很多问题,我决定尝试静态 linking 构建。
我使用以下配置 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
在动态 linked 构建中,我只需要 link 依赖项:
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
我的意思是,如果我没有在我的解决方案中使用正则表达式或自由类型,为什么我必须 link 而不是 qtpcre
或 qtfreetype
?我真的需要所有这些吗?
我尝试启用完全优化。
在结果中,我的应用程序大小为 10,731KB,这真是令人沮丧和沮丧。有没有可能减少它?可能是外部应用程序?
(是的,我知道这是一个静态构建,不会是 7MB 或更少的文件,但也许我至少可以低于 10MB?)
额外的依赖项可能是系统库,否则动态构建会动态加载或间接依赖项。在静态构建中,它们不能用作插件,必须包含在二进制文件中。
请记住,仅仅因为您明确不使用某项功能并不意味着您所起诉的功能不依赖于其他人和其他人。依赖就是依赖,不管是直接依赖还是间接依赖
10 MB 还算不错,相对于部署动态 link 库,您已经节省了大量 space。二进制文件将包含所有必要的功能,如果您确实需要这些模块,您将无能为力。此外,静态构建的性能会稍微好一些(当然还有部署便利性)。
我不记得默认的编译器标志,但它很可能默认情况下没有针对大小进行优化,因此对于 MSVC,您可以通过使用 /O1
作为最小大小来获得更小的二进制文件。请注意,这可能会导致性能略有下降。
此外,尽管库的数量更多,但它们中的大多数都相当小,不会真正增加二进制文件的大小。
最后,您真的不想为 Qt 构建调试二进制文件 - 它们很大,而且会浪费很多时间。使用动态 link 版本进行调试,仅为发布构建静态二进制文件。
有一个工具可以显着减小可执行文件的大小,称为 upx
用法:
upx --best path/to/executable
还考虑添加 -q
不会打印输出的选项)。这样您甚至可以将此工具添加到您的构建过程中以避免额外的手动步骤。