我正在寻找一种工具来简化分析大型 C++ 项目 (VC6) 的链接器映射文件。
在维护期间,二进制文件稳定增长,我想弄清楚它来自哪里。我怀疑在不同 DLL 之间共享的库中存在一些过度热心的模板扩展,但是浏览地图文件并没有提供很好的线索。
有什么建议么?
这是一个很棒的编译器生成的地图文件分析/浏览器/查看器工具。检查您是否可以浏览 gcc 生成的地图文件。
amap :分析 32 位 Visual Studio 编译器生成的 .MAP 文件并报告数据和代码使用的内存量的工具。此应用程序还可以读取和分析由 Xbox360、Wii 和 PS3 编译器生成的 MAP 文件。
地图文件应该有每个部分的大小,您可以编写一个快速工具来按此大小对符号进行排序。还有一个 MSVC (undname.exe) 附带的命令行工具,您可以使用它来解开符号。
将符号按大小排序后,您可以根据需要每周或每天生成此符号,并比较每个符号的大小随时间的变化情况。
任何单个构建中的地图文件可能不会说明太多,但编译地图文件的历史报告可以告诉您很多信息。
您是否尝试过在 .obj 文件上使用 dumpbin.exe?
要寻找的东西:
如果上述任何一项适用于您。检查它们是否具有广泛的可见性,即它们是否在您的应用程序的大部分中使用/看到。
没有对工具的建议,但猜测可能的原因:您是否启用了增量链接?这可能会导致后续构建期间的扩展...
如果您使用 /opt:ref 进行编译,链接器将删除未使用的符号,因此如果您使用它而不使用增量链接,我希望二进制文件的扩展只是添加实际新代码的结果。据我所知……希望对你有所帮助。
模板、宏、STL 通常都使用大量空间。BOOST 被誉为一个伟大的通用库,为项目增加了很多空间。BOOST_FOR_EACH 就是一个例子。它有数百行模板化代码,可以通过编写适当的循环句柄来避免,这通常只需要几个按键。
获取 Visual AssistX 以节省输入,而不是使用模板。还要考虑拥有您使用的代码。宏和内联函数扩展不一定会出现。
此外,如果可以的话,从 DLL 架构转向将所有内容静态链接到一个以不同“模式”运行的可执行文件中。使用相同的可执行映像多次使用绝对没有错,只需根据您希望它执行的操作传入不同的命令行参数即可。
DLL 是浪费空间和减慢项目运行时间的罪魁祸首。人们认为他们是节省空间的人,而实际上他们往往会产生相反的效果,有时会将项目规模扩大十倍!另外,它们增加了交换。使用固定代码段(无重定位段)来提高性能。