如何使用 Eclipse(4.20.0 版本)和 Matlab(R2021a)在 Windows 中编译 mex 函数

Posted

技术标签:

【中文标题】如何使用 Eclipse(4.20.0 版本)和 Matlab(R2021a)在 Windows 中编译 mex 函数【英文标题】:How can I compile a mex function in Windows with Eclipse (4.20.0 version) and Matlab (R2021a) 【发布时间】:2021-10-27 11:35:46 【问题描述】:

我正在尝试编译我根据 mathworks here(创建 C++ MEX 源文件)给出的规范创建的 c++ mex 函数。但是,按照thread 中的答案步骤在 linux 环境中链接 Eclipse 4.4.2 和 Matlab R2015a(旧但我发现的唯一一个)后,我收到以下错误:

undefined reference to `get_function_ptr'   mpi_pevd_mex_f      line 79, external location: C:\Program Files\MATLAB\R2021a\extern\include\MatlabDataArray\detail\ExceptionHelpers.hpp   C/C++ Problem

我不知道还缺少什么。我一直在努力寻找解决方案,但到目前为止没有任何用处。

感谢您的帮助。

【问题讨论】:

我猜你需要“链接”必要的库。 (1) 在标题中说“Windows”,在问题正文中说“Linux”。请清楚您使用的是什么系统。 (2) “Eclipse”是指 IDE? (3) 您应该使用mex 命令来构建您的 MEX 文件,因为手动设置所有正确的变量和选项非常困难。 (4) 如果您在 Windows 机器上按照 Linux 的说明进行操作,则必须调整指定的路径,而不仅仅是将 glnxa64 替换为任何 Windows 版本。 Windows 上的 MATLAB 将库存储在与 Windows 不同的位置。 另外,使用 -v 选项运行 mex 将显示它用于构建 MEX 文件的所有编译器设置。您可以尝试将它们复制到 Eclipse 中。您链接的问答尝试为 C MEX 文件而不是 C++ 设置 Eclipse。在编写 Q&A 时,C++ API 并不存在。 @CrisLuengo 1) 我正在使用 Windows。在正文中,我只是指定我在问答中遵循的说明是针对 Linux 的。 2) 是的,我说的是 Eclipse IDE 3) 我也在 Matlab 中使用 mex 命令,但我想从 Eclipse 调试函数,而不是在代码中设置标志并猜测它在哪里崩溃。 4)我确定路径没问题,我对其余设置有疑问。例如,我发现对于 windows 的工件扩展名应该是 mexw64,而不是 mexa64;但我不知道是否应该更改其他设置。 也许这个有用:mathworks.com/help/matlab/matlab_external/… 【参考方案1】:

我发现了问题。显然,我需要在大多数与 MEX 文件相关的帖子中详细介绍的库中添加额外的库,即 libmex/libmat/libmx。

利用 Matlab 中的详细模式 (mex -v MexFunction.cpp),我意识到缺少这些库:libmwlapack、m、libmwblas、libMatlabEngine、libMatlabDataArray。添加后,错误消失了。

【讨论】:

libMatlabEngine 从未被 MEX 文件使用,只有使用 MATLAB 引擎来控制 MATLAB 的应用程序才需要它。仅当您使用新的 C++ API 时才需要 libMatlabDataArray,我认为这是您缺少的一个库。 MATLAB 使用 LAPACK 和 BLAS 库,但您不需要显式链接到它们,除非您直接调用其中的函数。 m 库用于数学函数,大多数程序需要链接到它。 感谢您的澄清。 Matlab 在使用 mex 命令编译时包含所有这些库是否有原因? 我认为链接到所有内容比试图找出需要哪些内容更容易。

以上是关于如何使用 Eclipse(4.20.0 版本)和 Matlab(R2021a)在 Windows 中编译 mex 函数的主要内容,如果未能解决你的问题,请参考以下文章

Eclipse中如何查看使用的JDK版本?

如何将eclipse项目和svn关联

eclipse创建maven项目时如何修改web的版本和jdk的版本

您如何从 Eclipse 内部制作签名和混淆的 android 版本?

如何给eclipse安装jdk

Eclipse中如何查看使用的JDK版本