CMake 3.30中使用import std引入C++标准库
自C++20
引入module
,我们可以按模块写自己的C++代码了,但标准库还没模块化,想要使用import std
来写C++
还需要等待各个编译器的支持,随着各编译器的陆续支持,构建系统CMake
自3.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
将会非常麻烦,还好,目前CMake
从3.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.14
、MinGW GCC 15.2.0
和MinGW 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-21
、lldb-21
、lld-21
、clangd-21
,并不会安装libc++
,所以需要指定安装libc++
。
安装设置好clang-21
后,需要在CMakeListst.txt
中project
命令之前添加下面的命令:
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)
如果本文对你有帮助,欢迎点赞收藏!
- 原文作者:Witton
- 原文链接:https://wittonbell.github.io/posts/2025/2025-09-17-CMake-3.30中使用import-std引入C++标准库/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议. 进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。