C++23 <stacktrace> 依赖于 glibc 版本

C++23 <stacktrace> dependency on glibc version

提问人:Hedgehog 提问时间:11/8/2023 最后编辑:Employed RussianHedgehog 更新时间:11/9/2023 访问量:103

问:

我一直在尝试在 C++23 标准中使用库。 昨天,我能够在我的一台服务器上成功使用它。 但是,当我尝试在另一台机器上执行相同的操作时,链接失败。stacktrace

链接器错误是

/opt/rh/devtoolset-13/root/include/c++/13.1.0/stacktrace:196: undefined reference to `__glibcxx_backtrace_pcinfo'
/opt/rh/devtoolset-13/root/lib/gcc/x86_64-pc-linux-gnu/13.1.0/../../../../x86_64-pc-linux-gnu/bin/ld: /home/archy/.nuget/ccVqmeKz.ltrans49.ltrans.o:/opt/rh/devtoolset-13/root/include/c++/13.1.0/stacktrace:206: undefined reference to `__glibcxx_backtrace_syminfo'
/opt/rh/devtoolset-13/root/lib/gcc/x86_64-pc-linux-gnu/13.1.0/../../../../x86_64-pc-linux-gnu/bin/ld: /home/archy/.nuget/ccVqmeKz.ltrans49.ltrans.o: in function `my_assert_backtrace()':
/opt/rh/devtoolset-13/root/include/c++/13.1.0/stacktrace:164: undefined reference to `__glibcxx_backtrace_create_state'
/opt/rh/devtoolset-13/root/lib/gcc/x86_64-pc-linux-gnu/13.1.0/../../../../x86_64-pc-linux-gnu/bin/ld: /home/archy/.nuget/ccVqmeKz.ltrans99.ltrans.o: in function `std::basic_stacktrace<std::allocator<std::stacktrace_entry> >::current(std::allocator<std::stacktrace_entry> const&) [clone .isra.0]':
/opt/rh/devtoolset-13/root/include/c++/13.1.0/stacktrace:259: undefined reference to `__glibcxx_backtrace_simple'
/opt/rh/devtoolset-13/root/lib/gcc/x86_64-pc-linux-gnu/13.1.0/../../../../x86_64-pc-linux-gnu/bin/ld: /opt/rh/devtoolset-13/root/include/c++/13.1.0/stacktrace:164: undefined reference to `__glibcxx_backtrace_create_state'

我怀疑存在一些 glibc 依赖性。

我成功使用 stacktrace 的机器有 .Ubuntu GLIBC 2.35-0ubuntu3.4

我未能使用 stacktrace 构建的机器有GNU libc 2.17

我现在的两个问题是

  1. stacktrace 是否与较旧的 libc 兼容?( 2.17 是在 2012 年发布的,所以我怀疑 ).
  2. 如果它对libc有版本依赖性,我怎样才能要求最低版本?(我搜索了发行说明和提交,但找不到任何内容。
C gcc 堆栈跟踪 libstdc++ c++23

评论

2赞 ChrisB 11/8/2023
链接器错误将您指向 libstdc++(在符号名称中)。为什么您认为这是您的 libc 版本的问题?__glibcxx
1赞 n. m. could be an AI 11/8/2023
GCC 应在配置时确定 glibc 是否支持回溯功能。如果您在较新的机器上配置编译器,然后在较旧的机器上使用它,或者在较新的机器上编译代码,然后在较旧的机器上链接它,那么您将比这台机器有更多的惊喜。
0赞 n. m. could be an AI 11/8/2023
具体来说,如果定义宏,则在标头中定义。如果没有,那么基本上是空的,一切都被淘汰了。现在,如果您能够编译代码,您应该能够使用为同一台机器配置的 gcc 将其链接到您编译代码的同一台机器上。如果您尝试过多的混合和匹配机器,则无法保证任何操作。bits/c++config.h_GLIBCXX_HAVE_STACKTRACE__glibcxx_backtrace_syminfo<stacktrace><stacktrace>#ifdef
0赞 n. m. could be an AI 11/8/2023
如果一切都发生在同一台机器上,并且您仍然可以编译但不能链接,则您的 gcc 可能配置错误,或者您的旧版本可能具有需要链接的单独 libstdc++_libbacktrace.a 库。
1赞 Nemo 11/15/2023
题外话,但出于好奇......你从哪里得到 devtoolset-13?

答: 暂无答案