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

devtoolset编译报错:undefined reference to `std::__throw_out_of_range_fmt'求助

编译链接错误:std::__throw_out_of_range_fmt 未定义的解决办法

错误信息

/usr/bin/cmake -E cmake_link_script CMakeFiles/YikeSim.dir/link.txt --verbose=1
/data/mpich/bin/mpic++   -Wl,--rpath=./shared_lib/linux -std=c++17 -g -O3 -mavx -fopenmp -Wall -D CMAKE_COMPILE -L /usr/lib64      CMakeFiles/YikeSim.dir/src/main/main.cpp.o CMakeFiles/YikeSim.dir/src/yikesim/extern/NanoLog.cpp.o  -o out/build/mingw-build/YikeSim  -L/data/project/YikeFDTDBook/YikeSim/shared_lib/linux  -L/data/project/YikeFDTDBook/YikeSim/static_lib/linux -rdynamic -lboost_timer -lboost_chrono -lboost_thread -lpython3.8 -lc -lopenblas -lgmsh -lpthread -Wl,-rpath,/data/project/YikeFDTDBook/YikeSim/shared_lib/linux:/data/project/YikeFDTDBook/YikeSim/static_lib/linux 
/opt/rh/devtoolset-10/root/usr/libexec/gcc/x86_64-redhat-linux/10/ld: CMakeFiles/YikeSim.dir/src/main/main.cpp.o: in function `std::string::_M_check(unsigned long, char const*) const':
/opt/rh/devtoolset-10/root/usr/include/c++/10/bits/basic_string.h:3392: undefined reference to `std::__throw_out_of_range_fmt(char const*, ...)'
/opt/rh/devtoolset-10/root/usr/libexec/gcc/x86_64-redhat-linux/10/ld: /opt/rh/devtoolset-10/root/usr/include/c++/10/bits/basic_string.h:3392: undefined reference to `std::__throw_out_of_range_fmt(char const*, ...)'

问题分析

这个错误并非单纯的GCC版本问题,核心是编译与链接阶段工具链不匹配,或标准库链接逻辑异常:比如MPIC绑定的GCC版本和你激活的devtoolset版本不一致,导致链接时调用了旧版C标准库,缺失新版标准库才有的格式化异常符号;或是混用了不同ABI的静态/动态依赖库。

解决步骤

  • 校验MPIC++绑定的GCC版本
    执行mpic++ --version,确认其使用的GCC版本是否与当前激活的devtoolset版本一致。若MPIC绑定系统默认旧版GCC,需重新编译MPICH并指定使用当前devtoolset的GCC,或切换到devtoolset自带的MPIC工具。

  • 显式链接C++标准库
    在项目的CMakeLists.txt中添加强制链接C++标准库的配置:

    target_link_libraries(YikeSim PRIVATE stdc++)
    
  • 统一工具链后重新构建

    1. 激活目标devtoolset后,清理旧CMake缓存:
      rm -rf out/build/mingw-build/CMakeCache.txt out/build/mingw-build/CMakeFiles/
      
    2. 重新生成构建文件并编译,确保全程使用同一套工具链:
      source /opt/rh/devtoolset-10/enable && cmake -S . -B out/build/mingw-build && make -C out/build/mingw-build
      
  • 调整C++ ABI兼容性
    若项目混用了不同GCC版本编译的依赖库(如旧版Boost),可尝试强制指定ABI版本。在CMakeLists.txt中添加:

    target_compile_definitions(YikeSim PRIVATE _GLIBCXX_USE_CXX11_ABI=0)
    

    若无效,可将值改为1尝试。

  • 排查静态库兼容性
    检查链接命令中的静态依赖库,确认是否由旧版GCC编译。若存在此类库,需用当前devtoolset的GCC重新编译这些依赖库。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 20:06:51