使 DLL 大小尽可能小的最佳方法是什么?

问题描述

我正在使用 LoadLibraryA 将我的 DLL 加载到我的项目中。我刚刚开始注意到随着我不断添加更多函数等,它们的大小开始变大。我的项目设置中是否有任何选项可以帮助减小 DLL 的大小?

解决方法

DLL 的大小主要取决于可以从导出函数访问哪些代码。在链接阶段,任何导出函数无法访问的所有内容都将被删除,但您最终仍会存储您实际上并未从外部使用的所有内容。

这与静态库的行为不同,静态库一开始也包含所有内容,但链接器被推迟到使用库时,因此您永远不会在链接输出中遇到无法访问的死代码。

LTGC + 函数级部分 + 内联所有内容 + 代码折叠 + 字符串折叠 + /O2 可能会减少很多文件大小 - 但以任何正确调试的机会为代价。 (通过积极的内联和折叠冗余内容,调用堆栈无法正确解析。)

忘记您可能读过的关于 /O1 变小的内容。它只是最初的(预链接),因为它主要防止内联和循环展开,但是随着编译器技术的进步,这现在成为详尽的编译时常量表达式评估的障碍,这通常不仅可以节省运行时的计算成本(而且我们经常谈论因子 2-10x!),但也经常编译成更紧凑的东西。

,

正如其他人提到的,您可以使用编译器选项来减小大小。首先,尝试调整这些选项以获得更好的结果。这些选项通常会影响代码的大小。

但是,如果您的 EXE/DLL 中有很多资源,您将看不出有多大区别。如果您在这种情况下确实需要小尺寸,我建议您使用 PE 包装机。一个非常好的免费 PE-packer 是 UPX

UPX 是一种高级可执行文件压缩器。 UPX 通常会 将程序和 DLL 的文件大小减少约 50%-70%,从而 减少磁盘空间、网络加载时间、下载时间和 其他分销和存储成本。

您需要运行 upx 作为后构建过程,以使用如下命令打包您的 EXE/DLL 文件:

upx --best mydll.dll

PE-packers 压缩您的代码和资源,并将它们封装在另一个 EXE/DLL 文件中。然后这些文件将在运行时自动解压,因此您可以像使用普通的 EXE/DLL 文件一样使用它们。尽管 PE 打包程序也可以压缩代码,但当您的 EXE/DLL 中有大量资源时,它们非常有效。