Matlab mex 无法构建,但 gcc 可以

Posted

技术标签:

【中文标题】Matlab mex 无法构建,但 gcc 可以【英文标题】:Matlab mex can not build but gcc can 【发布时间】:2015-10-15 01:20:26 【问题描述】:

我是 Matlab 的新手,正在尝试构建一个 C 文件。使用 gcc(64 位 Ubuntu 中的 4.8.4)可以很好地编译代码。但是当我尝试使用mex 构建时,它显示以下错误:

error: exponent has no digits

我不确定我做错了什么。错误是in this file。完成error log is here。

当我使用 gcc 编译代码时,没有错误。我没有为 gcc 提供任何特殊参数。据我所知,mex 正在使用 gcc,所以我不明白为什么 mex 无法构建代码。

我对 C 编程知之甚少,非常感谢任何帮助!

编辑:

为了进一步澄清,我在两个文件中找到了源代码:

文件 1 具有带有 main 函数的 C 代码,并使用来自 this file 的函数(mex 无法构建)。

文件 2 有 S-Function 的 C 代码,它调用文件 1 的 main 函数。文件 2 有一个 include 语句以包含 File 1

当我说我可以使用gcc 构建时,我只是使用以下命令构建了File 1gcc file1.c -o file1。我认为不使用gcc 构建File 2 对我的问题没有影响,因为只有文件1 使用了mex 无法构建的文件中的那些函数。

我使用来自 Matlab mex file2.c 的这个命令来构建并得到错误。

【问题讨论】:

看起来 mex 不支持十六进制浮点数,https://gcc.gnu.org/onlinedocs/gcc/Hex-Floats.html,这是问题所在的第 982 行。我猜你必须传递给mex 选项告诉在构建代码时使用 GNU 扩展 gcc 扩展是使用-std=gnu++11 而不是-std=c++11 启用的(对于标准的其他修订版进行了必要的修改) @BenVoigt 我相信这是纯 C,因此很可能应该使用 -std=gnu99 启用扩展。 @giga 很可能您必须将 -std=gnu99(或者可能是 gnu90)选项传递给编译器(mex 只是一个包装器)。不幸的是,我现在不知道该怎么做,我对matlab的经验是很久以前的了 直接引用“您也可以使用 -std=gnu90(对于带有 GNU 扩展的 C90)、-std=gnu99(对于带有 GNU 扩展的 C99)显式选择 C ​​语言的扩展版本”跨度> 【参考方案1】:

对于 C 代码,您可能需要为 C99 (-std=gnu99) 启用 GNU 扩展。如my previous post 中关于启用 C99 所述,将其传递给mex

mex -v -largeArrayDims CFLAGS="\$CFLAGS -std=gnu99" mexSouce.c

默认不起作用的原因是mex喜欢选择ANSI standard,这通常不是最新的。

【讨论】:

以上是关于Matlab mex 无法构建,但 gcc 可以的主要内容,如果未能解决你的问题,请参考以下文章

在 matlab 中使用库(gcc)和编译 mex 时出错

Matlab mex 文件比它的直接 C 等效文件慢

Octave:可以编译 mex,但出现错误:“无法安装 .mex 文件功能”

在Matlab中使用以前版本的gcc for mex

matlab-bgl 工具包配置环境 TDM-GCC-64 mex

在 64 位 Windows 7 机器上使用 GCC 作为 MATLAB 2014a 的默认 MEX 编译器