C++23: import std工程模板 - cmake + ninja + gcc15 及不同版本CMAKE_EXPERIMENTAL_CXX_IMPORT

29 阅读2分钟

0.概要

本文主要介绍如下内容:

  • 1.cmake + ninja + gcc15(或其他支持import std的编译器)如何搭建一个支持import std(标准库模块化)特性的项目/工程模板
  • 2.cmake不同版本CMAKE_EXPERIMENTAL_CXX_IMPORT_STD功能对应的ID怎么确定
  • 3.如何使用xlings工具一键生成这样的项目模板并自动配置好环境 - 想快速体验的朋友可以直接看第3节

1.最小项目模板及构建

1.1 目录结构

├── build - 构建目录(后期生成)
├── CMakeLists.txt - 工程描述文件
├── config.xlings
├── README.md
└── src
    └── main.cpp - 源码文件

3 directories, 4 files

1.2 HelloWorld代码 - src/main.cpp

通过一行import std导入标准库, 然后不需要一个一个include就能使用标准库里的工具, 例如下面的println

import std;

int main() {
    std::println("Hello, C++23 modules!");
}

1.3 工程描述文件

在cmake的描述文件project定义前启用import std特性, 并设置相关C++23标准及模块std, 其中cmake需要3.3及以上才支持CMAKE_EXPERIMENTAL_CXX_IMPORT_STD并不同版本对应ID可能不一样(后面会介绍确定方法)

cmake_minimum_required(VERSION 4.0.2)

# https://github.com/Kitware/CMake/blob/master/Help/dev/experimental.rst
set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD "a9e1cf81-9932-4810-974b-6eccaf14e457")
set(CMAKE_CXX_STANDARD 23)
set(CMAKE_CXX_MODULE_STD 1)

project(HelloWorld LANGUAGES CXX)

add_executable(helloworld src/main.cpp)

1.4 构建&环境要求

使用cmake生成ninja的构建文件, 然后使用ninja进行。这里需要注意的是当前不支持默认的GUN Make

  • ninja
  • cmake 4.0.2
  • gcc 15 或 支持import std特性的编译器(clang...
mkdir build && cd build
cmake -G Ninja ..
ninja -v

image.png

注: 使用默认gun make会报错提示: Unsupported generator: Unix Makefiles

image.png

2 CMAKE_EXPERIMENTAL_CXX_IMPORT_STD不同版本对应的ID

应该不少朋友是卡在了这一步, 由于cmake这个功能还是实验性质的所以要满足以下要求:

  • cmake版本大于等于3.30
  • 要使用和自己版本匹配CMAKE_EXPERIMENTAL_CXX_IMPORT_STD的id号

这个id号在cmake的github文档中: github.com/Kitware/CMa… 但由于默认文档是master分支可能id和你的版本是不匹配的, 所以查找时要切换tag到和自己版本一样的分支 -- 这是个坑点

image.png

3 一键生成项目模板并配置好环境

我给以上模板和环境添加到了xlings工具, 只要一行命令就能生成这个模板并配置好工具链依赖, 对应模板名为cpp23-cmake-helloworld, 完整命令和生成文件(README里包含构建说明)如下

xlings new --template cpp23-cmake-helloworld

image.png

4 Other