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