【问题标题】:/usr/../libstdc++.so.6: version `GLIBCXX_3.4.11' not found (required by ...)/usr/../libstdc++.so.6:找不到版本“GLIBCXX_3.4.11”(...需要)
【发布时间】:2014-03-21 16:33:58
【问题描述】:

我已经被这个问题困扰了几个星期,并在互联网上四处寻找解决方案,但到目前为止还不是很好......

所以我有一个由其他人编写的程序,我尝试在 Matlab 中编译它以使其工作。我的电脑是安装了 gcc 4.4.3 和 Matlab 2011b 的 Red-hat 企业 Linux 工作站(64 位)。 gcc 与我的 Matlab (http://www.mathworks.com/support/compilers/R2011b/glnxa64.html) 兼容。

编译工作正常(我的意思是,在 Matlab 命令窗口中没有出现错误消息)。但是编译后,每次使用编译中的特定函数(称为“mexLasso”)时,都会显示如下错误:

***无效的 MEX 文件“/usr/local/matlab_R2011b/toolbox/spams-matlab/build/mexLasso.mexa64”: /usr/local/matlab_R2011b/bin/glnxa64/../../sys/os/glnxa64/libstdc++.so.6:版本 找不到“GLIBCXX_3.4.11”(需要 /usr/local/matlab_R2011b/toolbox/spams-matlab/build/mexLasso.mexa64)

测试错误(第 24 行) alpha=mexLasso(X,D,param);*

所以我在终端中输入“strings /usr/lib/libstdc++.so.6 | grep GLIBC”,我发现“GLIBCXX_3.4.11”实际上就在其中。

我只用了几个月的 Linux 和 gcc 的东西……所以还有很多我不明白的东西。如果您能详细解释一下,将会有很大帮助。谢谢!!

%% 更多细节: 我从http://spams-devel.gforge.inria.fr/downloads.html 获得了这些机器学习程序。奇怪的是,编译后,该包中的其他功能可以正常工作(例如“mexTrainDL”)。

【问题讨论】:

  • ubuntuforums.org/showthread.php?t=1809300 同样的问题。是你的吗?
  • 我检查了 ubuntuforums 中提供的那个并遵循了他的解决方案,但它没有帮助:-( ["...删除了符号链接 libstdc++.so.6 及其链接伙伴 libstdc++.so .6* 在 /$MATLAB/sys/os/glnxa64 中,并将它们都替换为在 /usr/lib 中找到的类似名称的对应物(即 ln -s /usr/lib/libstdc++.so.6*)。 .."]
  • 使用stringsgrep 对于查看库定义的内容有点简单,尤其是涉及到C++ 名称修改。使用nm 和此处描述的相关工具:stackoverflow.com/questions/34732/…
  • 先生,我使用“readelf -Ws libstdc++.so.6”并找到了 GLIBCXX_3.4.11,然后是一个巨大的列表,例如“2497: 00000000 0 OBJECT GLOBAL DEFAULT ABS GLIBCXX_3.4.13”。这正常吗?

标签: c++ linux matlab gcc mex


【解决方案1】:

@whjiang 提示的解决方案有效,但有两个限制:

  1. 您可能需要 sudo 权限才能更改库符号 链接。
  2. 更改是全球性的,会影响所有用户

所以还有一个。

正如这个answer from MATLAB Central所解释的,问题是由Matlab引起的:

Matlab 在内部将 LD_LIBRARY_PATH 更改为首选 <MatlabPATH >/sys/os/<ARCH>

<MatlabPATH>/sys/os/libstdc++.so.6 已过期。

解决方法是设置LD_PRELOAD这样调用Matlab的时候,

env LD_PRELOAD=/usr/lib/libstdc++.so.6  <MatlabPATH>/bin/matlab -desktop

libstdc++.so.6 的路径因操作系统而异。例如,在我的 LMDE2 上,路径是 /usr/lib/x86_64-linux-gnu/libstdc++.so.6

【讨论】:

  • 谢谢!!这真的让我的一天(或更确切地说是晚上):)
  • 有什么办法可以永久修复这个问题?而不是每次都运行这个:env LD_PRELOAD=/usr/lib/libstdc++.so.6 /bin/matlab ???
  • @seralouk 我觉得如果你写一个脚本来考虑Matlab的版本和OS的类型和版本等这些问题是可以的。所以我认为不值得这样做.
【解决方案2】:

这已在 libstdc++ 常见问题解答中得到解答:http://gcc.gnu.org/onlinedocs/libstdc++/faq.html#faq.how_to_set_paths

【讨论】:

  • 您好,感谢您的考虑!我居然发现我的电脑里有两个linux账户,我需要用root账户编译,才能在用户账户中使用。这可能是因为共享库只能由 root 帐户使用。
  • 这似乎不太可能,听起来你误解了什么。您可能需要以 root 身份运行最后的 make install 步骤,但不以 root 身份编译任何内容。
【解决方案3】:

这是一个解决方案:

sudo ln -sf /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19 /usr/local/MATLAB/R2011b/bin/glnxa64/libstdc++.so.6

解释和参考: http://fantasticzr.wordpress.com/2013/05/29/matlab-error-libstdc-so-version-glibcxx_3-4-15-not-found/

【讨论】:

    【解决方案4】:

    此页面上的一个简单解决方案 (http://ubuntuforums.org/showthread.php?t=808045) 对我有用。 转到存储 libstdc++.so.6 和 libgcc_s.so.1 的 matlab 目录。就我而言,这是:

    cd /usr/local/MATLAB/MATLAB_Production_Server/R2015a/sys/os/glnxa64
    

    然后重命名 libstdc++.so.6 和 libgcc_s.so.1:

    sudo mv libstdc++.so.6 libstdc++.so.6.orig
    sudo mv libgcc_s.so.1 libgcc_s.so.1.orig
    

    就是这样!

    【讨论】:

      猜你喜欢
      • 2015-10-10
      • 2011-07-10
      • 2017-12-27
      • 1970-01-01
      • 2019-07-23
      • 1970-01-01
      • 2020-02-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多