使用clang++-17编译C++20代码时找不到std::chrono::zoned_time
问题描述
尝试编译以下C++代码:
#include <chrono> #include <iostream> int main() { const std::chrono::zoned_time zt{ "Europe/London", std::chrono::system_clock::now() }; std::cout << zt << '\n'; }
使用编译命令:
clang++-17 -std=c++20 test_chrono_tz.cpp
在Ubuntu 22.04.3 LTS系统上出现错误:
test_chrono_tz.cpp:6:24: error: no type named 'zoned_time' in namespace 'std::chrono' 6 | const std::chrono::zoned_time zt{ "Europe/London", std::chrono::system_clock::now() }; | ~~~~~~~~~~~~~^ 1 error generated.
本地clang++-17版本信息:
Ubuntu clang version 17.0.1 (++20230919093346+e19b7dc36bc0-1~exp1~20230919093406.44) Target: x86_64-pc-linux-gnu Thread model: posix InstalledDir: /usr/bin
该代码在在线编译器可正常运行,需解决本地编译问题,让std::chrono::zoned_time正常工作。
解决方案
问题根源在于Ubuntu 22.04默认搭配的libstdc++版本(12.x)对C++20的std::chrono时区组件(包括zoned_time)支持不完整,以下是两种可行解决方法:
方法一:使用libc++编译
Clang默认链接系统的libstdc++,而libc++对C++20的chrono特性支持更完善:
- 安装libc++及对应开发包:
sudo apt update && sudo apt install libc++-17-dev libc++abi-17-dev
- 修改编译命令,指定使用libc++:
clang++-17 -std=c++20 -stdlib=libc++ test_chrono_tz.cpp
若运行时提示找不到libc++库,可添加链接路径:
clang++-17 -std=c++20 -stdlib=libc++ test_chrono_tz.cpp -Wl,-rpath=/usr/lib/llvm-17/lib
方法二:升级libstdc++版本
通过PPA安装更新版本的libstdc++(13及以上),该版本完整支持C++20的chrono时区功能:
- 添加Ubuntu Toolchain PPA:
sudo add-apt-repository ppa:ubuntu-toolchain-r/test sudo apt update
- 安装libstdc++-17开发包:
sudo apt install libstdc++-17-dev
- 重新编译代码,无需修改原有编译命令:
clang++-17 -std=c++20 test_chrono_tz.cpp
内容的提问来源于stack exchange,提问作者Cherub
相关产品推荐
相关产品推荐

