Visual Studio C++ 中增量链接的性能较差

9
我有一个由许多静态库和独立的cpp文件构建而成的大型二进制文件。它被配置为使用增量链接,所有优化都被禁用了(通过/ Od) - 这是调试版本。
我注意到,如果我更改任何独立的cpp文件,则增量链接运行速度快 - 1分钟。但如果我更改任何静态库中的cpp文件,则它将运行很长时间,需要10分钟,就像普通的链接一样。在这种情况下,我没有从增量链接中获得任何好处。有可能加速这个过程吗?我使用的是VS2005。

你是只改实际的 .lib 文件还是头文件?如果是后者,那么这并不是真正可能的(但你可以从使用 pch 中获得一些好处)。 - KillianDS
请检查.lib项目的/Yu和/Z7选项。 - Hans Passant
如果你需要生成符号,则必须将 /Zi 选项保留不变。你需要在输出窗口中检查在“最坏情况”下会发生什么不同。这种更改是否意味着除了库文件编译之外,还要将修改后的库与大型二进制文件链接起来?或者是否触发了其他依赖关系,导致编译的内容更多? - Ghita
@tinman 我正在构建调试版本 - 所有优化都被 /Od 选项禁用。 - ks1322
@Foo 我只有一个目标,它依赖于那个静态库,就是二进制本身。只有在 CPP 文件更改后重新构建包含该 CPP 的静态库和整个二进制文件的目标。 - ks1322
显示剩余4条评论
3个回答

9

在您的项目中,设置链接器常规属性页面中的“使用库依赖项输入”。这将链接来自依赖性 .lib 的个别 .obj 文件而不是 .lib,这可能会产生一些不同的副作用。


我同意,这个设置非常有用,可以加快链接速度。 - quant_dev
1
是的 - 这直接回答了问题。我曾经在 Visual Studio 2003 中使用过一个叫做 Xoreax Incredibuild 的产品;它有一个被称为"Incredilink"的功能,可以做到这一点。它对于减少构建时间有巨大的影响。看起来这个功能直接被引入了 Visual Studio 2005 中。 - Matt Dillard
@MSN 谢谢。我的项目类型是MakeFile项目。在这种类型的项目中没有链接器属性页面。我能否设置此属性?或者将其传递给链接器命令行?无论如何,感谢您的回答。+1 - ks1322
虽然我现在无法检查,但根据 MSDN 的说法,这回答了我的问题。 - ks1322
@ks1322,如果你自己生成链接命令行,你就必须手动枚举要使用的.obj文件。这就是Visual Studio在后台执行的操作(这也是为什么对于具有大量单独的.obj文件的.lib项目,在VS 2010之前可能会失败)。 - MSN

2

我将为您提供一种不同类型的答案。硬件。

您的开发环境是什么?是否有任何方法可以获得更多的RAM或将您的项目放在固态硬盘上?我发现在我的工作项目中使用SSD将链接时间加快了一个数量级。对于编译时间有所帮助,但链接时间巨大。当然,获得更快的系统也有所帮助。


+1 对于硬件解决方案。SSD 可以加速它。其他建议几乎为-1,例如 RAM(一个需要链接超过主流 2-4-6 GB RAM 的项目有多大?)或更快的系统(你指的是什么系统?)。 - Andriy Tylychko
你会惊讶于人们试图在什么样的系统上编码,当我从旧的双核2Gig RAM WinXP盒子升级到四核8gig Win7盒子时,一切都变得更快了一些。虽然没有SSD那么大的提升,但这是值得一提的差异。 - Michael Dorgan

0
如果我理解正确(在使用Visual Studio几年后),增量链接功能不适用于静态库中的对象文件。
解决此问题的一种方法是重新构建您的解决方案,使您的应用程序项目包含所有源文件。

1
谢谢。你能提供MSDN或其他资源的链接来确认这一点吗?我想确保使用静态库中的目标文件是不可能进行增量链接的。 - ks1322
抱歉,不行,这是基于我自己使用工具的经验。 - Lindydancer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接