【问题标题】:Why does linking with Direct X increase my program size so much?为什么与 Direct X 链接会大大增加我的程序大小?
【发布时间】:2015-03-14 14:27:12
【问题描述】:

我需要制作一个符合以下要求的程序:

  • 独立(无需安装)
  • 针对大小进行了优化
  • Windows XP 兼容

问题在于,例如添加 #include <d3dx9.h> 并使用单个函数会使可执行文件大小增加 370kb。

有什么方法/工具,所以如果我只使用库的几个函数,它不会完全链接到可执行文件中?

我尝试了以下没有成功

  • 发布模式
  • 整个程序优化
  • 最小化尺寸 (/O1)
  • 支持小代​​码 (/Os)
  • /OPT:REF
  • /OPT:ICF
  • 使用链接时间码生成 (/LTCG)

这是测试代码(我使用的是 2004 年 10 月的 d3dx 版本,它允许在此处找到静态链接 https://github.com/kavika13/jumpmanzero-thirdparty

#pragma comment (lib, "d3dx9.lib")
#include <d3dx9.h>
int main() {
    D3DXCreateSphere(0, 0, 0, 0, 0, 0);
    return 0;
}

注意:应该注意的是,使用同一个库的更多功能会增加相同的 ~370Kb。

【问题讨论】:

  • 通常,链接器从静态库中删除未使用的代码,并使用几个选择标志从您的项目中删除代码。
  • 我认为D3DXCreateSphere 不太可能是一个简单的小函数,在该库中没有自己的依赖项
  • 有数千个使用 DirectX 的 64 KB 演示。检查 pouet.net。
  • 仅供参考,void main() 不是有效的 C++。
  • @WhozCraig 你认为它应该是 370Kb 的指令吗?应该注意的是,使用同一个库的更多功能也会增加相同的 370Kb。

标签: c++ linker static-libraries portability demoscene


【解决方案1】:

我本来打算建议 /OPT:REF 但后来发现你已经尝试过了。

如果一切都失败了,您可以尝试“可执行打包程序”选项之一,例如 ASPack (aspack.com) 或 UPX (upx.sourceforge.net)。

它们会压缩你的可执行文件并且不会引入额外的依赖。

【讨论】:

  • 感谢您的回答,我已经使用了这些工具。如果可能的话,我正在尝试剥离库中未使用的部分。
  • 这并不能真正回答问题。问题是“为什么链接到库会增加我的可执行文件的大小。”这应该是对问题的评论,而不是答案。
  • 它仍然为问题提供了潜在的解决方案。很抱歉试图提供帮助。
猜你喜欢
  • 2013-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-28
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多