主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

将 C++ 共享库与 mwArray 集成

C++ 共享库包装器

当您使用 MATLAB® Compiler SDK™ 创建 C++ 共享库时,编译器会生成一个包装器文件和一个头文件。头文件包含已编译的 MATLAB 函数的所有入口点。

C++ libmatrix 示例

本页上的示例引用了 C++ 共享库 libmatrix。要创建此库,请完成示例生成 C++ mwArray API 共享库并编译 C++ 应用程序

确保两个文件都在当前文件夹中,然后使用 matrix_mwarray.cpp 编译 mbuild 应用程序。

mbuild matrix_mwarray.cpp libmatrix.lib

注意

由于 C++ 中的名称改编,您必须使用与编译 C++ 共享库相同版本的第三方编译器来编译您的 C++ 应用程序。

C++ 应用程序中的数组

matrix_mwarray.cpp 代码中,数组由 mwArray 类的对象表示。每个 mwArray 类对象都包含一个指向 MATLAB 数组结构的指针。因此,mwArray 对象的属性是 MATLAB 数组属性的超集。每个 MATLAB 数组都包含有关数组的大小和形状(即行数、列数和页数)以及一个或两个数据数组的信息。第一个数组存储数组数据的实部,第二个数组存储虚部。对于没有虚部的数组,第二个数组不存在。数组中的数据按列主序而不是行主序排列。

有关 MATLAB Compiler SDK 如何为链接库使用代理层的信息,请参阅了解 mclmcrrt 代理层

将 C++ 共享库合并到应用程序中

使用 C++ 共享库时需要注意两个主要区别:

  • 接口函数使用 mwArray 类型来传递参量,而不是 C 共享库使用的 mxArray 类型。

  • C++ 异常用于向调用者报告错误。因此,所有调用都必须封装在 try-catch 模块中。

导出函数签名

C++ 共享库目标为每个 MATLAB 函数生成两组接口。有关详细信息,请参阅从 MATLAB 文件生成的函数。导出的 C++ 函数的通用签名如下:

没有返回值的 MATLAB 函数

bool MW_CALL_CONV <function-name>(<const_mwArray_references>); 

具有至少一个返回值的 MATLAB 函数

bool MW_CALL_CONV <function-name>(int <number_of_return_values>,
     <mwArray_references>, <const_mwArray_references>);

在这种情况下,const_mwArray_references 表示以逗号分隔的 const mwArray& 类型的引用列表,而 mwArray_references 表示以逗号分隔的 mwArray& 类型的引用列表。例如,在 libmatrix 库中,MATLAB 函数 addmatrix 的 C++ 接口生成如下:

void addmatrix(int nargout, mwArray& a, const mwArray& a1,  
               const mwArray& a2);

其中 a 是输出参数,a1a2 是输入参数。

通过 varargin 传递给 MATLAB 函数的输入参量必须通过单个 mwArray(即元胞数组)传递。元胞数组中的每个元素都必须构成一个输入参量。通过 varargout 从 MATLAB 函数检索的输出参量必须通过单个 mwArray(即元胞数组)检索。元胞数组中的每个元素将构成一个输出参量。元胞数组中元素的数量将等于 number_of_return_values - 命名输出参数的数量。另请注意,

  • 如果 MATLAB 函数采用 varargin 参量,则必须向 C++ 函数传递与该 mwArray 相对应的 varargin,即使 mwArray 为空。

  • 如果 MATLAB 函数采用 varargout 参量,则必须向 C++ 函数传递与该 mwArray 对应的 varargin,即使 number_of_return_values 设置为命名输出参量的数量,这意味着 varargout 将为空。

  • varargout 参量需要位于任何命名的输出参量之后并在任何输入参量之前。

  • varargin 参量必须是最后一个参量。

错误处理

C++ 接口函数通过抛出 C++ 异常来处理执行期间的错误。为此目的使用 mwException 类。您的应用程序可以捕获 mwExceptions 并查询 what() 方法来获取错误消息。为了在调用 C++ 接口函数时正确处理错误,请将每个调用包装在 try-catch 模块中。

	try
{
		...
		(call function)
		...
}
catch (const mwException& e)
{
		...
		(handle error)
		...
}

matrix_mwarray.cpp 应用程序说明了调用 C++ 接口函数时处理错误的典型方法。

使用 C++ 共享库和稀疏数组

MATLAB Compiler SDK C/C++ API 包含用于处理稀疏数组的静态工厂方法。

有关方法的完整列表,请参阅C++ 实用工具类

另请参阅

主题