我正在尝试通过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
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