将 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++ 实用工具类。