【问题标题】:Safe Unity Builds安全的 Unity 构建
【发布时间】:2011-03-09 08:52:37
【问题描述】:

我从事一个使用 Unity 构建的大型 C++ 项目。对于不熟悉这种做法的人,Unity 将#include 多个相关的 C++ 实现文件构建到一个大型翻译单元中,然后将其编译为一个。这可以节省重新编译头文件,减少链接时间,通过将更多功能引入内部链接来提高可执行文件大小/性能等。通常是好东西。

但是,我刚刚在我们的一个构建中发现了一个潜在的错误。一个实现文件使用了库,但不包含相关的头文件,但它已编译并运行。在摸了摸头之后,我意识到它被包含在我们的统一构建中包含在此之前的实现文件中。这里没有造成任何伤害,但如果有人稍后尝试独立重用该文件,那可能会令人困惑。

除了定期构建非 Unity 版本之外,还有什么方法可以捕获这些无声的依赖关系并仍然保留 Unity 构建的好处?

【问题讨论】:

    标签: c++ build dependencies


    【解决方案1】:

    我建议不要在本地开发环境中使用 Unity Build。无论如何,Unity Build 不会帮助您在编辑和编译时缩短编译时间。仅将 Unity Build 用于您的非增量连续构建系统,您不希望从中使用生产。

    只要每个commit都在本地编译后发生变化,就不应该出现你描述的情况。

    Unity Build 可能会在使用重复名称的本地定义函数之间形成意外的重载调用。这很危险,您没有意识到这一点,即在这种情况下不会产生编译错误或警告。除非您有办法防止这种情况发生,否则请不要回复 Unity Build 生成的产品。

    【讨论】:

      【解决方案2】:

      我以前使用 UB 方法来处理我们源存储库中的冻结项目,这些项目我们从未计划再次维护。不幸的是,我很确定你的问题的答案是否定的。如果您想测试这些类型的错误,您必须定期单独构建所有 cpp 文件。

      可能最接近自动魔术解决方案的是 buildbot,它会自动收集项目中的所有 cpp 文件(UB 文件除外)并定期从源存储库构建常规方式,指出任何同时构建错误。这样,您的本地开发仍然很快(使用 UB),但您仍然可以从这些定期构建机器人构建中捕获您错过的任何错误,这些构建机器人构建分别构建所有 cpp。

      【讨论】:

        猜你喜欢
        • 2020-07-02
        • 2022-08-19
        • 2011-10-14
        • 1970-01-01
        • 2020-09-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多