未find版本GLIBCXX_3.4.11(buildW.mexglx需要)

我正在尝试通过matlab 在这里编译一个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) 

我对这些stream程并不熟悉,所以我不能理解这样的几个提议的解决scheme。 什么是libstdc ++和GLIBCXX,我该如何解决这个问题?

我正在尝试使用从nkjtbuild议的链接来解决问题:

 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 

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

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 ++?

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的版本,让你的操作系统的加载器拿起系统的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。

请注意,对于1-3,您可能需要像libgcc_s.so那样使用其他库。

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

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

把它与这样的东西链接,取决于版本。

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