6

我正在研究一个大型 c++ 构建的库,该库最近增长了很多。由于它的大小,导致这种大小增加的原因尚不清楚。

您对工具(msvc 或 gcc)有什么建议可以帮助确定增长的来源。

编辑 我尝试过的事情:Dumpbin 最终的 dll、obj 文件、创建地图文件并翻录它。

再次编辑 所以 objdump 和 python 脚本似乎已经完成了我想要的。

4

4 回答 4

7

如果是 gcc,则为 objdump。如果是视觉工作室,dumpbin

我建议对旧(小)库与新(大)库的工具输出进行比较。

于 2009-06-01T21:31:20.087 回答
2

keysersoze 的答案(比较objdumpor的输出dumpbin)是正确的。另一种方法是告诉链接器生成一个映射文件,并比较新旧版本 DLL 的映射文件。

  • MSVC:link.exe /MAP
  • GCC 和 binutils:(ld -Mgcc -Wl,-M
于 2009-06-02T17:39:49.050 回答
1

在 Linux 上,应该很容易查看是否添加了带有递归差异的新文件。他们肯定会增加图书馆的规模。然后,您可以在 Linux 上使用size命令行工具来获取每个新目标文件的大小并将它们汇总。然后将该总和与您的图书馆增加进行比较,并检查它有多少不同。

于 2009-06-01T21:58:20.997 回答
0

天,

如果您有任何先前版本的目标文件,您可以运行 size 命令查看哪个段增长了吗?

几个问题:

  • 您是在 *nix 平台还是 Windows 平台上?
  • 您使用的是哪个编译器?
  • 编译器最近更改了吗?
  • 最近添加了 -g 标志吗?(明显的问题1)
  • 该对象之前是否被剥离?(明显的问题2)
  • 对象以前是否动态链接?(明显的问题3)

编辑:如果代码在 SCM 下,您能否查看为您提供较小对象的源版本。然后比较:

  1. 通过在旧的源代码树上执行 du -sk 来确定源代码树的大小,然后在没有构建任何东西的情况下构建新的源代码树。
  2. 通过执行类似的操作来获取文件数find ./tree_top ( -name *.h -o -name *.cpp ) | wc -l
  3. find ./tree_top ( -name *.h -o -name *.cpp ) -print | sort > treelist通过执行 a然后对新的更大的树执行相同的操作来确定增加的文件数量。做一个简单的 sdiff 将显示任何大量的新文件。
  4. 代码库的大小,即使是尾随分号的简单计数也会为您提供一个很好的基本机制来比较两者。
  5. Makefiles 或构建环境。让项目查看是否有不同的选项或设置进入了构建本身。

高温高压

顺便说一句,请在此处发布您的发现,因为我相信很多人对您的发现感兴趣。

干杯,

于 2009-06-01T21:24:47.010 回答