【问题标题】:C++ Modules TS & CMakeC++ 模块 TS & CMake
【发布时间】:2018-03-13 12:33:06
【问题描述】:

我对 C++ Modules TS 很好奇。我玩过 Clang 的实现。一次只有一两个文件左右。

现在我想尝试一些比这更大的东西。我想使用 CMake。

有人知道是否有一些好的方法可以将 Clang 模块实现与 CMake 一起使用,或者是否已经有一些 CMake 模块可以帮助我解决这个问题?

我真的很想知道。否则我必须考虑使用不同的构建系统。

【问题讨论】:

标签: c++ module cmake clang


【解决方案1】:

我建议你试试 build2:
https://build2.org/build2/doc/build2-build-system-manual.xhtml#cxx-modules
它支持 Visual Studio、gcc 和 clang 的模块。对于 gcc,有一个包含标准库的包:
https://build2.org/pkg/hello/libstd-modules?f=full&q=library
请注意,从 Visual Studio 2017 更新 4 开始,Microsoft 实施使用 .ixx 文件中的旧语法(模块 xyz;而不是导出模块 xyz;后者是最后一个模块 TS 草案要求的)

【讨论】:

  • 虽然 Build2 看起来很有趣,虽然对模块 ts 的内置支持非常有用,但许多项目已经在 CMake 上投入了大量资金,这使得迁移到新的构建系统具有挑战性,最好。此外,CMake 的跨平台特性使得放弃它非常困难,如果不是不可能的话。
  • 您将遇到的主要问题是您的构建系统需要在编译之前发现模块依赖关系图。模块类似于自动标头生成。在make 中正确处理是可能的,但很困难且容易出错。如果您真的想要使用cmake,那么您需要创建某种预处理步骤来解析您的源文件(包括您自己的模块)以发现模块导入。我不确定你会如何表达cmake 中的结果。
【解决方案2】:

应该不会比配置proper command-line arguments 更难。由于此功能尚未标准化并且在两个已知实现之间有所不同(clang 和 MSVC——gcc 7.2 文档没有提到我可以找到的模块),我不希望有任何 CMake 函数来处理任何事情。

AFAIK,如果标头在模块映射文件中,则将标头视为特殊的 clang 方式落后于 current working draft for modules。 IMO,此时尝试更密切地跟踪模块的 WD 的 MSVC 会更有用。我不知道为什么 g++ 和 clang 在这里落后,他们通常是早期采用者。也许是因为规范仍处于工作草案阶段,还不是 TS,我不知道。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-07
    • 2011-08-16
    • 2012-03-29
    • 2019-04-17
    • 2021-08-02
    相关资源
    最近更新 更多