自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:
import std;
int main(int argc, char* argv[]) {
std::cout << "Hello World!" << std::endl;
return 0;
}
CMakeLists.txt:
# 要想支持`import std`,必须要求CMake最低为3.30版本
cmake_minimum_required(VERSION 3.30 FATAL_ERROR)
# 这是关键设置,要求在project语句之前设置。
set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD
# 必须设置当前使用的CMake版本匹配的GUID标识,才能启用`import std`的实验性设置。
# 最新的GUID标识可以查看 https://github.com/Kitware/CMake/blob/master/Help/dev/experimental.rst#c-import-std-support,
# 各个版本的GUID标识需要将`master`替换成当前使用的CMake版本号,比如目前VS2022使用的CMake 3.31.6的需要看:
# https://github.com/Kitware/CMake/blob/v3.31.6/Help/dev/experimental.rst#c-import-std-support
"d0edc3af-4c50-42ea-a356-e2862fe7a444" # CMake 4.1.1的GUID
#"0e5b6991-d74f-4b3d-a41c-cf096e0b2508" # CMake 3.31.6的GUID
)
project(import_std)
# 启用C++标准模块
set(CMAKE_CXX_MODULE_STD 1)
# 必须使用C++23标准
set(CMAKE_CXX_STANDARD 23)
add_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即可直接支持,非常简单方便,安装命令如下:
wget https://apt.llvm.org/llvm.sh
chmod +x llvm.sh
sudo ./llvm.sh 21 clang lldb clangd libc++
sudo update-alternatives --install /usr/bin/clang clang /usr/bin/clang-21 100
sudo update-alternatives --install /usr/bin/clang++ clang++ /usr/bin/clang++-21 100
sudo update-alternatives --install /usr/bin/lldb lldb /usr/bin/lldb-21 100
sudo update-alternatives --install /usr/bin/clangd clangd /usr/bin/clangd-21 100
也可以安装llvm-21的所有组件:
sudo ./llvm.sh 21 all
如果是使用命令:
sudo ./llvm.sh 21
则只会安装clang-21、lldb-21、lld-21、clangd-21,并不会安装libc++,所以需要指定安装libc++。
安装设置好clang-21后,需要在CMakeListst.txt中project命令之前添加下面的命令:
if (CMAKE_CXX_COMPILER MATCHES ".*clang\\+\\+(\\.exe)?$")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++")
endif()
即如果检测到是clang编译器,就使用libc++库。这样就可以在Ubuntu 24.04中没有安装gcc-15的情况下使用clang-21编译器来编译项目了。
附上完整CMakeLists.txt:
# 要想支持`import std`,必须要求CMake最低为3.30版本
cmake_minimum_required(VERSION 3.30 FATAL_ERROR)
# 这是关键设置,要求在project语句之前设置。
set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD
# 必须设置当前使用的CMake版本匹配的GUID标识,才能启用`import std`的实验性设置。
# 最新的GUID标识可以查看 https://github.com/Kitware/CMake/blob/master/Help/dev/experimental.rst#c-import-std-support,
# 各个版本的GUID标识需要将`master`替换成当前使用的CMake版本号,比如目前VS2022使用的CMake 3.31.6的需要看:
# https://github.com/Kitware/CMake/blob/v3.31.6/Help/dev/experimental.rst#c-import-std-support
"d0edc3af-4c50-42ea-a356-e2862fe7a444" # CMake 4.1.1的GUID
#"0e5b6991-d74f-4b3d-a41c-cf096e0b2508" # CMake 3.31.6的GUID
)
# 这段命令必须在project语句之前
# 检测到是Clang编译器,则使用libc++库。
# 这里必须检测CMAKE_CXX_COMPILER变量,不能使用CMAKE_CXX_COMPILER_ID,
# CMAKE_CXX_COMPILER_ID需要在project命令之后才能使用。
# 吐槽一下CMake,这点设计就很不友好了
if (CMAKE_CXX_COMPILER MATCHES ".*clang\\+\\+(\\.exe)?$")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++")
endif()
project(import_std)
# 启用C++标准模块
set(CMAKE_CXX_MODULE_STD 1)
# 必须使用C++23标准
set(CMAKE_CXX_STANDARD 23)
add_executable(import_std main.cc)
如果本文对你有帮助,欢迎点赞收藏!

1219

被折叠的 条评论
为什么被折叠?



