C++11编译出现/usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.14' not found (required by ./a.out)

本文介绍了解决GCC升级后导致的程序运行时找不到特定版本动态库的问题。主要原因是新旧GCC版本间的libstdc++.so版本不一致。通过查找系统中所有libstdc++.so库,替换为新版本并更新链接,最后执行ldconfig即可解决问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

从源码编译安装升级了gcc以后,程序编译运行时偶尔会遇到这样的问题:


[root@localhost ~]# ./a.out 
./a.out: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.14' not found (required by ./a.out)

运行以下命令检查:

[root@localhost ~]# strings /usr/lib/libstdc++.so.6 | grep GLIBC
GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBC_2.0
GLIBC_2.3
GLIBC_2.4
GLIBC_2.1
GLIBC_2.1.3
GLIBC_2.3.2
GLIBC_2.2
GLIBCXX_FORCE_NEW
GLIBCXX_DEBUG_MESSAGE_LENGTH

主要原因就是你最新升级gcc后生成的动态库没有替换老版本gcc的动态库,通过

[root@localhost ~]# find / -name "libstdc++.so*"
/root/build_gcc_4.8.1/stage1-i686-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so
/root/build_gcc_4.8.1/stage1-i686-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.18
/root/build_gcc_4.8.1/stage1-i686-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6
/root/build_gcc_4.8.1/prev-i686-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so
/root/build_gcc_4.8.1/prev-i686-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.18
/root/build_gcc_4.8.1/prev-i686-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6
/root/build_gcc_4.8.1/i686-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so
/root/build_gcc_4.8.1/i686-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.18
/root/build_gcc_4.8.1/i686-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6
/usr/lib/libstdc++.so.6
/usr/lib/libstdc++.so.6.0.13
/usr/lib/gcc/i686-redhat-linux/4.4.4/libstdc++.so
/usr/local/lib/libstdc++.so
/usr/local/lib/libstdc++.so.6.0.18
/usr/local/lib/libstdc++.so.6
/usr/local/lib/libstdc++.so.6.0.18-gdb.py
/usr/share/gdb/auto-load/usr/lib/libstdc++.so.6.0.13-gdb.py
/usr/share/gdb/auto-load/usr/lib/libstdc++.so.6.0.13-gdb.pyc
/usr/share/gdb/auto-load/usr/lib/libstdc++.so.6.0.13-gdb.pyo
/usr/share/gdb/auto-load/usr/lib64/libstdc++.so.6.0.13-gdb.py
/usr/share/gdb/auto-load/usr/lib64/libstdc++.so.6.0.13-gdb.pyc
/usr/share/gdb/auto-load/usr/lib64/libstdc++.so.6.0.13-gdb.pyo

可以找到当前系统中所有 libstdc++.so库,将最新版本(libstdc++.so.6.0.18)的库拷贝到 /usr/lib 和 /usr/lib64目录下后执行以下命令,将默认库指向改变:

[root@localhost ~]# cp /usr/local/lib/libstdc++.so.6.0.18 /usr/lib
[root@localhost ~]# cd /usr/lib
[root@localhost lib]# rm -rf libstdc++.so.6
[root@localhost lib]# ln -s /usr/lib/libstdc++.so.6.0.18 /usr/lib/libstdc++.so.6
[root@localhost lib]# ldconfig


