跳转到内容

C++ Modules 使用与示例

基础介绍

Xmake 采用 .mpp 作为默认的模块扩展名,同时也支持 .ixx.cppm.mxx 等。已完整支持 gcc11/clang/msvc 的 C++20 Modules 构建,并能自动分析模块间依赖,实现最大化并行编译。

最基础用法:

lua
set_languages("c++20")
target("class")
    set_kind("binary")
    add_files("src/*.cpp", "src/*.mpp")

更多官方示例见:C++ Modules 示例集


进阶用法

仅 Cpp 工程启用 Modules

v2.7.1 起支持 Headerunits,可在模块中引入 STL 和用户头文件模块。通常需至少有一个 .mpp 文件才会启用 modules 编译,但也可通过:

lua
add_rules("mode.debug", "mode.release")
target("test")
    set_kind("binary")
    add_files("src/*.cpp")
    set_languages("c++20")
    set_policy("build.c++.modules", true)

Headerunits 示例

  • 如何将 STL 或自定义头文件作为 headerunit 引入模块,见 headerunits 示例

模块包分发与集成

分发 C++ Modules 包

通过 {install = true} 指定需要安装分发的模块文件:

lua
add_rules("mode.release", "mode.debug")
set_languages("c++20")
target("foo")
    set_kind("static")
    add_files("*.cpp")
    add_files("*.mpp", { install = true })

可将其做成包,提交到 xmake-repo 或本地/私有仓库。

本地包示例:

lua
package("foo")
    set_sourcedir(path.join(os.scriptdir(), "src"))
    on_install(function(package)
        import("package.tools.xmake").install(package, {})
    end)

集成 C++ Modules 包

通过 add_requires("foo") 快速集成:

lua
add_rules("mode.release", "mode.debug")
set_languages("c++20")
add_repositories("my-repo my-repo")
add_requires("foo", "bar")
target("packages")
    set_kind("binary")
    add_files("src/*.cpp")
    add_packages("foo", "bar")
    set_policy("build.c++.modules", true)

C++23 标准库模块

支持 C++23 标准库模块(stdmodules):

lua
add_rules("mode.debug", "mode.release")
set_languages("c++latest")
target("mod")
    set_kind("static")
    add_files("src/*.cpp")
    add_files("src/*.mpp", {public = true})
target("stdmodules")
    set_kind("binary")
    add_files("test/*.cpp")
    add_deps("mod")
c++
// my_module.mpp
export module my_module;
import std;
export auto my_sum(std::size_t a, std::size_t b) -> std::size_t;

更多 C++ Modules 示例集锦

Xmake 官方仓库 C++ Modules 示例集 提供了丰富的 C++20/23 Modules 工程,每个子目录为一个独立示例:

  • basic:基础模块用法
  • class:模块中导出类
  • headerunits:Headerunits 用法
  • import_std:标准库模块
  • partition:模块分区
  • packages:模块包分发与集成
  • stdmodules:C++23 标准库模块

每个示例目录下均有完整的 xmake.lua 和源码,适合深入学习和参考。