我从事一个使用 Unity 构建的大型 C++ 项目。对于那些不熟悉这种做法的人,Unity 将#include 多个相关的 C++ 实现文件构建到一个大型翻译单元中,然后将其编译为一个单元。这节省了重新编译 header ,减少链接时间,通过将更多功能引入内部链接等来提高可执行文件的大小/性能。通常是好东西。
但是,我刚刚在我们的一个构建中发现了一个潜在的错误。一个实现文件使用了没有包含相关头文件的库,但它编译并运行了。在绞尽脑汁之后,我意识到它被包含在我们的统一构建中之前包含的一个实现文件中。这里没有造成任何伤害,但如果有人试图在以后独立地重用该文件,那可能会是一个令人困惑的惊喜。
除了定期构建非 Unity 版本之外,是否有任何方法可以捕获这些静默依赖项并仍然保持 Unity 构建的优势?
最佳答案
我之前对源存储库中的卡住项目使用过 UB 方法,我们从未打算再次维护这些项目。不幸的是,我很确定你的问题的答案是否定的。如果您想测试这些类型的错误,您必须定期单独构建所有 cpp 文件。
可能最接近自动解决方案的是一个 buildbot,它自动收集项目中的所有 cpp 文件(UB 文件除外)并定期从源存储库构建常规方式,指出任何同时构建错误。这样,您的本地开发仍然很快(使用 UB),但您仍然可以从这些周期性的 buildbot 构建中捕获您错过的任何错误,这些构建机器人分别构建所有 cpps。
关于c++ - 安全的 Unity 构建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3136539/