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

源码编译的libstdc++.so缺失GLIBCXX符号、链接异常是什么原因

问题原因
  • 你查询libstdc符号的命令存在用法错误:strings命令的操作对象是/usr/local/lib64目录,而非具体的libstdc++.so共享库文件,返回的GLIBCXX_FORCE_NEW、GLIBCXX_DEBUG_MESSAGE_LENGTH两个字符串只是目录下无关文件携带的内容,完全不能证明你编译的libstdc缺失版本符号。
  • 链接报错的核心原因是链接器库搜索优先级不匹配:你自行编译的gcc安装前缀为/usr/local,对应的libstdc存放在/usr/local/lib64路径,但系统链接器/usr/bin/ld默认优先搜索/lib64、/usr/lib64等系统路径,链接libQt6Core.so时没有加载到你编译的libstdc,因此抛出找不到operator new(unsigned long)@GLIBCXX_3.4基础符号的错误。
  • 你贴出的configure命令存在shell续行语法错误:--enable-linker-build-id行末尾的反斜杠后多了一个多余空格,shell续行要求反斜杠必须是行尾最后一个字符才能转义换行,多余空格会导致后续几行的配置参数没有被传入configure脚本,可能造成编译出的libstdc++存在配置缺陷。
修复步骤
  • 首先验证编译出的libstdc++本身是否正常,使用正确的命令查询版本符号:
# 确认自定义安装路径下的libstdc++文件存在
ls /usr/local/lib64/libstdc++.so.*
# 对实际的带版本号的共享库文件执行查询,禁止直接对目录操作
strings /usr/local/lib64/libstdc++.so.6 | grep GLIBCXX

正常编译的libstdc++会列出从GLIBCXX_3.4开始、对应当前gcc版本支持的全量版本符号。如果这一步仍然查不到对应版本符号,说明之前的编译因参数丢失出现异常,需要重新编译。

  • 重新编译gcc前修正configure命令的续行问题,删除所有行尾反斜杠后的多余空格、制表符,保证每个续行反斜杠紧贴换行符,所有配置参数都能被正确识别。另外注意你贴出的md build是笔误,正确创建目录的命令是mkdir build,避免编译时目录创建失败。
  • 完成gcc安装后配置链接器规则,让系统优先加载自定义路径的库文件:
    1. 写入全局链接器配置:
    echo "/usr/local/lib64" > /etc/ld.so.conf.d/custom-gcc.conf
    ldconfig
    
    1. 编译业务项目时,显式指定库搜索路径和运行时库路径,在链接参数中添加-L/usr/local/lib64 -Wl,-rpath=/usr/local/lib64,强制链接器使用你自行编译的libstdc++,避免错误加载系统路径下的不匹配库。
  • 正式编译项目前,执行which gcc、gcc --version确认当前调用的是安装在/usr/local下的自定义gcc版本,而非系统自带的gcc,避免用错编译器。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 16:12:22