但是然后我想:哦不,那会在下一次make调用时触发重新编译!对于某些基本头文件,整个项目都会重新编译,这可能需要很长时间。所以,算了吧!
有解决这个困境的方法吗?是否有方法可以在头文件之外直接记录函数/类的文档说明?或者是否有(打算)智能化的make工具,它会注意到仅更改了某些注释,但不需要重新编译?
CCACHE_UNIFY
环境选项。CCACHE_UNIFY
的手册部分
CCACHE_UNIFY
如果设置环境变量
CCACHE_UNIFY
,则在编译时未使用-g时,ccache将使用C/C++统一程序来哈希预处理器输出。统一程序比普通哈希慢,因此设置此环境变量会稍微降低速度,但这意味着ccache可以利用仅重新格式化源代码时不重新编译的优势。请注意,使用CCACHE_UNIFY
会更改哈希,因此在未设置CCACHE_UNIFY
时无法使用已缓存的使用CCACHE_UNIFY
设置和反之亦然。默认情况下关闭统一程序的原因是它可能会在编译器警告消息中提供不正确的行号信息。
为什么不直接使用touch命令将文件修改时间改回到make不会认为它被更改的时间点呢?
正如onebyone所建议的,您可以将其包装成一个简单的脚本。
make 严格按照文件时间戳工作,绝对没有扩展它的计划。make 用于许多除了 C 以外的事情,并且不知道文件内容。如果 make 必须分析更改,您的构建可能会变得更慢。
您可以将文档保留在 .c 文件中,而不是头文件中,这将限制需要重新编译的范围。我承认个人上喜欢在头文件中记录“接口”函数,但从 doxygen 的角度来看,这并不重要。
如另一个人所建议的那样,您可以通过使用“touch”来回溯文件。
doxygen 允许您在外部文件中放置注释,但这通常是不可取的解决方案; doxygen 的整个目的之一就是使文档与源代码保持紧密联系。
否则,我建议您修复编译速度... 您真的不应该害怕它们。
只需要进行更改并接受重新编译即可。当开发人员害怕编译时,很难拥有一个功能齐全的开发环境;也许您需要考虑使用分布式网格编译系统来减少编译时间?
我的解决方案是在Makefile中不将头文件包含为依赖项... 因此对头文件的更改不会触发“make”重新编译。
当然,缺点是如果我进行影响内存布局的更改(例如向类添加成员变量),我需要记住手动编辑受影响的.cpp文件(或者如果很难确定哪个cpp文件受影响,则执行“make clean;make”),这可能有点容易出错... 但通常对我而言有效。
CCACHE_UNIFY
选项可以解决这个问题,但会牺牲一些速度。我会在我的答案中添加详细信息。 - Hasturkun