做跨境电商的人才网站,做球形全景的网站,婚庆公司策划书,wordpress带下载功能简单地说#xff0c;由 Google 开发的 include-what-you-use#xff08;IWYU#xff09;让源代码文件包含代码里用到的所有头文件。这种方法确保在改动了一些接口之后#xff0c;代码依然最有可能编译成功。
之前我写了一篇关于 include-what-you-use 工具的文章#xff… 简单地说由 Google 开发的 include-what-you-useIWYU让源代码文件包含代码里用到的所有头文件。这种方法确保在改动了一些接口之后代码依然最有可能编译成功。
之前我写了一篇关于 include-what-you-use 工具的文章它会建议使用提前声明来加速编译时间并且检测可能导致可移植性问题的对间接包含的意外依赖。
但是你也可能注意到该工具引起的一些负面问题。
1、问题确保间接包含 你首先会注意到的一个问题是遵循“包含你所使用的”有时候会造成一些困扰。使用一种包含其它头文件的“便捷头文件”是一种常见操作许多 Boost 类库使用了这一方法。例如我们包含了 boost/mp11.hpp 来使用所有 Boost.Mp11 里提供的元编程相关的工具。
#include boost/mp11.hppusing my_types boost::mp11::mp_listint, char, float;但是 IWYU 并不知道这一点相反它建议我们包含 boost/mp11/detail/mp_list.hpp 以使用 mp_list而这显然是错的。
如果你在编写一个类库你可以使用一种特殊的注释来修复该问题 // IWYUpragma: export
// somewhere in a Boost.Mp11 header file #include boost/mp11/detail/mp_list.hpp // IWYU pragma: export
这里告诉了 IWYU 这一行的头文件里的内容都确认被上面包含的头文件包含了并可以使用。
提示当编写类库是使用“便捷头文件”并且要使用 IWYU使用 // IWYU pragma: export 或者是更加常用的 begin_exports/end_exports来标识已经确认包含了的头文件。
如果你不是在编写类库使用 // IWYU pragma: keep 来告诉IWYU 确保该头文件要被保留检测到但是并没有指令能确认包含该头文件就一定是正确的。
所以的指令可以在这里查看https://github.com/include-what-you-use/include-what-you-use/blob/master/docs/IWYUPragmas.md
2、非侵入指令映射文件 解决以上问题有个非侵入式的方法创建映射文件在映射文件里你可以定义哪些符号应该对应哪些头文件。
在我们的例子里我们想指定 boost::mp11::mp_list 是由 boost/mp11.hpp 提供的。所以我们创建一个 mp11.imp 文件包含以下内容:
[
{ symbol: [boost::mp11::mp_list, private, boost/mp11.hpp, public] }
]该文件的语法类似 JSON包含了一些数组类型的指令。在这里我们使用 symbol 指令来指定具有某种可见性因为某些原因这里必须是 private的某个特定符号boot::mp11::mp_list是由某个具有某种可见性通常是 public的指定头文件boost/mp11.hpp提供的。
然后我们使用 -Xiwyu -mapping_filemp11.imp 将这该映射文件传递给 IWYUIWYU 就不会在提示过多的信息了。
提示使用一个符号映射文件来告诉 IWYU 你要包含哪些头文件所有符号都可以用该方法但是有点太过繁琐。
不过好在还有个更好的方法我们可以使用 include 指令来将一个头文件重映射到另一个头文件或者将一整个文件夹重映射到一个头文件[ { include: [“boost/mp11/.*”, “public”, “boost/mp11.hpp”, “public”] } ]
这里的 是一个通配符我们在这里把在指定文件夹里的所有头文件我们认为是公共的映射到另一个头文件我们认为也是公共的。
IWYU 不会再提示任何 boost/map11/*里的头文件而是提示 boost/mp11.hpp。而既然我们已经在代码里包含了所以也就一切正常。
提示使用包含映射让一个头文件或者多个头文件映射为另一个头文件。
最后的指令是 ref让多个 .imp文件合并为一个。
请查看这些关于映射文件的文档https://github.com/include-what-you-use/include-what-you-use/blob/master/docs/IWYUMappings.md
3、结论
就个人来讲我并不为映射文件困扰而不必困扰是因为我从不自动运行 IWYU一般是手动运行并查看它输出的建议变更。这样做是非常值得的通过清理一些不必要的包含指令我可以明显提升编译的速度。
期望以后模块化可以让这些操作变得不再必要。
4、让 IWYU 更上一层楼
在游戏、自动化、金融和其它前沿领域的公司都面临着在高峰时段增加计算能力的需求和更快地响应市场的压力仅仅使用 IWYU 是无法完全应对这些挑战的。
通过将任务分布在网络中的本地机器或者是虚拟机上并且无缝地运行Incredibuild 的创新解决方案可以为耗时的任务进行加速例如编译、测试和其它任务。这让各种大小不同的组织都可以用一套完整的解决方案来保证速度、准确性和透明可见。
点击了解 Incredibuild 加速 C/C 构建编译的解决方案并获取试用 License