首页 > 解决方案 > Clang 预编译标头 - 使用不同的 /usr/include 时间戳 - 也许通过编辑元数据?

问题描述

我一直在尝试解决编译时问题。有问题的基础设施编译多个对象,每个对象都使用大量的 stdlib/boost。我基本上已经达到了简化依赖树不再值得努力的限制。

所以,我尝试了预编译的头文件——它奏效了!我现在遇到的问题是将它安装在大型计算场和 CI 中。具体来说,并非所有机器都同时设置,因此 /usr/include/ 的时间戳通常不同。

我们想要的流程是:

  1. 首先构建某些共享库
  2. 预编译头文件
  3. 使用共享库(很好)和预编译头文件在不同机器上启动多个作业

标头通过以下方式预编译:

clang++ precompiled.hpp -o /<path>/precompiled.hpp.pch 

当我使用预编译头时,根据给定机器上 /usr/include/ 的时间戳,我得到以下元数据错误:

致命错误:自预编译头文件“//precompiled.hpp.pch”构建以来,文件“/usr/include/math.h”已被修改

有时它也可能是不同的标头 - 例如 assert.h 是一个常见的标头。

到目前为止,我已经尝试了以下方法:

关于如何解决这个问题的任何想法?

我现在什至在考虑更糟糕的 hack - 尝试编辑预编译标头的元数据。不幸的是,我找不到任何 API 来轻松查询/编辑 PCH。

有任何想法吗?

标签: c++clang++precompiled-headers

解决方案


现在已经设法找到一个解决方案(即使忽略预编译的头文件,在稳定性方面也可能长期受益)。

  • 指定 --no-standard-includes -nostdinc++ -nostdlibinc。这将确保路径是包含路径由于 gcc/clang 的构建方式而被剥离。也可以指定 CPATH= 和 CPLUS_INCLUDE_PATH=。
  • 通过 CPLUS_INCLUDE_PATH 使用中心位置重建路径。这将意味着来自 /usr/include 的标头始终来自中心位置,并且元检查将通过。它还应该有助于构建的稳定性
  • 链接到正确版本的 stdlib

推荐阅读