执行ldconfig将库加载到系统缓存中,问题解决!
<think>我们面对的问题是:在运行ollama时出现错误,提示GLIBCXX_3.4.25在/usr/lib64/libstdc++.so.6中未找到。我们需要解决这个动态链接库版本不兼容的问题。 根据引用[1][2][3]提供的线索,通常的解决方法是更新libstdc++.so.6的版本,使其包含所需的GLIBCXX版本(这里是3.4.25)。由于不同系统环境(如Docker)中库文件的位置可能不同,我们需要根据实际情况操作。 步骤: 1. 确认当前系统中libstdc++.so.6的版本。 2. 如果当前版本低于所需版本(3.4.25),则需要安装更高版本的libstdc++3. 更新软链接,使libstdc++.so.6指向新版本。 然而,根据引用[2]中的方法,我们可以尝试通过添加PPA源并安装更新的gcc版本来获取更新的libstdc++。 具体步骤: 步骤1:检查当前GLIBCXX版本 运行以下命令查看当前系统支持的GLIBCXX版本: ``` strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX ``` 或者如果库文件在/usr/lib/x86_64-linux-gnu/下(如引用[1]中提到的docker环境),则使用: ``` strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCXX ``` 步骤2:添加PPA并安装更新的gcc(以获取更新的libstdc++) 如果输出中没有GLIBCXX_3.4.25,则需要安装更新的版本。 按照引用[2]的方法: ``` sudo add-apt-repository ppa:ubuntu-toolchain-r/test sudo apt update sudo apt install gcc-9 g++-9 ``` 注意:这里安装gcc-9,因为gcc-9对应的libstdc++版本会包含GLIBCXX_3.4.25以上(具体来说,gcc-9.1.0的libstdc++支持到GLIBCXX_3.4.26)。但用户需要的是3.4.25,所以gcc-9应该满足要求。 步骤3:安装后,新的libstdc++.so.6.0.26(或更高版本)通常会被安装在/usr/lib/x86_64-linux-gnu/目录下。我们需要将libstdc++.so.6指向新版本。 首先,找到新版本的库文件: ``` sudo find / -name "libstdc++.so*" ``` 通常,新安装的库文件在/usr/lib/gcc/x86_64-linux-gnu/9/(其中9是gcc版本)下。 步骤4:创建软链接 假设我们找到了新版本的库文件(例如:/usr/lib/gcc/x86_64-linux-gnu/9/libstdc++.so.6.0.26),我们将其复制(或软链接)到系统库目录(/usr/lib64或/usr/lib/x86_64-linux-gnu)并更新软链接。 以/usr/lib/x86_64-linux-gnu为例(如果系统库目录是/usr/lib64,则替换): ``` sudo cp /usr/lib/gcc/x86_64-linux-gnu/9/libstdc++.so.6.0.26 /usr/lib/x86_64-linux-gnu/ cd /usr/lib/x86_64-linux-gnu sudo rm -f libstdc++.so.6 sudo ln -s libstdc++.so.6.0.26 libstdc++.so.6 ``` 注意:如果系统原来使用的是/usr/lib64目录,那么应该将库文件复制到/usr/lib64并更新那里的软链接。 步骤5:验证 再次运行: ``` strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCXX ``` 确保输出中包含GLIBCXX_3.4.25。 步骤6:重新运行ollama,应该不再报错。 注意事项: 1. 在更新软链接之前,建议备份原来的libstdc++.so.6。 2. 如果系统中有多个gcc版本,可能需要使用update-alternatives来设置默认gcc版本,但这里我们主要关注libstdc++库。 3. 如果上述方法安装gcc-9后仍然没有所需的版本,可以尝试安装更高版本的gcc(如gcc-10、gcc-11等)。 替代方案:如果系统不允许安装新版本的gcc(比如生产环境),也可以考虑直接下载所需版本的libstdc++.so.6.0.26(或包含GLIBCXX_3.4.25的版本)并手动复制和更新软链接。 根据引用[3],我们还可以通过设置环境变量LD_LIBRARY_PATH来指定库的路径(如果不想替换系统库): ``` export LD_LIBRARY_PATH=/path/to/directory/containing/new/libstdc++.so:$LD_LIBRARY_PATH ``` 然后运行ollama。但这种方法需要每次运行前设置,或者写入到~/.bashrc中。 总结:我们推荐使用安装新版本gcc的方法,因为它更规范,并且可以保证库的完整性。 如果用户使用的是Docker环境,则需要在Dockerfile中执行上述步骤,并重新构建镜像。 根据用户的问题,错误提示是GLIBCXX_3.4.25 not found,所以我们确保安装的libstdc++版本至少包含3.4.25。gcc-9.1.0的libstdc++支持到3.4.26,因此满足要求。 如果用户系统是CentOS/RHEL系列,则不能使用apt,而应使用yum。但根据引用中提到的路径(/usr/lib64),用户可能是CentOS/RHEL。但用户错误信息中提到了/usr/lib64,而引用[1][2]都是Ubuntu的方法。因此,我们需要区分系统。 由于用户没有说明系统,我们先假设是Ubuntu(因为引用中使用了apt)。如果是CentOS,则可以使用devtoolset来安装新版本的gcc。 针对CentOS/RHEL的步骤(如果用户是此类系统): 1. 安装Software Collections(SCL)仓库: ``` sudo yum install centos-release-scl ``` 2. 安装devtoolset(例如devtoolset-9): ``` sudo yum install devtoolset-9 ``` 3. 启用devtoolset-9: ``` scl enable devtoolset-9 bash ``` 4. 然后,新的库文件会在/opt/rh/devtoolset-9/root/usr/lib64/目录下,我们可以将libstdc++.so.6.0.26复制到/usr/lib64并更新软链接(或者将/opt/rh/devtoolset-9/root/usr/lib64加入LD_LIBRARY_PATH)。 由于用户问题中提到了/usr/lib64,所以很可能是CentOS/RHEL。但用户上一次问题中提到了docker环境,且路径为/usr/lib/x86_64-linux-gnu(Ubuntu的路径),所以也可能是Ubuntu。因此,我们需要用户确认系统,或者根据实际情况选择方法。 但是,用户当前的问题描述中,错误信息是“ollama error GLIBCXX_3.4.25 not found on /usr/lib64/libstdc++.so.6”,所以库文件在/usr/lib64下。因此,我们按照CentOS/RHEL的方法处理?但用户之前的问题中又提到在docker中为/usr/lib/x86_64-linux-gnu,所以这里存在矛盾。 建议:先按照错误信息中提示的路径(/usr/lib64)去操作,即使用CentOS/RHEL的方法。但用户可能是在Ubuntu的docker中运行?因为Ubuntu的docker镜像中也可能有/usr/lib64(作为软链接到/usr/lib/x86_64-linux-gnu)?所以,我们首先确定库文件的实际位置。 更通用的方法:不管是什么系统,我们都可以通过查找libstdc++.so.6的实际位置,然后更新它。 因此,我们综合给出以下步骤: 步骤1:确定当前libstdc++.so.6的路径。 错误信息已经给出:/usr/lib64/libstdc++.so.6 步骤2:检查该文件支持的GLIBCXX版本: ``` strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX ``` 步骤3:如果没有GLIBCXX_3.4.25,则安装新版本的libstdc++。 根据系统类型选择安装方式: 如果是Ubuntu/Debian: ``` sudo add-apt-repository ppa:ubuntu-toolchain-r/test sudo apt update sudo apt install gcc-9 g++-9 # 然后找到新版本的库文件,通常在/usr/lib/x86_64-linux-gnu/,然后更新/usr/lib64/libstdc++.so.6的软链接指向新版本(注意:/usr/lib64可能是软链接,也可能是实际目录) ``` 如果是CentOS/RHEL: ``` sudo yum install centos-release-scl sudo yum install devtoolset-9 # 启用devtoolset-9,临时进入新环境 scl enable devtoolset-9 bash # 然后将新版本的库文件(在/opt/rh/devtoolset-9/root/usr/lib64/)复制到/usr/lib64,并更新软链接(或者直接替换软链接) ``` 步骤4:更新软链接(以CentOS为例,在启用devtoolset-9后): ``` # 先备份 sudo cp /usr/lib64/libstdc++.so.6 /usr/lib64/libstdc++.so.6.bak # 删除原软链接 sudo rm -f /usr/lib64/libstdc++.so.6 # 将新版本的库文件复制到/usr/lib64(如果还没有的话) sudo cp /opt/rh/devtoolset-9/root/usr/lib64/libstdc++.so.6.0.25 /usr/lib64/ # 注意:实际版本号可能不同,请根据实际情况 # 创建软链接 sudo ln -s /usr/lib64/libstdc++.so.6.0.25 /usr/lib64/libstdc++.so.6 ``` 注意:在Ubuntu中,新安装的库可能在/usr/lib/x86_64-linux-gnu/下,而/usr/lib64可能是软链接到该目录。因此,在Ubuntu中,我们通常更新/usr/lib/x86_64-linux-gnu/下的软链接。 由于用户错误信息中指定了/usr/lib64/libstdc++.so.6,所以即使是在Ubuntu系统中,我们也应该确保该路径的库文件(或软链接)指向正确版本。如果/usr/lib64是软链接,则更新实际目录(/usr/lib/x86_64-linux-gnu)中的文件即可。 步骤5:验证。 考虑到用户可能无法确定系统类型,我们提供一个更直接的方法:下载所需版本的libstdc++.so.6.0.26(包含GLIBCXX_3.4.26,它自然包含3.4.25)并手动更新。 下载地址(注意系统架构和版本): 例如,从https://ftp.gnu.org/gnu/gcc/ 下载gcc源码包,然后编译,但这样比较麻烦。 或者,从已有的系统中复制,或者从包管理器中下载对应的包(例如ubuntu的libstdc++6包)。 但是,最安全的方法还是通过包管理器安装。 因此,我们建议用户根据系统类型选择上述方法之一。 如果用户是在docker中运行,则可以在Dockerfile中增加相应的安装步骤。 由于用户的问题信息有限,我们提供两种方案: 方案一(推荐):通过包管理器安装新版本的gcc(从而更新libstdc++),然后更新软链接。 方案二:手动下载所需版本的库文件并更新软链接。 鉴于方案一更规范,我们以Ubuntu系统为例(因为用户提到docker中路径为/usr/lib/x86_64-linux-gnu,所以假设是Ubuntu)给出详细步骤: 详细步骤(Ubuntu): 1. 添加PPA并更新: ``` sudo apt-get update sudo apt-get install software-properties-common sudo add-apt-repository ppa:ubuntu-toolchain-r/test sudo apt-get update ``` 2. 安装gcc-9(它提供了libstdc++6的较新版本): ``` sudo apt-get install gcc-9 g++-9 ``` 3. 此时,新版本的libstdc++.so.6.0.26应该被安装到/usr/lib/x86_64-linux-gnu/。我们将其复制到/usr/lib64/(如果/usr/lib64是软链接,那么实际就是复制到/usr/lib/x86_64-linux-gnu/,因为/usr/lib64通常链接到/usr/lib/x86_64-linux-gnu)?在Ubuntu中,/usr/lib64可能不存在,或者是一个软链接。我们可以检查: ``` ls -l /usr/lib64 ``` 如果它是软链接到/usr/lib/x86_64-linux-gnu,那么我们只需要更新/usr/lib/x86_64-linux-gnu下的库文件链接。 4. 进入库目录: ``` cd /usr/lib/x86_64-linux-gnu ``` 5. 备份原来的libstdc++.so.6: ``` sudo cp libstdc++.so.6 libstdc++.so.6.bak ``` 6. 删除原软链接: ``` sudo rm libstdc++.so.6 ``` 7. 创建指向新版本的软链接(新版本的文件名是libstdc++.so.6.0.26): ``` sudo ln -s libstdc++.so.6.0.26 libstdc++.so.6 ``` 注意:如果安装gcc-9后没有生成libstdc++.so.6.0.26,请检查实际版本号,可能是libstdc++.so.6.0.25(但gcc-9.1.0对应的是6.0.26)。 8. 验证: ``` strings libstdc++.so.6 | grep GLIBCXX ``` 如果用户系统是CentOS,则使用devtoolset方法,并更新/usr/lib64下的软链接(因为CentOS中/usr/lib64是标准库目录)。 由于用户错误信息中明确指出了路径/usr/lib64,所以如果用户是Ubuntu系统,那么/usr/lib64可能是一个软链接,指向/usr/lib/x86_64-linux-gnu,因此我们更新实际目录即可。如果用户系统是CentOS,则直接操作/usr/lib64。 最后,如果更新后运行ollama仍然报错,可能是因为ollama运行时使用的是其他位置的库(比如它自带的库)。我们可以通过设置LD_LIBRARY_PATH环境变量来强制使用系统库: ``` export LD_LIBRARY_PATH=/usr/lib64:$LD_LIBRARY_PATH ``` 然后运行ollama。 希望以上步骤能够解决用户的问题。</think>### 解决 GLIBCXX_3.4.25 not found 错误的方法 #### 问题分析 当运行ollama时出现`GLIBCXX_3.4.25 not found`错误,表示系统缺少所需的C++标准库版本(`libstdc++.so.6`)。这通常是因为: 1. 当前安装的`libstdc++`版本过低(低于6.0.25) 2. 软链接`/usr/lib64/libstdc++.so.6`指向了旧版本库文件 3. Docker/不同Linux发行版的库路径可能不同(如`/usr/lib/x86_64-linux-gnu`)[^1][^3] --- ### 解决方案(Ubuntu/CentOS通用) #### 步骤1:检查当前GLIBCXX版本 ```bash # 检查支持的GLIBCXX版本列表 strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX # 如果报错"文件不存在",尝试其他路径 strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCXX ``` 若输出**不包含**`GLIBCXX_3.4.25`,需升级库[^1]。 #### 步骤2:安装新版libstdc++ **Ubuntu/Debian系统:** ```bash # 添加工具链仓库 sudo add-apt-repository ppa:ubuntu-toolchain-r/test sudo apt update # 安装GCC 9+(自带libstdc++6.0.26+) sudo apt install gcc-9 g++-9 libstdc++6 # 验证新库版本 strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCXX_3.4.25 ``` **CentOS/RHEL系统:** ```bash # 安装开发工具集 sudo yum install centos-release-scl sudo yum install devtoolset-9 # 激活环境 scl enable devtoolset-9 bash # 验证新库 strings /opt/rh/devtoolset-9/root/usr/lib64/libstdc++.so.6 | grep GLIBCXX ``` #### 步骤3:更新软链接 ```bash # 定位新版库路径(通常在上述安装目录) sudo find / -name "libstdc++.so.6*" 2>/dev/null # 更新软链接(示例路径,需替换实际路径) sudo rm /usr/lib64/libstdc++.so.6 sudo ln -s /path/to/new/libstdc++.so.6.0.26 /usr/lib64/libstdc++.so.6 # Docker常见路径 sudo ln -s /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.26 /usr/lib64/libstdc++.so.6 ``` #### 步骤4:验证修复 ```bash # 检查是否包含GLIBCXX_3.4.25 strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX_3.4.25 # 重新运行ollama ollama run ``` --- ### 备选方案:手动更新库文件 若包管理器不可用: 1. 从[官方镜像](https://ftp.gnu.org/gnu/gcc/)下载对应版本的`libstdc++.so.6.0.26` 2. 复制到系统目录: ```bash sudo cp libstdc++.so.6.0.26 /usr/lib64/ sudo ldconfig ``` 3. 更新软链接(同步骤3--- ### 注意事项 1. **路径差异**:Docker中库路径常为`/usr/lib/x86_64-linux-gnu`[^1][^3] 2. **版本兼容**:确保ollama与其他组件使用相同架构的库文件 3. **环境变量**:临时解决方案可设置`LD_LIBRARY_PATH`: ```bash export LD_LIBRARY_PATH=/usr/lib64:$LD_LIBRARY_PATH ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值