我正在尝试通过 matlab 编译一个 C++ ubuntu 项目 here .当我在使用 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 究竟是什么?我该如何解决这些问题?
我正在尝试使用建议的 link 解决问题来自 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
并将您系统的版本符号链接(symbolic link)到完全相同的名称:
```
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
```
- 安装 Matlab 期望的 GCC 版本并修改 Mex 构建选项(或使用
update-alternatives
)以使用它而不是系统的 GCC。
请注意,对于 1-3,您可能需要以相同的方式处理其他库,例如 libgcc_s.so
。
使用新版本有效的原因是 libstdc++
内部采用的符号版本控制方案(因此还有提及版本的详细错误消息)。需要对 Steam 进行类似的“修复”,例如Arch Linux,其中 Steam 使用的几个系统库链接到较新的 libstdc++
。
真正的解决方案是让 Matlab 不提供 libstdc++.so
而是使用操作系统提供的版本。
关于c++ - 找不到版本 GLIBCXX_3.4.11(buildW.mexglx 需要),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25929332/