如何才能将我的大型程序链接起来?

hat*_*cat 9 c++ linker visual-studio-2005

我们的下一个产品已经变得太大,无法在运行32位Windows的计算机上进行链接.所有lib文件的总和超过2Gb,只能在64位Windows机器上链接.最终我们将超越这个边界,因为我们的软件往往增长而不是契约,我们使用的是32位链接器(MS Visual Studio 2005):当我们的lib总大小超过3Gb时,我们预计会遇到麻烦.

如何在不修剪代码的情况下减小.lib文件或.obj文件的大小?例如,我们使用了很多模板:有没有办法减少它们的占用空间?有没有办法找出导致膨胀检查.lib/.obj文件的原因?这可以自动化而不是通过眼睛检查吗?2.5Gb是很多文本要比较和比较.

外部约束阻止我们作为单个.exe之外的任何东西进行传输,因此DLL解决方案不可用.

sbi*_*sbi 5

我曾经参与过一个有几个MLoC的项目.虽然我们仍然会在32位机器上链接,但链接时间非常糟糕并且成为一个主要问题,因为开发人员只能在每个工作日完成十几个编辑 - 编译 - 测试周期.(通过分布式编译很好地处理了编译时间.)

我们切换到动态链接.这增加了启动时间,但这可以通过延迟加载DLL来管理.


jal*_*alf 5

首先,当然,请确保使用"Optimize for Size"选项进行编译.如果你这样做,我不希望至少内联对代码大小做出重大贡献.编译器对每个内联候选者进行权衡,以确定它增加代码大小的数量(如果有的话)与它给出的性能提升相比.如果你正在优化大小,编译器不会冒很大的代价.(请注意,内联非常小的函数实际上可以减少代码大小)

第二,你考虑过团结建设吗?这几乎完全消除了链接器,只有一个转换单元,重复工作要少得多,希望内存占用更少.

最后,我知道Visual Studio(或可能是Windows SDK)有一个64位编译器(也就是说,编译器本身就是一个64位应用程序,而不仅仅是一个生成64位代码的编译器).考虑使用它.(我不知道是否还有一个64位链接器)

我不知道链接器是在LARGEADDRESSAWARE标志设置的情况下构建的.如果是这样,在64位计算机上运行它将使进程消耗完整的4GB内存,而不是通常获得的2 GB内存.(如有必要,可以通过修改PE头自己添加标志)

也许限制各种符号的联系也可能有所帮助.如果您知道当前转换单元之外不需要符号,请将其放在匿名命名空间中.这可能允许编译器在将所有内容传递给链接器之前减少未使用的符号


the*_*ill 3

尝试使用符号排序程序来显示代码中主要的膨胀部分。另外,只需查看原始 .obj 文件的大小即可让您合理地了解目标位置。