将 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
是输出参数,a1
和 a2
是输入参数。
通过 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++ 实用工具类。