libc++ 中的 std::expected 在运行时给出“未定义符号:_ZTINSt3__119bad_expected_accessIvEE”

问题描述 投票:0回答:1
#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.1.5。使用以下命令编译代码:

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

编译和链接都可以,但是抛出运行时错误:

./a.out:符号查找错误:./a.out:未定义符号:_ZTINSt3__119bad_expected_accessIvEE

$ 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++
,那就可以了。

为什么libc++的

std::expected
不工作?

c++ clang runtime-error c++23 libc++
1个回答
0
投票

此符号存在于 libc++ 软件包版本 19.1.6 中,但不存在于 18.1.8 中(我将使用 Arch Linux 软件包存档中的内容,因为那是我的系统,但对于所有发行版来说应该是相同的)。升级到 libc++-19 应该可以解决问题。您还可以检查哪个包拥有 libc++。所以您当前链接到 - 如果我的假设是正确的,它应该是 libc++ <19.

如果您在存储库中没有此软件包,则必须手动升级库,但由于您已经有 clang-19,因此以相同的方式获取 libc++-19 应该不会造成任何麻烦。

请注意,LLVM 项目的各个部分作为单独的包进行管理 - clang、llvm、libc++、libc++abi、lld... 具有各自的匹配版本。系统更新会将它们全部更新,但它们并不全部相互依赖,因此更新一个不会自动更新全部。

© www.soinside.com 2019 - 2024. All rights reserved.