12

我们现在是 2020 年,C++20 即将到来,还有期待已久的 C++ 模块功能。但是在看了一些关于 CppCon 的演讲后,我发现 C++ 模块的位置很奇怪,尤其是对于 Linux 包管理器(pacman、apt、emerge 等)。

据我所知,C++ 模块是

  1. 编译器依赖
    • 您不能在 Clang 中使用由 GCC 构建的模块
    • GCC 9.1 模块不适用于 GCC 9.2
  2. 您可以拥有同一模块的许多不同版本
    • 只要它们不导出到同一范围内
  3. 如果依赖项更新,您需要重新构建模块

我的问题是,在所有滚动发布的发行版中,编译器一直在更新,用户可能有自己的编译器版本。目前可以只更新编译器或更新libstdc++. 但是对于模块,似乎建议libstdc++必须在编译器更新时进行更新。

当编译器更新时,包管理器将如何处理更新,例如 STL?我不认为为每个版本的编译器构建每个版本的 STL 模块是可行的。用户必须构建自己的 STL 模块也不是一个好主意。

4

2 回答 2

2

目前(2020 年 1 月 10 日),模块系统更多地被认为是项目内部功能,而不是替代 header/lib 分发。正如 Clang 社区的人所建议的那样,尽管有人提议创建一个独立于编译器的 AST 形式,但 Clang、Gcc 和微软都没有计划这样做。所以你猜

您可以拥有同一模块的许多不同版本

是对的,并且会保持一段时间。

作为包管理平台方面,解决方法还不得而知,但由于模块系统更多是项目内部的特性,最坏的情况是“header/lib”的方式仍然会发生。

PS 我认为 stackoverflow 不是解决此类问题的好地方,如果您真的想要答案,请向邮件列表提问。

于 2020-01-10T02:50:44.367 回答
0

据我了解,您不会分发模块接口文件的编译输出。对于打包者来说,模块文件就像头文件一样:您将模块接口文件作为源文件分发。总而言之,您将分发 lib/module 接口文件,而不是分发 lib/header 文件。请注意,编译后的“库”仍然存在,这与以前相同:(模块或非模块)函数的实际实现可以像以前一样进入编译后的库文件。

模块接口文件确实取代了头文件:虽然它也可能包含实现,但它仍然作为源分发。

模块接口文件的编译形式(显然称为 BMI 或二进制模块接口)与预编译头文件几乎相同:您不应该分发它们!

于 2021-05-16T12:15:10.743 回答