Ccache 不适用于 gcc -M 标志?

Posted

技术标签:

【中文标题】Ccache 不适用于 gcc -M 标志?【英文标题】:Ccache doesn't work with gcc -M flag? 【发布时间】:2015-04-17 15:51:24 【问题描述】:

我正在尝试使用 ccache 来加快我的重建速度,我在日志中注意到了这一点:

[2015-04-17T10:41:45.845545 27682] Compiler option -M is unsupported
[2015-04-17T10:41:45.845584 27682] Failed; falling back to running the real compiler

根据我的经验,您需要类似 -M 标志的东西才能正确重建 make 或其等效触发器。似乎很奇怪,ccache 会被几乎每个项目构建中必须存在的选项所绊倒。我错过了什么吗?有更好的选择吗?

这是 w/ ccache-3.2.1。

编辑:我也尝试使用 -MM,但没有运气。

【问题讨论】:

【参考方案1】:

ccache 当前不支持编译器选项-M-MM 是正确的(而且它从未支持它们)。

有关选项不被支持的一些原因:

    这些选项告诉编译器让预处理器输出制定规则,而不是预处理的源代码。这与 ccache 的工作方式不太匹配;它需要为每个编译器调用获取“真实的”预处理输出(参见https://ccache.dev/manual/3.7.11.html#_how_ccache_works)。 简单地说,没有人实现对上述选项的支持。

很可能通过让 ccache 运行编译器命令两次来实现支持:一个 没有 -M/-MM 检索预处理的源代码(结果应该是关联)和一个 with -M/-MM 检索结果(制定规则)。

但是,我(作为过去六年的 ccache 维护者发言)直到现在还没有听说有人缺少对 -M/-MM 的支持,所以我的印象是 -M/-MM 实际上不是用的不多。

我错过了什么吗?有更好的选择吗?

是的,我想说标准的方法是使用-MD/-MMD(ccache 支持)而不是-M/-MM-MD/-MMD 是优越的,因为它们一次性生成.o.d 文件,而-M/-MM 只生成.d 文件,因此编译器必须在这种情况下Makefile 为每个源代码文件调用两次。例如,请参阅 http://www.microhowto.info/howto/automatically_generate_makefile_dependencies.html 了解如何使用 -MD/-MMD

【讨论】:

使用这些正是我们最终所做的:)

以上是关于Ccache 不适用于 gcc -M 标志?的主要内容,如果未能解决你的问题,请参考以下文章

带有标志 --legacy-watch 的 Nodemon 不适用于 docker Ubuntu/Linux

GCC - 包含编译标志的宏

何时为 gcc 使用 -O2 标志?

gcc 内联 asm x86 CPU 标志作为输入依赖项

用于提高中间浮点计算精度的编译器标志

Bash grep 不适用于撇号