静态链接的应用程序大小减小
Statically linked application - size reduction
我有一个动态链接的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
我的意思是,如果我在解决方案中不使用正则表达式或自由类型,为什么我必须链接到qtpcre
或qtfreetype
?我真的需要这些吗?
我已经尝试启用完全优化。
在结果中,我的应用程序大小为10,731KB,这真的令人沮丧和沮丧。有可能降低吗?也许是外部应用程序?
(是的,我知道这是一个静态构建,它不会是一个7MB或更少的文件,但也许我可以得到低于10MB至少?)
有一个工具可以显著减小可执行文件的大小,叫做upx
用法:
upx --best path/to/executable
还考虑添加不打印输出的-q
选项)。通过这种方式,您甚至可以将此工具添加到构建过程中,以避免额外的手动步骤。
额外的依赖项可能是动态构建时加载的系统库或间接依赖项。在静态构建中,这些不能用作插件,必须包含在二进制文件中。
请记住,仅仅因为你明确不使用某个功能并不意味着你使用的功能不依赖于其他人。无论依赖关系是直接的还是间接的,它都是一个依赖关系。
10 MB并不算太差,相对于部署动态链接库,您已经节省了相当多的空间。二进制文件将包含所有必要的功能,如果你真的需要这些模块,你真的不能对它做任何事情。另外,静态构建将会有稍好的性能(当然还有部署的便利性)。
我不记得默认的编译器标志,但它很可能没有针对默认大小进行优化,因此对于MSVC,您可以通过使用/O1
作为最小大小来获得更小的二进制文件。请注意,这可能会导致轻微的性能下降。
另外,尽管库的数量比较多,但它们中的大多数都相当小,不会真正增加那么多的二进制文件大小。
最后,你真的不想为Qt构建调试二进制文件——它们太大了,浪费了很多时间。使用动态链接版本调试,只构建静态二进制文件供发布。
- 如何将SQLite c文件(合并)与cpp应用程序链接?
- 如何将我的控制台应用程序链接到使用 clang++ 作为编译器的 OSX 环境中的 /usr/local/lib 中存在
- 共享对象与提升program_options静态链接;应用程序链接共享
- 从 32 位应用程序挂接 64 位进程
- 32位应用程序链接到System32二进制文件,而不是SysWOW64
- 使用Visual Studio c++的Windows窗体应用程序,该应用程序链接到CUDA项目
- 在Visual Studio 2013中使用Qt和OpenCV创建应用程序链接问题
- C++:运行时将共享对象与主机应用程序链接,符号表问题
- OpenGL 着色器不与着色器程序链接
- 将 DLL 与应用程序链接时出现未知错误
- 将C++应用程序链接到 dll
- 创建要与C++程序链接的静态 CUDA 库
- 如何将C++/CLI程序编译到.lib中,并将其与纯非托管C++程序链接
- 交叉编译opencv应用时链接错误
- 是否有一种方法将我的GCL Lisp文件与Windows上的单独c++程序链接
- 无法将xerces2_7.dll与64位应用程序链接
- 从Qt应用程序链接到c++静态库
- 你能从一个C应用程序链接一个c++库吗?
- 通过 FFI 块从 Haskell 调用共享库,而从 C 程序链接时则不会
- 您是否可以拥有一个具有管理员权限的DLL,该DLL从仅具有用户级权限的客户端应用程序链接