C++23发布有一段时间了,有很多实用又好用的特性,实在想尽快在自己的项目中用起来。但是Mac OS自带的C++环境还是clang14,对C++23特性的支持还差了很多,需要动手捣鼓一番。
安装
clang是LLVM工具集中的一个编译器前端,为了用上C++23的特性,我们不妨将LLVM升级到最新版,目前是19。在Mac OS上基于 brew 用一行命令即可完成安装:
brew install llvm
安装完成后,可以看到一些包安装成功后的路径,以我的安装结果为例,lLLVM被安装到了:
/usr/local/opt/llvm
这个目录下可以看到一系列重要的内容,例如bin,头文件和动态链接库
到这一步,算是完成了安装。
配置
安装完成后,还需要一些简单的配置,让最新版本的LLVM工具集变得可用,并且能和我们的工具链配合起来。
首先修改环境变量,让LLVM全局可见,向shell的环境变量中以我的为例在.zshrc中加入如下配置:
export LLVM_HOME=/usr/local/opt/llvm
export PATH=$LLVM_HOME/bin:$PATH
加入上面的配置后,全局中就可以使用clang, clang++等一系列工具了。
为了编译的时候配置可以更简洁一些,还需要加入一些额外的配置,让编译器clang/clang++工作时可以有更多的上下文。
export LDFLAGS="-L/usr/local/opt/llvm/lib"
export CPPFLAGS="-I/usr/local/opt/llvm/include"
有了这些配置,编译器工作时,会自动寻找最新的LLVM配套的头文件和链接库,这样就不用每次编译的时候额外写那么许多编译配置。
除此之外,一些新的特性不是实现为一个语法规则,而是实现为一个库。要用到完整的C++23的特性,我们需要使用最新的标准库的实现libc++。那么继续加入如下的配置:
export CPLUS_INCLUDE_PATH="$LLVM_HOME/include/c++/v1:$CPLUS_INCLUDE_PATH"
export LIBRARY_PATH="$LLVM_HOME/lib:$LLVM_HOME/lib/c++:$LIBRARY_PATH"
export LD_LIBRARY_PATH="$LLVM_HOME/lib:$LLVM_HOME/lib/c++:$LD_LIBRARY_PATH"
至此,基础的配置就完成了。
和xmake的结合
CMake的语法实在是不够贴心,自己开发的时候,我更喜欢用xmake,配置简单,功能也很强大。一个xmake的c++工程中,有一个xmake.lua的文件,在前面的一系列配置的基础上,我们只需要对它稍作修改,就能用到C++23特性。
设置语言版本,添加配置
set_toolchains("clang")
set_languages("c99", "c++23")
链接libc++库,使用最新的标准库实现
add_cxxflags("-stdlib=libc++")
add_ldflags("-stdlib=libc++")
执行xmake -v命令可以看到完整的编译命令:
测试
配置完成了,接下来测试一下效果,我们选取两个C++23中比较有代表性的特性来测试一下整个环境配置是否成功。
- if consteval
- std::print
前者涉及新的语法规则,后者则涉及新的标准库实现。
#include
consteval int compile_time_math(int x) {
// C++23 新特性
if consteval {
return x * x;
} else {
return x;
}
}
int main(int argc, char** argv) {
constexpr int val = compile_time_math(5);
std::println("C++23 test: {}", val);
return 0;
}
编译执行,预期能打印出"C++23 test: 25" 。
好了,可以尽情的使用C++最新的特性来创造世界了。