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



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

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

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

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

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

upx --best mydll.dll

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

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

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

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

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

相关内容

最新更新