【问题标题】:Version GLIBCXX_3.4.11 not found (required by buildW.mexglx)未找到版本 GLIBCXX_3.4.11(buildW.mexglx 需要)
【发布时间】:2014-11-13 18:40:01
【问题描述】:

我正在尝试通过 matlab here 编译一个 c++ ubuntu 项目。当我在使用 make 命令编译后尝试使用它时,出现以下错误:

Invalid MEX-file
'////fashionista_v0.2/lib/+bsr/buildW.mexglx':
 //local/MATLAB/R2011a/bin/glnx86/../../sys/os/glnx86/libstdc++.so.6: version
`GLIBCXX_3.4.11' not found (required by
 ////fashionista_v0.2/lib/+bsr/buildW.mexglx)

我不熟悉这些流程,所以我无法理解像that 这样的几个提议的解决方案。究竟什么是 libstdc++ 和 GLIBCXX,我该如何解决这个问题?

我正在尝试使用 nkjt 提出的 link 解决问题:

export LD_LIBRARY_PATH=${prefix}/lib:$LD_LIBRARY_PATH

但是,由于缺乏 unix shell 知识,我不明白该在命令中输入什么。我找到了 gcc 文件夹 /usr/lib/gcc/i686-linux-gnu/4.6 中的 libstdc++ .a 和 .so 文件,我正在尝试以下操作:

 export LD_LIBRARY_PATH=/usr/lib/gcc/i686-linux-gnu/4.6:$LD_LIBRARY_PATH

但是,我的 matlab 错误仍然存​​在。我正在使用带有 gcc 4.6 和 matlab r2011a 的 Ubuntu 12.04 版本。

编辑:我已将 matlab 版本更新为 r2012a 问题仍然相同。我还尝试了以下方法:

sudo ln -s /usr/lib/cc/i686-linux-gnu/4.6/libstdc++.so libstdc++.so.6 

我无法创建文件已经存在的文件。

usr/lib/libstdc++.so.6 的输出 | grep GLIBC:

        GLIBCXX_3.4
        GLIBCXX_3.4.1
        ...
        GLIBCXX_3.4.10
        GLIBCXX_3.4.11
        GLIBCXX_3.4.12
        GLIBCXX_3.4.13
        GLIBCXX_3.4.14
        GLIBCXX_3.4.15
        GLIBCXX_3.4.16
        GLIBC_2.0
        GLIBC_2.3
        GLIBC_2.4
        GLIBC_2.3.4
        GLIBC_2.1
        GLIBC_2.1.3
        GLIBC_2.3.2
        GLIBC_2.2
        GLIBCXX_DEBUG_MESSAGE_LENGTH

如何确保我定义了正确的 libstdc++ 版本?

【问题讨论】:

标签: c++ linux matlab ld mex


【解决方案1】:

Matlab(以及大量其他商业程序,如 Steam、Mathematica 等)提供了自己的 libstdc++ 版本,因此:

/usr/local/MATLAB/R2011a/bin/glnx86/../../sys/os/glnx86/libstdc++.so.6

问题是,当你启动matlab的时候,它会先加载这个,而且既然加载了,那么这个版本是用来解决所有动态加载器依赖的。

您使用系统 GCC 编译并链接到系统的较新的 libstdc++。然后生成的二进制文件请求某个(较新)版本的符号,而加载器在已加载的版本(即 Matlab 的)中找不到它们。

有两种方法可以解决这个问题:

1a。删除/重命名 Matlab 的 libstdc++,并将系统版本符号链接到完全相同的名称:

    sudo rm /usr/local/MATLAB/R2011a/bin/glnx86/../../sys/os/glnx86/libstdc++.so.6
    sudo ln -s /usr/lib/x86_64-linux-gnu/libstdc++.so.6 /usr/local/MATLAB/R2011a/bin/glnx86/../../sys/os/glnx86/libstdc++.so.6

1b。删除 Matlab 的版本,让你的 OS 加载器获取系统的 libstdc++:

    sudo rm /usr/local/MATLAB/R2011a/bin/glnx86/../../sys/os/glnx86/libstdc++.so.6

1c。使用环境变量LD_PRELOAD将系统的libstdc++版本“注入”到执行环境中,这样可以防止旧的Matlab版本被加载:

    LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libstdc++.so.6 matlab
  1. 安装 Matlab 期望的 GCC 版本并修改 Mex 构建选项(或使用 update-alternatives)以使用它而不是系统的 GCC。

请注意,对于 1-3,您可能需要以同样的方式处理其他库,例如 libgcc_s.so

使用新版本的原因是因为 libstdc++ 内部使用了符号版本控制方案(因此还有提到版本的详细错误消息)。例如,需要对 Steam 进行类似的“修复”。 Arch Linux,Steam 使用的几个系统库链接到较新的 libstdc++。

真正的解决方案是 Matlab 不提供 libstdc++,而是使用操作系统提供的版本。

【讨论】:

  • +1 解释得很好。值得同一个项目作者在这里对另一个项目的此类问题进行故障排除步骤:kyamagu.github.io/mexopencv/#linux。所以解决这个问题的第四种方法是使用LD_PRELOAD 强制操作系统加载器在找到 MATLAB 之前动态加载系统的 libstdc++。
  • @Amro 你说得对,我修改了我的答案。谢谢!
  • 错误:ld.so:来自 LD_PRELOAD 的对象 '/usr/lib/i386-linux-gnu/libstdc++.do.6' 无法预加载:忽略。 matlab:找不到命令
  • @Fere 你有一个错字(.do.6 而不是.so.6)。另外:似乎matlab 不在您的PATH 上。
  • @FereRes 您还可以按照@Amro 的链接或export 环境变量中的说明创建一个bash 别名。不过,这将影响您从该点开始的所有内容(不仅是 Matlab),这可能不是一个好主意。
【解决方案2】:

根据版本将它与类似的东西链接起来。

sudo ln -s /usr/lib/libstdc++.so.6.0.9 libstdc++.so.6

【讨论】:

  • libstdc++ 仅存在于文件夹 gcc/i686-linux-gnu/4.6/libstdc++.so 中。这是我要找的文件吗?我试过 sudo ln -s /usr/lib/cc/i686-linux-gnu/4.6/libstdc++.so libstdc++.so.6 但是我得到了同样的错误。
  • 我可以通过什么方式查看哪个 libstdc++ 被定义为默认值?
猜你喜欢
  • 1970-01-01
  • 2018-11-30
  • 2017-12-29
  • 2017-02-19
  • 2018-05-17
  • 2020-07-22
  • 2021-04-19
  • 2015-04-10
  • 1970-01-01
相关资源
最近更新 更多