c++ - Clang 预编译标头 - 使用不同的 /usr/include 时间戳 - 也许通过编辑元数据?
问题描述
我一直在尝试解决编译时问题。有问题的基础设施编译多个对象,每个对象都使用大量的 stdlib/boost。我基本上已经达到了简化依赖树不再值得努力的限制。
所以,我尝试了预编译的头文件——它奏效了!我现在遇到的问题是将它安装在大型计算场和 CI 中。具体来说,并非所有机器都同时设置,因此 /usr/include/ 的时间戳通常不同。
我们想要的流程是:
- 首先构建某些共享库
- 预编译头文件
- 使用共享库(很好)和预编译头文件在不同机器上启动多个作业
标头通过以下方式预编译:
clang++ precompiled.hpp -o /<path>/precompiled.hpp.pch
当我使用预编译头时,根据给定机器上 /usr/include/ 的时间戳,我得到以下元数据错误:
致命错误:自预编译头文件“//precompiled.hpp.pch”构建以来,文件“/usr/include/math.h”已被修改
有时它也可能是不同的标头 - 例如 assert.h 是一个常见的标头。
到目前为止,我已经尝试了以下方法:
- 更改 isysroot 和使用 glibc - 暴露出各种不同的问题(所以我还不想打开一罐暖水瓶)
- 通过在其他地方复制 /usr/include/ 并在搜索路径的前面指定它来破解。不幸的是,由于在某些标头中使用了 include_next 而不是其他标头,因此无法正常工作,即不能始终强制从其他地方选择标头,也不能从 /usr/include 中选择标头
关于如何解决这个问题的任何想法?
我现在什至在考虑更糟糕的 hack - 尝试编辑预编译标头的元数据。不幸的是,我找不到任何 API 来轻松查询/编辑 PCH。
有任何想法吗?
解决方案
现在已经设法找到一个解决方案(即使忽略预编译的头文件,在稳定性方面也可能长期受益)。
- 指定 --no-standard-includes -nostdinc++ -nostdlibinc。这将确保路径是包含路径由于 gcc/clang 的构建方式而被剥离。也可以指定 CPATH= 和 CPLUS_INCLUDE_PATH=。
- 通过 CPLUS_INCLUDE_PATH 使用中心位置重建路径。这将意味着来自 /usr/include 的标头始终来自中心位置,并且元检查将通过。它还应该有助于构建的稳定性
- 链接到正确版本的 stdlib
推荐阅读
- arrays - 保存数组并再次读取
- c# - c# linq lambda 填充静态List的最佳方式
- github - 无法将 Jupyter Notebook 从 IBM Watson Studio 发布到 Github 存储库
- node.js - 在 sendGrid(nodejs)中发送文件附件数组或多个文件附件
- html - Laravel/Blade:预选下拉选项
- android - 使用 Hilt 提供第三方类实例
- node.js - 使用无服务器部署 python 时 fs-extra 出现问题
- ios - 颤振应用程序卡在初始屏幕上并且 lanchscreen.storyboard 未显示图像
- python - 抓取表:IndexError:列表索引超出范围
- python - 使用自定义函数在向量的 django 模型中搜索