【问题标题】:C++ incrementals builds for continuous integration用于持续集成的 C++ 增量构建
【发布时间】:2011-07-13 07:33:02
【问题描述】:

我们在 VS2005 中构建了一个相当大的 C++ 项目,从头开始编译和构建可能需要 40 分钟,安装程序需要 10 分钟,因为该软件同时构建为 32 位和 64 位配置。我想将此时间减少到至少 10 分钟左右,因为我觉得在使用持续集成时获得快速构建反馈很重要。

当通过删除最终链接文件而不是 .obj 文件来使用增量构建时,构建过程似乎要快得多,但似乎会到处弹出错误,例如无法加载 .dll。从干净的构建开始,一切正常。我使用 TeamCity 作为 CI 系统的选择。

也许在更高版本的 Visual Studio 中增量构建行为会更好,这可能是升级的好动机?有没有人遇到过类似的问题?

【问题讨论】:

  • 能否详细说明您提到的错误?我很难理解为什么部分构建会引发 DLL 加载问题。这是否意味着您总是干净地构建您的项目以使其正常工作?
  • 我们有一个小脚本,它在所有 .dll 上调用 LoadLibrary(),只是为了确保满足所有依赖项要求。某些 .dll 似乎失败了。如果我们通过 Visual Studio 构建或从命令行使用 msbuild 并调用它两次,则似乎不会出现问题。但我认为增量构建取决于源代码日期,可能是当 TeamCity 从存储库更新代码时,文件上的修改日期也会恢复(我们使用的是 mercurial)。我会进一步调查。

标签: c++ visual-c++ build-automation incremental-build


【解决方案1】:

我实际上无法回答您的问题,但由于您正在寻找加快构建速度,这篇关于使用 Visual Studio 2010 和 SSD 进行快速构建的博文可能会有所帮助。 http://qualapps.blogspot.com/2010/09/lightning-fast-builds-with-visual.html

【讨论】:

  • 感谢您的链接。我一直在考虑 SSD,以及升级 CPU。显然,您总是可以在问题上投入更多的硬件,我希望找到一种方法使增量构建以可靠的方式工作,如果可行,那么使用新硬件会更快。
  • 现在,我不想让您感到困惑 :),但是对于 SSD,也有相反的观点,正如 Jeff Palermo 的观点一样。 jeffreypalermo.com/blog/…
【解决方案2】:

好问题。

当我为 Microsoft Visual Studio 2003/2005/2008 的大型 C++ 项目构建 CI 系统时,我发现增量构建也存在问题。尤其是在使用预编译头文件时,似乎并非在所有情况下都可以进行增量构建。我很想知道是否有人对此有详细的解释,即什么有效,什么无效。

就我而言,该项目从头开始构建需要一个多小时,因此为了获得合理的日内反馈速度,我最终做了一个干净的夜间构建,即发布构建,而当天我使用增量构建基于每晚。这工作得相当好,除非增量构建无法正确获取更改并重新编译所有必要的东西。我尝试了这种方法,因为我认为快速获得反馈非常重要,如果增量构建每月失败一次或更少,我已经准备好接受妥协。

一般来说,我喜欢比我上面描述的更好的东西,所以在其他项目中可以获得更多硬件并重新组织要并行构建的组件,我通常会进行完整的重新构建.如果您可以并行构建,则可以加快构建速度。

其他需要考虑的事项是:

  • 包含与前向声明
  • 模板使用
  • 事物之间的一般依赖关系
  • 将部分项目作为独立库取出,甚至可以预先构建。

可以做很多事情来加快构建速度,在大多数情况下,我会将这些视为增量构建。

【讨论】:

    【解决方案3】:

    我的经验是,通常,尤其是调试版本,瓶颈是磁盘 IO。它有助于压缩输出和中间文件目录。此外,我看到一些构建在不使用增量链接功能时更快(启用增量链接 - 否)。要考虑的另一个设置是关闭浏览信息生成(启用浏览信息 - 无)。另外,不要忘记使用 VS 2005 的并行编译功能。由于通常 IO 是瓶颈,因此使用比 CPU 更多的构建线程会有所帮助。

    【讨论】:

    • 是的,我们正在使用“未记录的”并行构建标志,它有点帮助。我会尝试设置一个 ramdisk 或类似的东西,看看这是否有助于这个过程。
    • @Can Gencer:什么未记录的并行构建标志?我的意思是“工具 - 选项 - 项目和解决方案 - 构建和运行 - 并行项目构建的最大数量”设置。如果您使用的是 MSBuild 或 VCBuild,两者都有一些效果相同的选项。
    • 您的意思是并行构建项目。我没有尝试过,因为我记得很久以前读过它不是很可靠。我会试一试。我的意思是多核编译的 /MP 标志。它在 VS2008 和 VS2005 中作为未记录的标志可用。 msdn.microsoft.com/en-us/library/bb385193.aspx
    【解决方案4】:

    我自己从未注意到这种行为,但我首先怀疑是链接时间代码生成。对于持续集成,您可以跳过它。

    我还应该提到 IncrediBuild。用硬件来解决问题,尤其是你已经拥有的硬件,是一个快速的胜利。

    【讨论】:

    • 所有项目都将其设置为“默认”,我认为这意味着未启用。 Incredibuild 听起来很有趣,将对此进行调查。
    猜你喜欢
    • 1970-01-01
    • 2015-07-14
    • 2019-12-14
    • 1970-01-01
    • 2013-11-29
    • 2012-06-22
    • 1970-01-01
    • 2013-06-16
    • 2010-09-29
    相关资源
    最近更新 更多