未找到版本GLIBCXX_3.4.11(buildW.mexglx需要)
Version GLIBCXX_3.4.11 not found (required by 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)
我不熟悉这些过程,所以我无法理解几个这样的解决方案。libstdc++和GLIBCXX究竟是什么?我该如何解决这个问题?
我正在尝试使用来自nkjt:的建议链接来解决问题
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++?
Matlab(以及Steam、Mathematica等许多其他商业程序)推出了自己版本的libstdc++.so
:
/usr/local/MATLAB/R2011a/bin/glnx86/../../sys/os/glnx86/libstdc++.so.6
问题是,当你启动matlab时,它会首先加载这个版本,因为它已经加载,所以这个版本用于解决所有动态加载程序的依赖关系。
您使用系统GCC进行编译,并链接到系统的较新libstdc++
。生成的二进制文件随后请求某个(较新)版本的符号,而加载程序在已加载的版本(即Matlab)中找不到它们。
有两种方法可以解决这个问题:
1。*删除/重命名Matlab的libstdc++.so
,并将系统的版本符号链接到完全相同的名称:
```
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
```
* Delete Matlab's version and let your OS's loader pick up the system's `libstdc++`:
```
sudo rm /usr/local/MATLAB/R2011a/bin/glnx86/../../sys/os/glnx86/libstdc++.so.6
```
* Use the environment variable `LD_PRELOAD` to "inject" the system's version of `libstdc++` into the execution environment before anything else, which prevents the old Matlab version to be loaded:
```
LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libstdc++.so.6 matlab
```
- 安装GCC版本,Matlab期望并修改Mex构建选项(或使用
update-alternatives
)以使用它而不是系统的GCC
请注意,对于1-3,您可能需要以相同的方式处理其他库,如libgcc_s.so
。
使用新版本之所以有效,是因为libstdc++
内部采用了符号版本控制方案(因此也出现了提及该版本的详细错误消息)。类似的";"修复";需要在例如Arch Linux上为Steam完成,其中Steam使用的几个系统库链接到较新的libstdc++
。
对于Matlab来说,真正的解决方案是不提供libstdc++.so
,而是使用操作系统提供的版本。
根据版本将其与类似内容链接。
sudo ln -s /usr/lib/libstdc++.so.6.0.9 libstdc++.so.6