编译含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路径:
之后重新编译安装GCC。./configure --enable-libstdcxx-backtrace=yes --with-libbacktrace-path=/path/to/libbacktrace
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
相关产品推荐
相关产品推荐

