如何创建一个没有标题的库



我们在C++20中有模块,我们可以完全删除代码中的#include吗?

例如,我们可以编写

import boost.asio;
...

代替

#include <boost/asio.hpp>
...

在过去,我们需要以下步骤来安装库:

  • 将所有源(.cpp(编译为对象(.o(
  • 将它们打包到库(.a或.so(中
  • 将收割台安装到/usr/include
  • 将库文件安装到/usr/lib

在C++20中,我们可以:

  • 编译所有源文件,但每个源文件可能会生成一个对象(.o(和一个编译模块接口(CMI(。对于gcc,它们有.gcm后缀
  • 将对象(.o(打包到库(.a或.so(中
  • 将库文件安装到/usr/lib
  • 将CMI安装到某个路径中

但是使用CMI发布库会导致问题:

  • 我们没有一个特殊的文件夹来放置CMI(我想可能是/usr/include/c++-modules(
  • 不同的编译器产生不同的CMI。对于开发人员来说,为他们的库提供不同版本的CMI是非常糟糕的
  • 如果我们根据模块B编译模块A,但使用不同的编译标志,该怎么办?不同的标志可能不会引起你的注意,但可能会导致潜在的错误

用CMI替换标头不是一个好方法。那么,我们如何才能从C++中完全删除头呢?


我不是在谈论标准库,因为模块化c++标准库是在c++23中引入的。

模块不意味着是二进制分发机制;您应该期望提供模块接口文件(,即,编译为库中对象文件的相同文件,不是头文件(,并将CMI生成和缓存(分别(留给客户端的编译器和构建树。因此,只有在使用给定模块的第一翻译单元之后,每个客户端才能实现构建速度优势。

其他共享机制很可能会在实践中出现,但重要的是,它本质上并不比现有的构建策略更复杂或更不兼容。

最新更新