matlab 找不到版本GLIBCXX_3.4.11(BuildW.mexglx需要)

8hhllhi2  于 2022-11-15  发布在  Matlab
关注(0)|答案(2)|浏览(177)

我正在尝试通过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的建议链接修复该问题:

export LD_LIBRARY_PATH=${prefix}/lib:$LD_LIBRARY_PATH

然而,由于缺乏Unix外壳知识,我不知道应该在命令中输入什么。我在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++版本?

fhg3lkii

fhg3lkii1#

MatLab(以及大量其他商业程序,如STeam、MATHEMICATA等)提供其自己版本的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

1.安装MatLab期望的GCC版本,修改MEX构建选项(或使用`update-alternatives`)以取代系统的GCC。
请注意,对于1-3,您可能需要以相同的方式处理其他库,如`libgcc_s.so`。
使用新版本的原因是因为`libstdc++`内部使用了符号版本控制方案(因此也有提到该版本的详细错误消息)。需要对Arch Linux上的STeam进行类似的“修复”,在Arch Linux上,STeam使用的几个系统库都链接到较新的`libstdc++`。
真正的解决方案是,MatLab不要发布`libstdc++.so`,而是使用操作系统提供的版本。
ktca8awb

ktca8awb2#

根据版本的不同,将其链接到类似于此的内容。

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

相关问题