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

What's the best way to make DLL size as small as possible?

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

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

这与静态库的行为不同,静态库一开始也包含所有内容,但是 linker 被推迟到使用库,所以你永远不会在 linked 输出。

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

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

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

的大小

但是,如果您的 EXE/DLL 中有很多 资源 ,您将看不出太大差异。如果在这种情况下你真的需要小尺寸,我建议你使用 PE-packer。一个非常好的免费 PE-packer 是 UPX.

UPX is an advanced executable file compressor. UPX will typically reduce the file size of programs and DLLs by around 50%-70%, thus reducing disk space, network load times, download times and other distribution and storage costs.

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

upx --best mydll.dll

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

中有大量资源时,它们会非常有效