C++20引入module,我们可以按模块写自己的C++代码了,但标准库还没模块化,想要使用import std来写C++还需要等待各个编译器的支持,随着各编译器的陆续支持,构建系统CMake3.30版本开始也开始在实验性支持中了。

在最新版的VS2022中,MSVC项目已经支持标准库的模块化了,可以在安装目录C:\Program Files\Microsoft Visual Studio\2022\企业版/社区版\VC\Tools\MSVC\14.44.35207\modules中找到相应的文件:

在这里插入图片描述

MSVC项目属性的C/C++/语言页中将C++语言标准设置为/std:c++23及更新标准,并设置生成ISO C++标准库模块,就可以使用import std的方式引入C++标准库了:

在这里插入图片描述 VS有图形化的界面可以设置,gcc/clang就中有自行写配置了,如果使用Makefile将会非常麻烦,还好,目前CMake3.30版本开始已经实验性的支持了。下面直接给出项目示例:

main.cc

1import std;
2
3int main(int argc, char* argv[]) {
4  std::cout << "Hello World!" << std::endl;
5  return 0;
6}

CMakeLists.txt

 1# 要想支持`import std`,必须要求CMake最低为3.30版本
 2cmake_minimum_required(VERSION 3.30 FATAL_ERROR)
 3
 4# 这是关键设置,要求在project语句之前设置。
 5set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD
 6# 必须设置当前使用的CMake版本匹配的GUID标识,才能启用`import std`的实验性设置。
 7# 最新的GUID标识可以查看 https://github.com/Kitware/CMake/blob/master/Help/dev/experimental.rst#c-import-std-support,
 8# 各个版本的GUID标识需要将`master`替换成当前使用的CMake版本号,比如目前VS2022使用的CMake 3.31.6的需要看:
 9# https://github.com/Kitware/CMake/blob/v3.31.6/Help/dev/experimental.rst#c-import-std-support
10  "d0edc3af-4c50-42ea-a356-e2862fe7a444" # CMake 4.1.1的GUID
11  #"0e5b6991-d74f-4b3d-a41c-cf096e0b2508"  # CMake 3.31.6的GUID
12)
13
14project(import_std)
15
16# 启用C++标准模块
17set(CMAKE_CXX_MODULE_STD 1)
18# 必须使用C++23标准
19set(CMAKE_CXX_STANDARD 23)
20
21add_executable(import_std main.cc)

以上测试在CMake 4.1.1中使用VS2022 17.14.14MinGW GCC 15.2.0MinGW Clang 20.1.8编译通过。

由于目前CMake还是实验性支持,所以CMAKE_EXPERIMENTAL_CXX_IMPORT_STD的GUID标识每个版本都不一样,需要去查询,这是最容易出错的地方。可以去官方仓库使用Tags切换到不同的版本:

在这里插入图片描述

前面介绍的都是在Windows下编译的,如果是想在Linux下编译需要做点工作。

目前Ubuntu最新稳定版本24.04中自带的GCC最高版本为14.2,并不支持import std的写法,需要自行编译源码升级到GCC-15才行;而clang可以直接通过官方的安装源直接安装最新版本Clang 21即可直接支持,非常简单方便,安装命令如下:

1wget https://apt.llvm.org/llvm.sh
2chmod +x llvm.sh
3sudo ./llvm.sh 21 clang lldb clangd libc++
4sudo update-alternatives --install /usr/bin/clang clang /usr/bin/clang-21 100
5sudo update-alternatives --install /usr/bin/clang++ clang++ /usr/bin/clang++-21 100
6sudo update-alternatives --install /usr/bin/lldb lldb /usr/bin/lldb-21 100
7sudo update-alternatives --install /usr/bin/clangd clangd /usr/bin/clangd-21 100

也可以安装llvm-21的所有组件:

1sudo ./llvm.sh 21 all

如果是使用命令:

1sudo ./llvm.sh 21

则只会安装clang-21lldb-21lld-21clangd-21,并不会安装libc++,所以需要指定安装libc++

安装设置好clang-21后,需要在CMakeListst.txtproject命令之前添加下面的命令:

1if (CMAKE_CXX_COMPILER MATCHES ".*clang\\+\\+(\\.exe)?$")
2set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++")
3endif()

即如果检测到是clang编译器,就使用libc++库。这样就可以在Ubuntu 24.04中没有安装gcc-15的情况下使用clang-21编译器来编译项目了。

附上完整CMakeLists.txt

 1# 要想支持`import std`,必须要求CMake最低为3.30版本
 2cmake_minimum_required(VERSION 3.30 FATAL_ERROR)
 3
 4# 这是关键设置,要求在project语句之前设置。
 5set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD
 6# 必须设置当前使用的CMake版本匹配的GUID标识,才能启用`import std`的实验性设置。
 7# 最新的GUID标识可以查看 https://github.com/Kitware/CMake/blob/master/Help/dev/experimental.rst#c-import-std-support,
 8# 各个版本的GUID标识需要将`master`替换成当前使用的CMake版本号,比如目前VS2022使用的CMake 3.31.6的需要看:
 9# https://github.com/Kitware/CMake/blob/v3.31.6/Help/dev/experimental.rst#c-import-std-support
10  "d0edc3af-4c50-42ea-a356-e2862fe7a444" # CMake 4.1.1的GUID
11  #"0e5b6991-d74f-4b3d-a41c-cf096e0b2508"  # CMake 3.31.6的GUID
12)
13# 这段命令必须在project语句之前
14# 检测到是Clang编译器,则使用libc++库。
15# 这里必须检测CMAKE_CXX_COMPILER变量,不能使用CMAKE_CXX_COMPILER_ID,
16# CMAKE_CXX_COMPILER_ID需要在project命令之后才能使用。
17# 吐槽一下CMake,这点设计就很不友好了
18if (CMAKE_CXX_COMPILER MATCHES ".*clang\\+\\+(\\.exe)?$")
19set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++")
20endif()
21
22project(import_std)
23
24# 启用C++标准模块
25set(CMAKE_CXX_MODULE_STD 1)
26# 必须使用C++23标准
27set(CMAKE_CXX_STANDARD 23)
28
29add_executable(import_std main.cc)

如果本文对你有帮助,欢迎点赞收藏!

参考: https://www.kitware.com/import-std-in-cmake-3-30/