使 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.
中有大量资源时,它们会非常有效
我正在使用 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.
中有大量资源时,它们会非常有效