找不到版本GLIBCXX_3.4.11(buildW.mexglx要求)

Jos*_*mon 7 c++ linux matlab ld mex

我试图通过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)
Run Code Online (Sandbox Code Playgroud)

我不熟悉的过程,所以我不能明白像一些提出的解决方案.什么是libstdc ++和GLIBCXX,我该如何解决这个问题?

我试图使用nkjt 建议的链接解决问题:

export LD_LIBRARY_PATH=${prefix}/lib:$LD_LIBRARY_PATH
Run Code Online (Sandbox Code Playgroud)

但是,由于缺乏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
Run Code Online (Sandbox Code Playgroud)

但是,我的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 
Run Code Online (Sandbox Code Playgroud)

我无法创建文件已存在的文件.

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
Run Code Online (Sandbox Code Playgroud)

我怎样才能确保定义了正确版本的libstdc ++?

rub*_*nvb 11

Matlab(还有很多其他商业程序,比如Steam,Mathematica等)都有自己的libstdc ++版本,所以:

/usr/local/MATLAB/R2011a/bin/glnx86/../../sys/os/glnx86/libstdc++.so.6
Run Code Online (Sandbox Code Playgroud)

问题是当你启动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
Run Code Online (Sandbox Code Playgroud)

1B.删除Matlab的版本,让你的操作系统的加载器拿起系统的libstdc ++:

    sudo rm /usr/local/MATLAB/R2011a/bin/glnx86/../../sys/os/glnx86/libstdc++.so.6
Run Code Online (Sandbox Code Playgroud)

1C.使用环境变量LD_PRELOAD将系统的libstdc ++版本"注入"到执行环境中之前的其他任何东西,这会阻止加载旧的Matlab版本:

    LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libstdc++.so.6 matlab
Run Code Online (Sandbox Code Playgroud)
  1. 安装GCC版本Matlab期望并修改Mex构建选项(或使用update-alternatives)以使用它而不是系统的GCC.

请注意,对于1-3,您可能需要以libgcc_s.so相同的方式混淆其他库.

使用新版本的原因是因为libstdc ++内部采用了符号版本控制方案(因此也提到了版本的详细错误消息).需要为例如Arch Linux上的Steam执行类似的"修复",其中几个系统库Steam使用链接到较新的libstdc ++.

真正的解决方案是让Matlab不发布libstdc ++,而是使用操作系统提供的版本.

  • +1 解释得很好。对于同一项目作者在另一个项目上的此类问题的故障排除步骤,这里是值得的:http://kyamagu.github.io/mexopencv/#linux。因此,解决此问题的第四种方法是使用 [`LD_PRELOAD`](http://stackoverflow.com/q/426230/97160) 强制操作系统加载程序在找到 MATLAB 之前动态加载系统的 libstdc++。 (2认同)