【问题标题】:What's the best way to make DLL size as small as possible?使 DLL 大小尽可能小的最佳方法是什么?
【发布时间】:2021-09-15 08:24:18
【问题描述】:

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

【问题讨论】:

  • 什么编译器?有些提供最小化尺寸的选项,但以牺牲效率为代价。你真的那么在意空间吗?
  • 我正在使用 Microsoft 的 Visual Studio 他们的 2022 测试版
  • 取决于您如何构建 DLL。一些编译器优化设置可以减少代码大小。其他一些(在编译或链接对象以创建 DLL 时)可以省略调试信息。但是,这是有限制的——如果你不断地向 DLL 添加函数,或者使代码库变得更大,那么 DLL 会随着时间的推移而变得更大。但是,除非您在一个存储量非常小的系统上,否则它在实践中并不重要。

标签: c++ visual-studio-2022


【解决方案1】:

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

但如果您的 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 中有大量资源时,它们非常有效。

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-03
      • 1970-01-01
      • 1970-01-01
      • 2020-05-10
      相关资源
      最近更新 更多