我正在尝试通过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 ++?
答案 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
update-alternatives
)来使用它而不是系统的GCC。请注意,对于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