我们到了2020年,C ++ 20以及期待已久的C ++模块功能将面世。但是,在观看了有关CppCon的一些讨论之后,我发现C ++模块处在一个奇怪的地方,特别是对于Linux软件包管理器(pacman,apt,emerge等)。
据我了解,C ++模块是
- 依赖编译器
- 您不能在Clang中使用GCC构建的模块
- GCC 9.1模块在GCC 9.2上不起作用
- 同一模块可以有许多不同版本
- 只要它们不导出到相同的作用域
- 如果依赖关系更新,则需要重建模块
我的问题是,在所有发行发行版的发行版中,编译器一直都在更新,并且用户可能拥有自己的编译器版本。目前,人们可以只更新编译器,也可以更新libstdc++
。但是对于模块,似乎建议libstdc++
必须在编译器更新时进行更新。
当编译器更新时,包管理器将如何处理更新,例如STL?我认为为编译器的每个版本构建STL模块的每个版本都是不可行的。用户也不必构建自己的STL模块是一个好主意。
1
“ 您不能使用CCC在Clang中构建的模块 ”“您不能使用GCC在Clang中构建的模块的编译结果。
—
Nicol Bolas
我无法抓住问题。可以分发预编译的模块文件,但这不是必须的。每个用户每个编译器/版本都可以编译一次,一切都很好。如果发行版软件包提供了这些预编译的文件,则它仅保存一个当前我们在每个编译中都进行的编译。提供预编译模块的好处在哪里?下载/安装一次可能需要更长的时间。
—
克劳斯
您设想的是哪种猜测,这将不是纯粹的猜测?
—
n。代词
@Klaus确实,没有好处。但是大多数应用程序分为两部分。一个接口和核心库。因此人们可以直接与核心功能进行交互。以yosys为例。它被分裂为libyosys和yosys。如果libyosys决定使用模块进行更快的构建,则必须由每个用户来构建libyosys。有效地使每个包管理器变成AUR或出现。
—
Mary Chang
@n。'代词'。我希望软件包管理器开发人员可以看到问题并解释他们如何解决问题。
—
Mary Chang