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

使用libc++的std::expected运行时出现未定义符号错误的原因

问题:libc++中std::expected运行时出现符号未定义错误的原因?

环境与代码

使用clang-19.1.5编译器编写的C++代码如下:

#include <expected>
#include <span>
#include <iostream>

int main() {
    auto e = std::expected<std::span<char>, int>{};
    std::cout << e.value().size() << std::endl;
}

编译与运行情况

编译链接命令:

clang++-19 -std=c++2c -stdlib=libc++ ./toy.cpp -lc++abi -lunwind -lc++

编译过程无报错,但运行时抛出错误:

./a.out: symbol lookup error: ./a.out: undefined symbol: _ZTINSt3__119bad_expected_accessIvEE

符号检查结果

执行nm -D /usr/local/lib/libc++.so.1 | grep access查看libc++库中的符号,未找到bad_expected_access相关条目:

$ nm -D /usr/local/lib/libc++.so.1 | grep access
00000000000607b0 T _ZNKSt18bad_variant_access4whatEv
0000000000054040 T _ZNKSt19bad_optional_access4whatEv
0000000000054060 T _ZNSt12experimental19bad_optional_accessD0Ev
0000000000054050 T _ZNSt12experimental19bad_optional_accessD1Ev
0000000000054050 T _ZNSt12experimental19bad_optional_accessD2Ev
0000000000054020 T _ZNSt19bad_optional_accessD0Ev
0000000000054010 T _ZNSt19bad_optional_accessD1Ev
0000000000054010 T _ZNSt19bad_optional_accessD2Ev
00000000000ee248 D _ZTINSt12experimental19bad_optional_accessE
00000000000ee440 D _ZTISt18bad_variant_access
00000000000ee208 D _ZTISt19bad_optional_access
00000000000b024b R _ZTSNSt12experimental19bad_optional_accessE
00000000000ccded R _ZTSSt18bad_variant_access
00000000000b0233 R _ZTSSt19bad_optional_access
00000000000ee220 D _ZTVNSt12experimental19bad_optional_accessE
00000000000ee418 D _ZTVSt18bad_variant_access
00000000000ee1e0 D _ZTVSt19bad_optional_access

现象对比

若将编译参数中的-stdlib=libc++改为-stdlib=libstdc++,程序可正常运行。


解答

核心原因

std::expected是C++23新增的标准特性,问题本质是编译器头文件与运行库版本不匹配:

  • clang-19.1.5的头文件已经实现了std::expected的定义,包括bad_expected_access异常类的声明;
  • 但系统中安装的libc++运行库版本低于编译器版本,还没有添加bad_expected_access相关的符号实现,导致运行时动态链接无法找到对应符号。

而libstdc++(GNU标准库)在对应版本中已经完整实现了C++23的std::expected组件,因此切换后可以正常运行。

解决方法

  1. 升级libc++运行库:将系统中的libc++更新到与clang-19.1.5匹配的版本,确保头文件和运行库的实现一致;
  2. 静态链接libc++:编译时添加-static-libc++参数,把libc++的代码打包进可执行文件,避免动态链接的版本依赖问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 22:16:13