#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
不工作?
此符号存在于 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... 具有各自的匹配版本。系统更新会将它们全部更新,但它们并不全部相互依赖,因此更新一个不会自动更新全部。