【问题标题】:Why is my static library so huge?为什么我的静态库这么大?
【发布时间】:2010-07-26 03:37:16
【问题描述】:

我有一个 C++ 编译的静态库,其中包含大约 15 个类及其成员函数和东西,并且编译后,它几乎有 14 兆字节。它链接到 Google 的密集哈希表库和 MPIR,这类似于 Windows 的 GMP,但我在一个普通的 exe 中完成了它,它只有几千字节。为什么它如此庞大?我能做些什么来减小它的大小?似乎还有其他程序比我的要复杂得多,但要小得多。

用Visual C++编译,命令行为:

/Zi /nologo /W3 /WX- /O2 /Oi /Oy- /GL /D "WIN32" /D "NDEBUG" /D "_CONSOLE"
/D "_UNICODE" /D "UNICODE" /Gm- /EHsc /GS /Gy /fp:precise /Zc:wchar_t
/Zc:forScope /Fp"Release\ang.pch" /Fa"Release\" /Fo"Release\"
/Fd"Release\vc100.pdb" /Gd /analyze- /errorReport:queue

【问题讨论】:

  • 你能提供一些更具体的信息吗?编译器、编译标志等
  • 用Visual C++编译,命令行为: /Zi /nologo /W3 /WX- /O2 /Oi /Oy- /GL /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /Gm- /EHsc /GS /Gy /fp:precise /Zc:wchar_t /Zc:forScope /Fp"Release\ang.pch" /Fa"Release\" /Fo"Release \" /Fd"Release\vc100.pdb" /Gd /analyze- /errorReport:queue
  • 当你静态编译时,你必须期待一个巨大的可执行文件。你得到了一切——标准库,一切。
  • @zdav:不;链接器将丢弃您不使用的设施。
  • 我认为你应该调整你的看法。 14 兆字节并不大。

标签: c++ linker static-libraries static-linking


【解决方案1】:

静态库是一种完全不同的二进制格式;部分原因是它有更多的信息。从本质上讲,静态库就像从翻译单元生成的所有 .obj 文件的 ZIP。这允许链接器丢弃未使用的函数,如果您使用的是 LTCG,它允许内联器做出跨模块决策和其他此类优化。

此外,某些编译模式会将调试符号直接嵌入到 .lib 中,无需单独的 .pdb 文件。

通常您不必担心静态库的大小;链接器将在构建最终可执行文件时丢弃所有额外信息。

【讨论】:

  • @greyfade:实际上编译器就是这样做的;)
  • @Billy ONeal:在链接时间
  • @greyfade:不,这是在编译时完成的,除非您使用 LTCG,在这种情况下,链接器实际上是编译器后端。
  • @Billy ONeal:GCC 生成大型目标文件。它不会删除代码,并且不会发出任何适合 LTCG 的内容。 (它没有这样的功能。)另一方面,Binutils 的ld 在执行重定位和链接时获取目标文件并去除它们的冗余和死代码。看不到 LTCG。
  • @greyfade:那肯定是在做LTCG;它只是不这么称呼它。真正的链接器除了执行函数修复之外,对它正在查看的代码一无所知。
猜你喜欢
  • 2023-03-27
  • 1970-01-01
  • 2013-05-15
  • 2012-08-24
  • 2012-09-08
  • 2016-11-12
  • 2013-08-18
  • 2015-06-24
相关资源
最近更新 更多