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

编译含std::stacktrace的C++代码出现未定义引用错误的解决求助

解决GCC 13.2.0 std::stacktrace未定义引用错误

为使用GCC的std::stacktrace,通过./configure --enable-libstdcxx-backtrace=yes自行编译了GCC 13.2.0,编译程序的命令如下:

/home/roroco/Dropbox/cpp/cpp-global-deps/gcc-13.2.0/dist/bin/g++ -std=c++23 -I/home/roroco/Dropbox/cpp/cpp-global-deps/gcc-13.2.0/dist/include/c++/13.2.0 -D_GLIBCXX_HAVE_STACKTRACE -Lbacktrace  -o /tmp/t /home/roroco/Dropbox/cpp/cpp_lib/draft/draft/test_out_backtrace.cpp

编译时出现以下未定义引用错误:

~/Dropbox/cpp/cpp_lib/draft/draft $ /bin/bash /home/roroco/Dropbox/cpp/cpp_lib/draft/draft/test_gpp_cli.sh
/tmp/ccr6jSwc.o: In function `std::stacktrace_entry::_S_init()':
test_out_backtrace.cpp:(.text._ZNSt16stacktrace_entry7_S_initEv[_ZNSt16stacktrace_entry7_S_initEv]+0x45): undefined reference to `__glibcxx_backtrace_create_state'
/tmp/ccr6jSwc.o: In function `std::stacktrace_entry::_M_get_info(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*, int*) const':
test_out_backtrace.cpp:(.text._ZNKSt16stacktrace_entry11_M_get_infoEPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_Pi[_ZNKSt16stacktrace_entry11_M_get_infoEPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_Pi]+0x80): undefined reference to `__glibcxx_backtrace_pcinfo'
test_out_backtrace.cpp:(.text._ZNKSt16stacktrace_entry11_M_get_infoEPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_Pi[_ZNKSt16stacktrace_entry11_M_get_infoEPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_Pi]+0xe5): undefined reference to `__glibcxx_backtrace_syminfo'
/tmp/ccr6jSwc.o: In function `std::basic_stacktrace<std::allocator<std::stacktrace_entry> >::current(std::allocator<std::stacktrace_entry> const&)':
test_out_backtrace.cpp:(.text._ZNSt16basic_stacktraceISaISt16stacktrace_entryEE7currentERKS1_[_ZNSt16basic_stacktraceISaISt16stacktrace_entryEE7currentERKS1_]+0x70): undefined reference to `__glibcxx_backtrace_simple'

已添加-Lbacktrace参数但错误依旧,希望解决该问题并使用GCC原生std::stacktrace获取回溯的方法名和行号,无需替换为boost stacktrace。


解决方案

1. 确认GCC编译时的backtrace依赖配置

  • 编译GCC前需确保系统已安装libbacktrace,或GCC源码的libbacktrace子模块已正确初始化。若从Git克隆GCC源码,需执行:git submodule update --init libbacktrace
  • 重新配置GCC时,可显式指定libbacktrace路径:
    ./configure --enable-libstdcxx-backtrace=yes --with-libbacktrace-path=/path/to/libbacktrace
    
    之后重新编译安装GCC。

2. 修改程序编译命令

  • 仅添加-Lbacktrace不足以链接库,需额外添加-lbacktrace参数
  • 确保指定的库路径为GCC编译后安装的libbacktrace所在目录(而非当前目录的backtrace文件夹)
  • 修改后的编译命令示例:
    /home/roroco/Dropbox/cpp/cpp-global-deps/gcc-13.2.0/dist/bin/g++ -std=c++23 -D_GLIBCXX_HAVE_STACKTRACE -L/home/roroco/Dropbox/cpp/cpp-global-deps/gcc-13.2.0/dist/lib -lbacktrace -o /tmp/t /home/roroco/Dropbox/cpp/cpp_lib/draft/draft/test_out_backtrace.cpp
    

3. 验证GCC的stacktrace支持是否生效

  • 检查GCC安装目录下是否存在stacktrace头文件:/home/roroco/Dropbox/cpp/cpp-global-deps/gcc-13.2.0/dist/include/c++/13.2.0/stacktrace
  • 运行以下命令确认宏定义是否生效:
    /home/roroco/Dropbox/cpp/cpp-global-deps/gcc-13.2.0/dist/bin/g++ -dM -E -std=c++23 -x c++ /dev/null | grep _GLIBCXX_HAVE_STACKTRACE
    
    若输出#define _GLIBCXX_HAVE_STACKTRACE 1则说明支持已启用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 08:35:10