【问题标题】:How do I make ccache cache compilation when using absolute paths to the compiled files in different directories?使用不同目录中已编译文件的绝对路径时如何进行 ccache 缓存编译?
【发布时间】:2010-01-05 19:52:01
【问题描述】:

我使用 CMake 创建一个 makefile。 CMake 创建包含绝对路径的 GCC 行。

为了加快编译速度,我使用了 ccache。

从不同位置构建相同的代码(例如,多个开发人员编译相同的代码,每个代码都在其主目录下)会导致 ccache 缓存未命中。

【问题讨论】:

  • 绝对路径是否会影响 GCC 开关或使其进入后处理源? ccache 通常只考虑开关和散列后处理源;绝对路径应该无关紧要。 (CCACHE_UNIFY 是一个例外。)
  • -I/home/nicolas/src/foo/lib 是一个有效的 gcc 开关,如果在您的目录中使用 -I/home/ephemient/src/foo/lib 进行另一个相同的编译,则会导致缓存未命中;它与我的编译创建的缓存条目不匹配。我相信这就是他的意思。
  • 不,ccache 明确忽略了 -I 和其他应该只影响预处理器的病态标志,所以常见的情况(这样)很好。
  • 嗯...我认为如果有 -I 切换绝对路径,则预处理输出将在#line 指令中具有这些完整路径。使 ccache 忽略会导致编译器警告引用其他开发人员目录中的路径...
  • 嗯,我没有想到——确实,当实际找到文件时,输出会有所不同。好吧,也许CCACHE_UNIFY 模式会有所帮助,因为它试图忽略这样的微不足道的差异,但有时会导致输出显示错误的路径。

标签: gcc cmake ccache


【解决方案1】:

正如上面评论中提到的,一个问题是预处理器行指令中的任何绝对路径都由 ccache 散列,如果使用编译器选项-g,编译器会发出源代码文件的绝对路径为好吧。另一个类似的问题是,如果源代码文件的路径在命令行上是绝对路径,那么如果代码具有__FILE__ 宏的扩展,则该路径将被散列。

解决办法是升级到前几天发布的ccache 3.0。它可选择支持将绝对路径重写为相对路径,以提高命中率。请参阅手册中的Compiling in different directories

【讨论】:

    【解决方案2】:

    好吧,也许是显而易见的:如果唯一的区别是绝对路径,您必须让 cmake 生成相对路径,或者修改 ccache 以将缓存条目视为匹配。

    我已修改我的 ccache 副本以在计算哈希(用于命名缓存条目)时忽略 -pipe 选项;因为该选项不会对编译器输出造成影响,只会影响其速度。也许在计算哈希时,让它从路径中去除初始的 /home/*/ 并不难。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-14
      • 1970-01-01
      • 2018-11-07
      • 2018-05-26
      • 2017-11-21
      • 2015-04-15
      • 1970-01-01
      • 2020-04-29
      相关资源
      最近更新 更多