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

Posted

技术标签:

【中文标题】MATLAB 无效的 MEX 文件错误:缺少符号 invalid_argument【英文标题】:MATLAB Invalid MEX-file error: missing symbol invalid_argument 【发布时间】:2017-10-08 05:30:47 【问题描述】:

我遇到了 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++-5 尝试了所有这些(g++-6 给出了同样的错误),但是用g++-4.9 它可以按要求工作。

这都是MATLAB不支持g++>=5(link)的原因吗?或者还有什么办法让它发挥作用?

【问题讨论】:

【参考方案1】:

我在 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 $@

这解决了我缺少符号的问题,但我不知道我们是否有同样的问题。

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

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

参考:

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

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

【讨论】:

以上是关于MATLAB 无效的 MEX 文件错误:缺少符号 invalid_argument的主要内容,如果未能解决你的问题,请参考以下文章

MATLAB:mex-compile 上缺少框架 – 架构 x86_64 的未定义符号

在 MATLAB MEX 文件中使用 Thrust 的运行时链接器错误

无效的 mex 文件错误(libstd++ 版本)

Mex 文件执行中的错误,Matlab 窗口

MATLAB 错误使用 mex

matlab mex clang C++11线程->未定义符号错误