C++|VisualStudio: 在CMake工程中使用C++模块

C++|VisualStudio: 在CMake工程中使用C++模块

文章图片

C++|VisualStudio: 在CMake工程中使用C++模块

文章图片

C++|VisualStudio: 在CMake工程中使用C++模块

文章图片

C++|VisualStudio: 在CMake工程中使用C++模块

文章图片


自从我们宣布微软C++编译器和Visual Studio开始支持C++模块以来 , 我们已经看到了开发者社区的热烈反响 。 从那个时候开始 , 就已经有人问什么时候可以支持CMake工程 。
今天 , 我很高兴地宣布 , Visual Studio 2022 17.2 预览版2已经包含了一项实验性更新 , 用来在CMake工程中支持C++模块 。 在这个早期版本中 , 你必须使用Visual Studio(MSBuild)代码生成器 。 如果你希望尝尝鲜 , 则可以下载最新的预览版本 。
C++模块是C++20中的一项新特性 。 它可以帮助你划分代码 , 加快编译时间 , 并且可以和现有代码一起无缝地结合 。 如果你对C++模块感兴趣的话 , 可以参考Visual Studio中的C++模块之旅这篇文章 。 它探讨了如何以及何时使用C++模块 , 以及Visual Studio如何帮助你编写C++模块代码 。
在CMake工程中使用C++模块虽然 CMake 对 Visual Studio 中模块的支持仍处于早期试验阶段 , 但使用它很简单 。你不需要在你的 CMake 工程中做任何特别的事情 。只需要确保你已启用 C++20 语言标准 。从这个预览版开始 , 我们的 CMake 工程模板将为你完成这项工作 , 但如果你正在使用现有项目 , 则需要将其添加到你的 CMakeLists.txt 中 , 例如:
set_property(TARGET $TargetName PROPERTY CXX_STANDARD 20)
注意:启用 C++20 需要 CMake 3.12 或更高版本 。Visual Studio 附带最新版本的 CMake , 但如果你跨操作系统使用此项目或需要使用旧版本的 CMake , 则可能需要考虑这一点 。
你还需要确保将 Visual Studio 生成器与 CMake 一起使用 。我们计划将来支持其他的代码生成器 , 例如 Ninja , 但目前尚不可用 。Ninja 是在 Visual Studio 中处理 CMake 项目时的默认生成器 , 因此你需要修改项目的 CMakePresets.json 或 CMakeSettings.json 文件来更改这一设置 。
CMake Presets:【C++|VisualStudio: 在CMake工程中使用C++模块】如果你的工程使用 CMake Presets , 请在 CMakePresets.json 中找到“windows-base”配置预设 。它将具有最有可能设置为“Ninja”的“generator”属性 。将其更新为下图中的设定:

CMake Settings:如果你的工程使用 CMake 设置 , 则可以打开 CMakeSettings.json 编辑器并将生成器设置(在高级下)更改为“Visual Studio 17 2022:”

你需要为每个工程的配置执行此操作 。
至此 , 选择了 Visual Studio 生成器并为你的编译目标启用了 C++20 语言标准 , 你就可以在工程中使用C++模块了 。
在 CMake 工程中创建C++模块要将C++模块添加到你的工程中 , 只需右键单击任何文件夹并选择“添加新项目:”

并在“Visual C++”类别中选择“C++ Module Interface Unit (.ixx)”模板:

如果你使用的是 Targets View , 那就更容易了 。只需在任何目标的上下文菜单中单击“添加 -> 新模块…”:

导出和使用C++模块创建模块接口 (.ixx) 文件后 , 你就可以导出函数、类和结构 。下面的示例定义了一个名为 Printers 的简单模块并导出一个结构:

定义了模块之后 , 其他源文件和模块接口就可以使用 import 关键字来使用它 。可以导入在当前目标或其任何导入中声明的任何模块 。例如 , 下面的“PrintVector.cpp”使用了我们上面定义的打印机模块: