如何在windows, linux, macos上使用c++20

1,018 阅读2分钟

Preface

在做一个跨三个平台的工具AdbClient时,由于使用了部分c++20的特性,导致踩了一些编译器的坑,此篇文章用来记录踩过的坑。

首先需要说明的是,由于需要跨平台因此使用cmake+特定平台编译器的方式。Windows上使用msvc,Linux上使用gcc,MacOS上使用Clang而不是Apple Clang(原因后面会讲到)。 另外,我的编辑器使用的是vscode。

编译器安装

Windows

windows上使用c++20很简单,下载vs2019 v16.10或者v16.11以后的版本: VS 2019 v16.10 & v16.11, 或者直接下载vs2022,安装时一定得勾选cmake的相关toolchain。

接着需要将visual studio的cmake.exe 以及msvc的编译器cl.exe添加到环境变量中,这样才能被vscode所发现。

# Example:
add "D:\visual studio 2019\2019\VC\Tools\MSVC\14.29.30133\bin\Hostx64\x64" to PATH
add "D:\visual studio 2019\2019\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin" to PATH

Linux

安装gcc-13或者clang17。

# ubuntu
sudo apt install gcc-13 g++-13
sudo apt install clang-17 clang++-17
sudo apt install cmake

MacOS

MacOS上稍微有点复杂,首先XCode默认使用的是Apple Clang,这是独立于LLVM Clang的一个分支,其对c++的支持远不如msvc, gcc和clang。由于我需要使用c++20的format,但是因为xcode只有在15.0.3版本开始才支持,目前M1系列的MacOS只能升级到xcode15.0.2,因此只能暂时放弃apple clang转投clang。

# 注意这里必须注明是17,如果只是llvm那虽然在/opt/homebrew/opt/llvm/bin 目录下的clang版本是17,但是真正编译时会发生很多链接错误。
brew install llvm@17  

echo 'export PATH="/opt/homebrew/opt/llvm@17/bin:$PATH" ' >> ~/.bash_profile
echo 'export PATH="/opt/homebrew/opt/llvm@17/bin:$PATH" ' >> ~/.zprofile

然后就可以使用clang++17来编译c++20了。

MacOS下vscode找不到clang++17的

可以通过在项目目录下创建的.vscode文件中,添加文件cmake-kits.json:

[
    {
        "name": "Clang 17.0.6",
        "compilers": {
            "CC": "/opt/homebrew/opt/llvm@17/bin/clang",
            "CXX": "/opt/homebrew/opt/llvm@17/bin/clang++"
        }
    }
]

接着重新启动vscode,勾选clang17即可。