MATLAB无效的MEX文件错误:缺少符号invalid_argument

时间:2017-05-09 18:49:04

标签: linux matlab gcc mex linker-errors

我遇到这个问题,MATLAB(R2017a)无法加载某个MEX文件:

Invalid MEX-file '/home/travis/local/lib/acadosMEX.mexa64': 

Missing symbol '_ZdlPvm' required by '/home/travis/local/lib/acadosMEX.mexa64'
Missing symbol '_ZNSt13runtime_errorC1EPKc' required by '/home/travis/local/lib/acadosMEX.mexa64'
Missing symbol '_ZNSt16invalid_argumentC1EPKc' required by '/home/travis/local/lib/acadosMEX.mexa64'.

在那个MEX文件上运行ldd给我

> ldd $HOME/local/lib/acadosMEX.mexa64

linux-vdso.so.1 =>  (0x00007ffe3fab2000)
libmex.so => not found
libmx.so => not found
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f9adb90a000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f9adb5f8000)
libblas.so.3 => /usr/lib/libblas.so.3 (0x00007f9ad9def000)
libgfortran.so.3 => /usr/lib/x86_64-linux-gnu/libgfortran.so.3 (0x00007f9ad9ac7000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f9ad97c1000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f9ad93f9000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f9ad91e1000)
/lib64/ld-linux-x86-64.so.2 (0x000056477b9a3000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f9ad8fc3000)
libquadmath.so.0 => /usr/lib/x86_64-linux-gnu/libquadmath.so.0 (0x00007f9ad8d84000)

现在,如果我grep _ZNSt16invalid_argumentC1EPKc

> nm -D /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep _ZNSt16invalid_argumentC1EPKc
000000000008b520 T _ZNSt16invalid_argumentC1EPKc

所以符号绝对存在;因此我将LD_LIBRARY_PATH设置为指向该目录,即/usr/lib/x86_64-linux-gnu/(这不是必需的,对吗?)。

我还应该说,我使用g++-5g++-6给出相同的错误)尝试了所有这些,但是g++-4.9它可以根据需要运行。

所有这些都是MATLAB不支持g++>=5 (link)的原因吗?或者还有一些方法可以让它发挥作用吗?

3 个答案:

答案 0 :(得分:2)

我在Linux(Ubuntu 16.04)上也有丢失符号的问题。在我的情况下,我不是直接从终端(matlabroot/bin/matlab)调用Matlab,而是使用以下脚本:

#!/bin/bash
LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libstdc++.so.6 \
LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu \
matlab $@

这解决了我遗漏符号的问题,但我不知道我们是否有同样的问题开始。

答案 1 :(得分:1)

根据this page,MATLAB 2017a仅支持gcc-4.9,而不支持5或6.使用支持的编译器重新编译解决了这个问题。

答案 2 :(得分:0)

免责声明:我认为这不能回答完整的问题,但可能有助于解决问题。我本来希望将其作为评论发布,但我还没有足够的声誉......

参考:

  

所以符号绝对存在;因此我将LD_LIBRARY_PATH设置为指向该目录,即/ usr / lib / x86_64-linux-gnu /(这不是必需的,对吧?)。

根据此instructions on the Matlab page,您需要在运行时设置LD_LIBRARY_PATH以指向您要链接到的任何目录。这可能是原因,为什么找不到libmex.solibmx.so。我认为这同样适用于libstdc++.so.6