主要内容

与mwArray集成c++共享库

c++共享库包装器

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

c++libmatrix例子

本页上的示例引用了c++共享库libmatrix.要创建这个库,请完成示例生成一个c++ mwArray API共享库并构建一个c++应用程序

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

mbuildmatrix_mwarray.cpplibmatrix.lib

请注意

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

c++应用程序中的数组

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

谨慎

避免发行cd从c++应用程序的命令调用mclInitializeApplication.如果不这样做,可能会导致失败MATLAB运行时初始化。

有关如何MATLAB编译器SDK为链接库使用代理层,请参见理解mclmcrrt代理层

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

在使用c++共享库时,有两个主要的区别需要注意:

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

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

导出功能签名

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

MATLAB没有返回值的函数

bool MW_CALL_CONV <函数名const_mwArray_references>);

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

bool MW_CALL_CONV <函数名>(int mwArray_references>, <const_mwArray_references>);

在这种情况下,const_mwArray_references表示类型引用的逗号分隔列表const mwArray&而且mwArray_references表示类型引用的逗号分隔列表mwArray&.例如,在libmatrix的c++接口addmatrixMATLAB函数生成为:

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

在哪里一个输出参数和a1而且a2是输入参数。

输入参数传递给MATLAB函数通过变长度输入宗量一定要通过单人间传递mwArray这是一个单元格数组。单元格数组中的每个元素都必须构成一个输入参数。输出参数检索从MATLAB函数通过varargout必须通过单一检索mwArray这是一个单元格数组。单元格数组中的每个元素都将构成一个输出参数。单元格数组中的元素数将等于number_of_return_values-已命名输出参数的个数。还要注意,

  • 如果MATLAB函数取a变长度输入宗量参数时,c++函数必须传入mwArray与此相对应变长度输入宗量,即使mwArray是空的。

  • 如果MATLAB函数取avarargout参数时,c++函数必须传入mwArray与此相对应变长度输入宗量即使number_of_return_values设置为已命名输出参数的数量,这意味着varargout将是空的。

  • varargout参数需要在任何命名的输出参数之后和任何输入参数之前。

  • 变长度输入宗量参数必须是最后一个参数。

错误处理

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

试试{…(调用函数)…} catch (const mwException& e){…(处理错误)…}

matrix_mwarray.cppapplication演示了调用c++接口函数时处理错误的典型方法。

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

MATLAB编译器SDKC/ c++ API包括用于处理稀疏数组的静态工厂方法。

有关方法的完整列表,请参见c++实用程序类

相关的话题