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

后端 未结 2 1527
我寻月下人不归
我寻月下人不归 2021-01-12 13:06

I am trying to compile a c++ ubuntu project via matlab here. When I am trying to use it after the compilation with make command, I am getting the following error:

         


        
相关标签:
2条回答
  • 2021-01-12 13:20

    Link it with something like this, depending on the version.

    sudo ln -s /usr/lib/libstdc++.so.6.0.9 libstdc++.so.6
    
    0 讨论(0)
  • 2021-01-12 13:34

    Matlab (and a ton of other commercial programs like Steam, Mathematica, etc.) ships its own version of the libstdc++ so:

    /usr/local/MATLAB/R2011a/bin/glnx86/../../sys/os/glnx86/libstdc++.so.6
    

    The problem is that when you start matlab, it loads this one first, and since it is loaded, this version is used to resolve all dynamic loader dependencies.

    You compiled with your system GCC and linked to your system's libstdc++, which is newer. The resulting binary then requests symbols of a certain (newer) version and the loader does not find them in the already loaded version (i.e. Matlab's).

    There are two ways to solve this:

    1a. Delete/rename Matlab's libstdc++ so and symlink your system's version to the exact same name:

        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
    

    1b. 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
    

    1c. 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. Install the GCC version Matlab expects and modify the Mex building options (or use update-alternatives) to use that instead of the system's GCC.

    Note that for 1-3, you may need to mess with additional libraries like libgcc_s.so, in the same way.

    The reason that using the new version works is because of the symbol versioning scheme employed in libstdc++ internally (hence also the detailed error message mentioning the version). A similar "fix" needs to be done for Steam on e.g. Arch Linux, where several system libraries Steam uses are linked to the newer libstdc++.

    The real solution is for Matlab not to ship the libstdc++ so and instead use the OS provided version.

    0 讨论(0)
提交回复
热议问题