You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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特性支持更完善:

  1. 安装libc++及对应开发包:
sudo apt update && sudo apt install libc++-17-dev libc++abi-17-dev
  1. 修改编译命令,指定使用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时区功能:

  1. 添加Ubuntu Toolchain PPA:
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt update
  1. 安装libstdc++-17开发包:
sudo apt install libstdc++-17-dev
  1. 重新编译代码,无需修改原有编译命令:
clang++-17 -std=c++20 test_chrono_tz.cpp

内容的提问来源于stack exchange,提问作者Cherub

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 09:15:14