C++ MEX 和 C MEX 的区别

Posted

技术标签:

【中文标题】C++ MEX 和 C MEX 的区别【英文标题】:Difference between C++ MEX and C MEX 【发布时间】:2018-05-22 12:59:32 【问题描述】:

我用 C++ 编写了一个带有服务器和客户端的 TCPIP-Socket-Connection,它在 VisualStudio 中工作得很好。现在我想通过 MEX 文件在 MATLAB/Simulink 中使用 C++ - 客户端,然后在 S-Function 中使用。 我发现了两个关于 MEX-Files 的描述。

    C++ MEX File Application 仅适用于 C++ C/C++ MEX FilesC/C++

现在我很困惑,该拿哪一个。我用第二个写了一些简单的程序,但总是遇到数据类型的问题。我认为,这是因为给定的示例和函数仅适用于 C 而不是 C++。

感谢您的帮助!非常感谢!

【问题讨论】:

取决于你想要 C 还是 C++,没有其他谜团。请注意,它与 MATLAB 基本相同。您可以只使用 C++,也可以使用 C/C++ 或更多类似 C 的代码。 我没用过C。我想用C++。是否可以同时使用两者来编写c++? 是的,C++ 支持几乎所有的 C 代码。 请注意,C 接口不需要 C 编译器。这与调用函数的方式有关。在 C++ 中,您可以在函数声明中使用 extern C 来告诉编译器调用函数,就好像它是 C 函数一样。您也可以使用许多其他编程语言的 C 接口。 "... 你可以在函数声明中使用 extern C 来告诉编译器调用一个函数,就好像它是一个 C 函数..." 注意这是已经在 mex.h 等头文件中为您完成。您不必手动将其添加到您的 mex 源代码中。 【参考方案1】:

区别:

    in the second link 中描述的 C 接口非常古老(我早在 1998 年就使用过这个接口)。您可以使用此接口创建一个 MEX 文件,并让它在大量不同版本的 MATLAB 上运行。您可以在 C 和 C++ 代码中使用它。

    in the first link 中描述的纯 C++ 接口是 MATLAB R2018a 中的新功能(用于操作 MATLAB 数组的 C++ 类是在 R2017b 中引入的,但编写 MEX 文件的功能是 R2018a 中的新功能)。您使用此接口编写的 MEX 文件将无法在早期版本的 MATLAB 上运行。

    此外,这个接口(终于!)允许创建共享数据副本、就地操作等(我们多年来一直要求的东西,但他们不想放入旧的 C接口,因为他们担心它对于普通的 MEX 文件编写器来说太复杂了)。

另一个需要注意的变化:

在 R2018a 中,MATLAB 还改变了复数数组在内存中的存储方式。在旧版本的 MATLAB 中,实部和虚部存储在单独的内存块中。在 R2018a 及更高版本中,它们以您可能在自己的代码中使用的相同方式存储在同一个内存块中。

This affects MEX-files!如果您的 MEX 文件使用复杂数据,则需要以 MATLAB 存储它们的方式读取和写入它们。如果您运行为旧版 MATLAB 编译的 MEX 文件,或使用 R2018a 中的当前默认构建选项编译 MEX 文件,则复杂数组将在传递到 MEX 文件之前复制到旧存储模型。 mex 命令的一个新编译选项-R2018a 创建了在新存储模型中传递数据不变的 MEX 文件。但这些 MEX 文件将与以前版本的 MATLAB 不兼容。

如何选择?

如果您需要 MEX 文件在最新 R2018a 之前的 MATLAB 版本上运行,请使用旧的 C 接口,您别无选择。

如果你想用 C 语言编程,请使用旧的 C 接口。

如果您需要使用复杂的数据,并且不想产生复制成本,则需要分别针对 R2018a 及更高版本和 R2017b 及更早版本。您需要为这两个“平台”编写单独的代码。旧版本只能以 C 接口为目标。对于较新的版本,您可以使用任一界面。

如果您欣赏现代 C++ 的优势并希望利用它们,并且只针对最新最好的 MATLAB 版本,请使用新的 C++ 接口。我还没有尝试过,但从文档来看,它的设计非常好。

【讨论】:

使用旧的 C 接口,您只能使用未记录的功能来制作共享数据副本。此功能已在 R2018a 中删除,因此使用它的代码不再有效。请参阅this question on MATLAB Answers 了解更多信息。 非常感谢!我必须使用旧版本,所以我将选择第二个链接。 需要明确的是,已在 C/C++ mex 例程中使用的未记录的 mxCreateSharedDataCopy( ) 函数仍然存在于库中。只是 mex 命令在 -R2018a 模型中故意禁用与他们链接的用户。有一些方法可以解决这个问题,但是您必须再次求助于将来可能会崩溃的黑客。新的 C++ 接口(我还没有使用过)有意隐藏了所有共享数据的东西,因此它在 m 文件级别像普通的 MATLAB 变量一样运行。很好,但它确实使用户无法直接控制他们的数据副本。 而且,我要补充一点,仍然似乎没有用于确定变量共享状态的检查方法(isaSharedDataCopy、isaReferenceCopy 等)。因此,从程序员的角度来看,仍然不可能确定某个操作何时会或不会导致深度数据复制。这仍然是 API 的最大缺点之一,无论是旧的还是新的。您仍然需要借助 hack 来了解共享状态,即使 hack 也不是 100% 可靠的。

以上是关于C++ MEX 和 C MEX 的区别的主要内容,如果未能解决你的问题,请参考以下文章

将 C++ MEX 文件中的值返回到 MATLAB

使用带有 MEX Wrapper 的辅助 C 文件从 MATLAB 2016 调用 C++ 代码时遇到问题

如何在 C++ 中使用 mex.h

是否可以将 mex 代码转换为 C++ 代码?

尝试编译 MEX 文件时缺少 libkernel32

从 Matlab 调用的 Mex 函数和数值差异