我正在做一个即将变得更大的大型项目。在此之前,我想解决的问题之一是构建速度。
过去我们使用 Single Compilation Unit / Unity Builds 来大大提高构建速度。详细信息可以在这里找到http://buffered.io/posts/the-magic-of-unity-builds/
本质上,您创建一个包含多个 #include other.cpp 的 .cpp 文件
例如 scu.cpp 的内容
#include apple.cpp
#include banana.cpp
#include cherry.cpp
......
它创建了一个 scu.obj。这降低了构建速度,因为它减少了文件 I/O。
但是也有缺点
- .cpp 中的全局变量/函数是共享的,可能会发生冲突
- 开发人员可以忘记在 .cpp 中#include 文件并摆脱它
另一个坏事是,开发人员可能需要手动维护 scu.cpp(但这对我们来说将是自动化的,所以这不是问题)。
由于这些缺点,我们离开了 SCU。但我很想把它带回来,因为构建速度的提高真的很诱人(减少 50 - 75%)。
有没有办法避免这些冲突?我测试过
scu.cpp 的内容
namespace unique_1 {
#include apple.cpp
}
namespace unique_2 {
#include banana.cpp
}
namespace unique_3 {
#include cherry.cpp
}
但这只会产生错误
error C3083: 'vc_attributes': the symbol to the left of a '::' must be a type
........
它源于命名空间内的#include。
有替代方案吗?还有其他解决方案吗?
该线程建议不(不幸的是)
单独构建来测试非 SCU 解决方案很容易实现。但在我们的组织内部却不受欢迎。IE
- 全局变量/函数有效(在 c++ 教科书中)
- 可能会在没有意识到的情况下破坏 SCU/非 SCU(直到发生构建破坏)