我正在开发一个使用Unity构建的大型C ++项目。对于那些不熟悉这种做法的人,Unity会将#include多个相关的C ++实现文件构建到一个大的翻译单元中,然后将其编译为一个。这样可以节省重新编译头文件,缩短链接时间,通过将更多功能集成到内部链接等来提高可执行文件的大小/性能。通常很好的东西。
然而,我刚刚在我们的一个版本中发现了潜在的错误。一个实现文件使用库,不包括相关的头文件,但它已编译并运行。在抓了我的脑袋之后,我意识到它被包含在我们的Unity构建中的这个之前的实现文件中。这里没有造成任何伤害,但如果有人试图在以后独立重复使用该文件,那可能会让人感到困惑。
除了定期构建非Unity版本之外,还有什么方法可以捕获这些静默依赖项并仍然保留Unity构建的好处吗?
答案 0 :(得分:2)
我之前使用过UB方法来处理我们从未计划再次维护的源代码库中的冻结项目。不幸的是,我很确定你的问题的答案是否定的。如果要测试这些类型的错误,则必须分别定期构建所有cpp文件。
你可以从自动化解决方案中得到的最接近的东西是buildbot,它可以自动收集项目中的所有cpp文件(除了你的UB文件),并定期从源存储库构建常规方式,指出任何在此期间构建错误。这样你的本地开发仍然很快(使用UB),但你仍然可以捕获你从使用这些定期buildbot构建的单一构建中错过的任何错误,这些构建分别构建所有cpps。
答案 1 :(得分:0)
我建议不要将Unity Build用于本地开发环境。无论如何,Unity Build不会帮助您改进编译和编译时的编译时间。仅将Unity Build用于非增量连续构建系统,您不希望将其用于生成。
只要每个提交在本地编译后发生更改,就不应出现您描述的情况。
Unity Build可能会在本地定义的函数之间形成意外的重载调用,这些函数恰好与重复的名称一起使用。那是危险的,你不知道这一点,即在这种情况下不会产生编译错误或警告。除非您有办法防止这种情况发生,否则请不要回复Unity Build生成的产品。