选择 C++ 部署选项
MATLAB® Compiler SDK™ 提供了以下两种在 C++ 应用程序中部署 MATLAB 函数的方法:
使用 MATLAB Data API (C++11) 部署到 C++ 应用程序
使用
mwArrayAPI (C++03) 部署到 C++ 应用程序
由于 MATLAB Compiler SDK 提供了两个 C++ 应用程序 API 来与已部署的 MATLAB 函数交互,因此两个部署选项根据用于在 C++ 应用程序和已部署的 MATLAB 函数之间交换数据的 API 进行区分。
选择 C++ 部署选项归根结底在于了解每个选项的功能并认识到这些功能如何与您的开发要求相符。这两个选项都提供了一套全面的 API,用于处理应用程序管理和数据操作。
MATLAB Data API for C++ 相对于 MWArray API 的优势
MathWorks® 建议使用更现代的 MATLAB Data API 而不是 mwArray API 来部署到 C++ 应用程序。与 mwArray API 相比,使用 MATLAB Data API 的优势在于:
最大限度地减少了数据复制操作。
您不需要显式地管理 MATLAB 函数的 MATLAB Runtime 实例和库在存档中的生命周期,因为 C++ API 提供了一种故障安全机制来终止它们。
Runtime 实例与 C++ 应用程序可以在同一进程内运行也可以跨不同进程运行,并且部署的 MATLAB 函数可以同步执行也可以异步执行。
支持 C++11 功能、类型安全和多线程安全。
支持 MATLAB 代码中的强类型。
自 R2018a 起,复数数据采用 MATLAB 内部使用的相同交错格式存储,C++ 语言采用的也是这种格式。这样便无需进行内部转换。
生成工件的差异
当您将 MATLAB 函数或类输入到 compiler.build.cppSharedLibrary 函数或 C++ 共享库编译器时,两种部署选项生成的主要产品不同。
假设您有一个名为 calculateDistance 的 MATLAB 函数存储在名为 calculateDistance.m 的文件中,并且您想要在 C++ 应用程序中部署它,让我们来检查一下两种部署方案的结果:
function distance = calculateDistance(p1, p2) % This function calculates the Euclidean distance between two points % Inputs: % p1 - a two-element vector [x, y] % p2 - a two-element vector [x, y] % Output: % distance - the Euclidean distance between p1 and p2 % Use arguments block to map C++ type to corresponding MATLAB type % std::vector<int32_t> <--> (1,2) int32 {mustBeReal} arguments (Input) p1 (1,2) int32 {mustBeReal} p2 (1,2) int32 {mustBeReal} end arguments (Output) distance (1,1) int32 {mustBeReal} end % Calculte Euclidean distance diff = p1 - p2; diffSq = diff.^2; sumSq = sum(diffSq); distance = sqrt(sumSq); end
当您将 calculateDistance.m 文件传递到 compiler.build.cppSharedLibrary 函数时,MATLAB Data API 是默认选择。要使用 mwArray API,您需要使用名称-值对 Interface="mwarray" 明确指定接口类型。
results = compiler.build.cppSharedLibrary("calculateDistance.m",... OutputDir="calcDistMDArray", Verbose="on") | results = compiler.build.cppSharedLibrary("calculateDistance.m",... Interface="mwarray", OutputDir="calcDistmwArray", Verbose="on") |
该函数在指定文件夹中为两个 API 生成相应的文件:
P:\MATLAB\WORK\CALCDISTMDARRAY
│ GettingStarted.html
│ includedSupportPackages.txt
│ mccExcludedFiles.log
│ readme.txt
│ requiredMCRProducts.txt
│ unresolvedSymbols.txt
│
└───v2
└───generic_interface
calculateDistance.ctf
calculateDistancev2.hpp
readme.txt | P:\MATLAB\WORK\CALCDISTMWARRAY
calculateDistance.cpp
calculateDistance.def
calculateDistance.dll
calculateDistance.exp
calculateDistance.exports
calculateDistance.h
calculateDistance.lib
GettingStarted.html
includedSupportPackages.txt
mccExcludedFiles.log
readme.txt
requiredMCRProducts.txt
unresolvedSymbols.txt
No subfolders exist |
当使用 MATLAB Data API 将 MATLAB 代码合并到 C++ 应用程序中时,MATLAB Compiler SDK 不会输出 C++ 共享库文件。当您将 MATLAB 函数或类传递给 compiler.build.cppSharedLibrary 函数或 C++ 共享库编译器时,生成的主要产品是一个代码存档(.ctf 文件)和一个头文件(.hpp 文件)。这种设计为 C++ 开发人员提供了更加简化的界面。
要使用 MATLAB Compiler SDK 从 MATLAB 代码生成 C++ 共享库文件,您必须使用 mwArray API。然而,该 API 运行在较旧的 C++03 标准上,缺少 MATLAB Data API 提供的许多复杂功能。此外,它的数据传输效率较低。
使用 MATLAB Data API 支持强类型
您可以灵活地指示 MATLAB 如何解释和处理 C++ 数据类型。
如果您正在部署 MATLAB 类,请使用 MATLAB 类中的 properties 模块和 arguments 模块。
MATLAB 函数
例如,如果您的 C++ 应用程序使用 int32 数据类型来表示 MATLAB 函数的输入类型,则您可以使用 MATLABarguments 模块来指定相应的类型。最终生成的 MATLAB 代码、相关头文件 (.hpp) 以及 C++ 应用程序代码如下:
% .m file arguments p1 (1,2) int32 {mustBeReal} p2 (1,2) int32 {mustBeReal} end | // .hpp file std::vector<int32_t> p1, std::vector<int32_t> p2) | // .cpp file std::vector<int32_t> p1 = { 0, 0 }; std::vector<int32_t> p2 = { 3, 4 }; |
MATLAB 类
如果您正在部署 MATLAB 类,请在 MATLAB 类中使用 properties 模块和 arguments 模块。
MATLAB 类属性的数据类型映射到特定的 C++ 数据类型。
MATLAB 包目录映射到具有匹配名称的 C++ 命名空间。
MATLAB 类映射到具有匹配名称的 C++ 类。
MATLAB 类的公共方法映射到具有匹配名称的公共 C++ 方法。由于方法名称没有改变,因此可以在 C++ 应用程序代码中按原样使用它们。这些对齐的名称消除了通过
feval函数执行调用类方法的中间层顶层函数的需要。为 MATLAB 类的公共属性生成 C++
get和set方法。MATLAB 类的属性名称以get或set开头。例如,如果 MATLAB 类中的属性名称是UpperLeft,则相应的 C++ 方法名称是getUpperLeft和setUpperLeft。
有关详细信息,请参阅将 MATLAB 类和函数映射到 C++。
另请参阅
compiler.build.cSharedLibrary | arguments