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即可。