我正在使用
LoadLibraryA
将 DLL 加载到我的项目中。我刚刚开始注意到,随着我不断添加更多函数等,它们的大小开始变大。我的项目设置中是否有任何选项可以帮助减小 DLL 的大小?
DLL 的大小主要取决于可从 exported 函数访问哪些代码。在链接阶段,任何导出函数无法访问的所有内容都会被删除,但您最终仍然会存储从外部实际未使用的所有内容。
这与静态库的行为不同,静态库一开始也包含所有内容,但链接器被推迟到使用该库为止,因此您永远不会在链接的输出中出现无法访问的死代码。
LTGC + 函数级部分 + 内联所有内容 + 代码折叠 + 字符串折叠 +
/O2
可能会减少大量文件大小 - 但代价是失去正确调试的机会。 (通过积极内联和折叠冗余内容,调用堆栈将无法正确解析。)
忘记您可能读过的有关
/O1
变小的内容。它只是最初(预链接),因为它主要防止内联和循环展开,但随着编译器技术的进步,这现在成为详尽的编译时常量表达式评估的障碍,这通常不仅节省运行时的计算成本(而且我们通常谈论因子 2-10x!),但也经常编译成更紧凑的东西。
正如其他人提到的,您可以使用编译器选项来减小大小。首先,尝试调整这些选项以获得更好的结果。这些选项通常会影响您的代码的大小。
但是如果你的 EXE/DLL 中有很多资源,你不会看到太大的区别。如果在这种情况下您确实需要小尺寸,我建议您使用 PE 包装机。 UPX是一个非常好的免费 PE 打包工具。
UPX是一个先进的可执行文件压缩器。 UPX 通常会 将程序和 DLL 的文件大小减少约 50%-70%,从而 减少磁盘空间、网络加载时间、下载时间和 其他配送和存储成本。
您需要运行 upx 作为构建后过程,以使用如下命令打包您的 EXE/DLL 文件:
upx --best mydll.dll
PE 加壳器压缩您的代码和资源并将它们封装在另一个 EXE/DLL 文件中。然后这些文件将在运行时自动解压,因此您可以像普通 EXE/DLL 文件一样使用它们。尽管 PE 加壳器也压缩代码,但当您的 EXE/DLL 中有大量资源时,它们非常有效。
首先,我尝试在
Cmake
IDE 中使用
CLion
进行编译,DLL 大小始终高于 2 MB
。
然后我使用 Visual Studio 2022
中的默认设置编译了相同的代码,并且能够将 DLL 大小减小到 11 KB
。