CMake 3.30中使用import std引入C++标准库

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

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.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即可直接支持,非常简单方便,安装命令如下:

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-21lldb-21lld-21clangd-21,并不会安装libc++,所以需要指定安装libc++

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

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)

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

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值