未找到版本GLIBCXX_3.4.11(buildW.mexglx需要)

Version GLIBCXX_3.4.11 not found (required by buildW.mexglx)

本文关键字:buildW mexglx 需要 版本 GLIBCXX      更新时间:2023-10-16

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