c++ - 找不到版本 GLIBCXX_3.4.11(buildW.mexglx 需要)

标签 c++ linux matlab ld mex

我正在尝试通过 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
    ```
  1. 安装 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/

相关文章:

arrays - 查找按升序排序的矩阵的列索引和行索引

c++ - 二维点的边界

c++ - 简历限定符和右值引用

c++ - 从文件读取/写入时双重释放或损坏

linux - 以centos 7为操作系统对安装在谷歌云实例上的tableau server进行网络访问

linux - 查找在过去 15 分钟内更改的文件,不包括一些子目录并将其压缩

Linux bash脚本从文件中提取数据

matlab - 将零填充到二进制数中特定位置的命令?

c++ - "error C2248: ' sf::NonCopyable::NonCopyable ' : cannot access private member declared in class ' sf::NonCopyable '"

c++ - 使用 ITK 计算图像梯度的错误结果