我刚刚将一个Objective-C(++(项目转换为纯C++。 在移动越来越多的代码时,我注意到构建时间增加了很多。
我的项目目前分为几个框架/dylibs和一个使用这些框架的主项目。
我做了一些研究,发现基本上有三件事建议减少构建时间:
- 减少标头依赖 性
- 使用 Unity 构建
- 使用像ccache这样的工具不会一直重做不需要的工作
我实现了 ccache,它运行良好,并且能够大大减少构建时间。
我有点不确定是否减少标头依赖项和统一构建。我读到unity构建的一大缺点是,如果您在一个源文件中进行更改,则需要重新编译所有内容,这是有意义的。然而,这对框架来说不是问题,因为如果它们发生变化,它们无论如何都需要重新编译。
我读到使用"伞形标头"(如"MyFramework.h"(是一种不好的做法,它将包含给定框架的所有公共标头,尽管您可能只需要其中的几个。
Cocoa 在任何地方都使用伞形标头,当然,这比选择每个源文件所需的确切标头要容易得多。 但是,在使用 Unity 构建时,每个框架只有一个标头,对吗?
选择单个标头是否仍然有意义,或者使用"伞形标头"是否可以用于 Unity 构建?
在这里在黑暗中点击一点,不想花时间实现最终无济于事的技术。
感谢您的帮助!
这感觉就像是关于固执己见的答案的问题。我的是这样的:
始终减少标头依赖项。减少依赖关系使整体架构更清晰。具有明确职责的独立小模块松散耦合总是比意大利面条更好用。
使用预编译标头编译很少更改的标头。第三方、库和框架伞形标头很少更改,因此也很少需要解析和重新编译。
大多数时间使用单独的单元(很少的 cpp 文件(和这些单元测试。否则,您可以构建整个程序,然后在其中导航到感兴趣的情况,然后在那里使用调试器步骤,依此类推。可能是你喜欢它,但我太懒了,它很无聊重复,浪费我的时间。仅链接整个C++程序(有价值的东西(通常需要十分钟或更长时间,我不需要那么多咖啡休息时间。
不要使用 Unity 构建,最好使用持续集成,当您 push自动构建并运行整个程序的所有单元测试,并准备二进制文件 其他计算机(或场(。当它完成(或失败(时,您将收到通知,并且 然后,如果需要,您也可以使用二进制文件并调试整个程序。