ubuntu中matlab/c混合编程,libstdc++.so.6: version `GLIBCXX_3.4.11' not found 错误及解决

问题描述:

    ubuntu10.04中,一段matlab/c代码,进行混合编程;运行时报错:

libstdc++.so.6: version `GLIBCXX_3.4.11' not found 错误及解决


---------------------------------------------------------------------------------------------------------------------

   网上搜集解决办法:

         http://www.cnblogs.com/xfzhang/archive/2011/10/14/2212486.html

  该博客中描述比较详尽,如下:

         首先,将MATLAB~/sys/os/glnxa64/libstdc++.so.6,改名为libstdc++.so.6_backup

sudo mv libstdc++.so.6 libstdc++.so.6_backup

(居然直接就能调通了20111019)

0. 将系统目录下/usr/lib/libstdc++.so.6复制到应用程序的库目录替换,如:这里复制到MATLAB_Path/sys/os/glnxa64/中。

博客:

http://blog.sina.com.cn/s/blog_6cf6b58d0100q0r2.html

给出的方法,我试了不行。原因我猜想是因为简单的复制改变了文件的指向,无法指向目标文件。

1. rm MATLAB_Path/sys/os/glnxa64/libstdc++.so.6

我试了,没成功。但是其它方法中的两篇文章都进行了实践,成功了。

2. 博客:libstdc++.so.6:version ‘GLIBCXX_3.4.**’not found

http://yq000cn.blog.163.com/blog/static/14369070201171653016852/

给出了文件libstdc++.so.6的查看方法:

$strings $MATLAB_Path/sys/os/glnxa64/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
GLIBC_2.1.3
GLIBC_2.2
GLIBC_2.3
GLIBC_2.0
GLIBC_2.1
GLIBCXX_FORCE_NEW

Linux:

$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.1
GLIBC_2.1.3
GLIBC_2.3.2
GLIBC_2.2
GLIBCXX_FORCE_NEW
GLIBCXX_DEBUG_MESSAGE_LENGTH

所以做如下操作:

让MATLAB的libstdc++.so 软链接指向Linux的库文件

$ln –s /usr/iib/libstdc++.so.6 $MATLAB_Path/sys/os/glnxa64/libstdc++.so.6

搞定!

---------------------------------------------------------------------------------------------------------------------


照着上面的方法,没有解决我的问题;
摸索很了两个小时,发现做如下操作可以解决:
 ln -s /usr/lib/libstdc++.so.6 /home/dm6446new/sys/os/glnx86/libstdc++.so.6.0.13

原因未知~ 待高手解答

<think>好的,我需要解决用户遇到的dotnet运行时缺少GLIBCXX_3.4.20和GLIBCXX_3.4.21的问题。首先,我得理解这个问题出现的原因。根据用户提供的引用[^1]和[^2],问题通常是由于本地编译环境中的libstdc++.so.6版本高于目标服务器上的版本,导致兼容性问题。 用户提到他们是在arm本地服务器编译后,将程序放到远端服务器运行时出现错误。这说明远端服务器的GLIBCXX版本不支持所需的3.4.20和3.4.21。我需要先确认如何检查当前服务器上的libstdc++.so.6包含的版本。根据引用中的方法,可以通过命令`strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX`来查看已安装的版本。如果确实缺少需要的版本,就需要升级libstdc++库。 接下来,用户可能需要安装更新的GCC版本,因为libstdc++.so.6的版本与GCC版本相关。例如,GCC 8.2.0提供libstdc++.so.6.0.25,包含所需的GLIBCXX_3.4.20和3.4.21。用户需要先在服务器上安装更高版本的GCC,或者将本地编译环境调整为与服务器相同的GCC版本,以避免版本不一致的问题。 另外,用户可能无法直接升级服务器的GCC,这时可以考虑将libstdc++.so.6的高版本库与应用程序一起发布,并通过设置LD_LIBRARY_PATH环境变量来指定库的路径。例如,将新版本的libstdc++.so.6放在应用程序的lib目录下,并运行`export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/new/lib`,这样程序会优先使用自带的库。 在操作过程中,用户需要注意备份原有的libstdc++.so.6文件,避免替换导致系统不稳定。引用中的步骤提到了备份和创建符号链接的方法,但这种方法可能不适用于所有情况,尤其是在生产环境中需要谨慎操作。 最后,如果用户使用的是Docker容器,可能需要调整基础镜像以包含正确版本的GLIBCXX,或者在构建时静态链接libstdc++,但这可能会增加二进制文件的大小。 总结下来,解决步骤应该是:检查当前版本,安装或更新GCC,部署高版本库,设置环境变量,并在必要时调整编译环境或使用容器化解决方案。同时提醒用户注意系统兼容性和稳定性,避免因替换系统库而引发其他问题。</think>### 解决方案:修复dotnet运行时缺少GLIBCXX_3.4.20/3.4.21的错误 #### 1. **确认问题根源** 错误`GLIBCXX_3.4.20 not found`表示当前系统的`libstdc++.so.6`库版本过低,无法满足dotnet运行时的依赖要求。此问题通常发生在以下场景: - **跨环境编译**:本地编译环境(如高版本GCC)生成的程序在低版本系统中运行 - **系统库未更新**:服务器未安装或未正确链接新版C++标准库 #### 2. **检查当前GLIBCXX版本** 在目标服务器执行以下命令,查看支持的GLIBCXX版本: ```bash strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX ``` 若输出中无`GLIBCXX_3.4.20`或`GLIBCXX_3.4.21`,则需升级库。 #### 3. **解决方案步骤** ##### **方法1:升级libstdc++库** 1. **安装高版本GCC** 通过包管理器安装GCC 8.2.0或更高版本(含libstdc++.so.6.0.25及以上): ```bash # CentOS/RHEL示例 sudo yum install centos-release-scl sudo yum install devtoolset-8 scl enable devtoolset-8 bash ``` 2. **手动链接新版库** ```bash cd /usr/lib64 sudo mv libstdc++.so.6 libstdc++.so.6.bak # 备份原文件 sudo ln -s /path/to/new/libstdc++.so.6.0.25 libstdc++.so.6 ``` > 注:新库路径可能位于`/opt/rh/devtoolset-8/root/usr/lib64/` ##### **方法2:部署自带库** 若无法升级系统库,可将新版`libstdc++.so.6`与应用程序一同分发: 1. 将高版本库文件(如`libstdc++.so.6.0.25`)复制到程序目录的`lib`子目录 2. 运行前设置环境变量: ```bash export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/your/lib ``` ##### **方法3:静态链接libstdc++** 在编译时静态链接C++库(需重新编译dotnet程序): ```bash # 在编译命令中添加-static-libstdc++ dotnet publish -c Release -r linux-arm64 --self-contained true /p:LinkMode=static ``` #### 4. **验证修复** 重新运行程序并检查是否报错: ```bash ldd ./your_dotnet_executable | grep libstdc++ ``` 确认输出中显示的库路径和版本正确。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值