找不到版本GLIBCXX_3.4.11(buildW.mexglx要求)

时间:2014-09-19 08:16:02

标签: c++ linux matlab ld mex

我正在尝试通过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知识,我不明白该命令的内容。我找到libstdc ++ .a和.so文件,它位于gcc文件夹/usr/lib/gcc/i686-linux-gnu/4.6中,我正在尝试以下操作:

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

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

编辑:我已经将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 ++?

2 个答案:

答案 0 :(得分:11)

Matlab(以及其他许多商业程序,如Steam,Mathematica等)都提供了自己版本的libstdc ++,所以:

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

问题在于,当你启动matlab时,它首先加载这个,然后加载它,这个版本用于解决所有动态加载器依赖。

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

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

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的版本,让你的操作系统的加载器拿起系统的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. 安装GCC版本Matlab期望并修改Mex构建选项(或使用update-alternatives)来使用它而不是系统的GCC。
  2. 请注意,对于1-3,您可能需要以同样的方式混淆其他库,例如libgcc_s.so

    使用新版本的原因是因为libstdc ++内部使用了符号版本控制方案(因此也提到了版本的详细错误消息)。一个类似的"修复"需要在Steam上完成Arch Linux,其中几个系统库Steam使用链接到较新的libstdc ++。

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

答案 1 :(得分:3)

根据版本将其与此类内容相关联。

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