使用 MATLAB Data API 将 MATLAB 类部署到 C++ 应用程序
此示例说明如何打包 MATLAB® 包中包含的 MATLAB 类并将其部署到 C++ 应用程序。它使用 MATLAB Data API 来管理 MATLAB 代码和 C++ 应用程序之间的数据交换。MATLAB 类可通过前端的 MATLAB 函数访问。该工作流支持 Windows®、Linux® 和 macOS。
前提条件
创建一个对 MATLAB 搜索路径可见的新工作文件夹。此示例使用名为
work的文件夹。验证您是否已设置 C++ 开发环境。有关详细信息,请参阅设置 C++开发环境。本示例使用 MATLAB 作为 C++ 开发环境。因此,通过在 MATLAB 命令提示符下键入
mbuild -setup C++来验证您是否已安装 C++ 编译器。验证您是否已满足所有 MATLAB Compiler SDK™ C++ 目标要求。有关详细信息,请参阅MATLABCompiler SDK C++ 目标要求。
最终用户必须安装 MATLAB Runtime 才能运行应用程序。有关详细信息,请参阅下载并安装 MATLAB Runtime。
出于测试目的,您可以在运行 C++ 应用程序时使用 MATLAB 安装而不是 MATLAB Runtime。
文件
示例文件的位置
| 示例文件 |
|
每个示例文件的用途
| 文件 | 目的 |
|---|---|
+shapes | 包含两个类的包:MyPosition.m 和 MyRectangle.m。 |
MyPosition.m | +shapes 包中的类接受一个点的 X 和 Y 坐标并创建一个 MyPosition 对象。 |
MyRectangle.m | +shapes 包中的类接受指定为 MyPosition 对象的两个点并创建一个 MyRectangle 对象。 |
calculatearea.m | 接受 MyRectangle 对象作为输入并计算矩形面积的函数。 |
shapes_mda.cpp | 集成了打包 MATLAB 代码生成的代码存档(.ctf 文件)头文件(.hpp 文件)的 C++ 应用程序代码。 |
将示例文件复制到当前工作文件夹。
appDir = fullfile(matlabroot,'extern','examples','compilersdk','c_cpp','strongly_typed'); copyfile(appDir)
创建 MATLAB 函数和类
检查
MyPosition.m、MyRectangle.m和calculatearea.m的代码。+shapes包包含两个 MATLAB 类:MyPosition.m和MyRectangle.m。位于
calculatearea.m包之外的+shapesMATLAB 函数接受MyRectangle对象作为输入并计算矩形的面积。
资深 MATLAB 用户可能会发现,在类中看到
properties模块,在方法或函数中看到arguments模块,并且每个块都详细记录数据类型信息,这是很不寻常的。这两个模块都允许您用等效的 MATLAB 类型表示 C++ 数据类型。例如,如果您的 C++ 应用程序采用double数据类型来表示一个值,那么您现在可以在 MATLAB 中将其表示为double。您还可以将 MATLAB 对象指定为参量或属性类型。例如,MyRectangle类将shapes.MyPosition指定为其UpperLeft和LowerRight属性的MyRectangle。当 C++ 应用程序具有严格的类型要求时,这个指定类型的选项很有用。有关详细信息,请参阅C++ 和强类型 MATLAB 代码之间的数据类型映射。在此示例中,具有数据类型信息的
properties和arguments模块用于阐明细微的差别。但是,请记住,包含类型信息完全是可选的。即使没有它,部署过程仍然保持不变。这个示例的各个部分强调了这种差异的体现方面。因此,如果数据类型在您的部署中并不重要,则不需要指定类型信息。使用以下代码创建一个名为
runshapes.m的 MATLAB 脚本,并在 MATLAB 命令提示符下执行它。该脚本说明了类和函数如何交互以生成输出。runshapes
Rectangle 1 Point 1 = (10.000000,5.000000) Point 2 = (50.000000,20.000000) Rectangle (10.000000,5.000000) -> (50.000000,20.000000) Rectangle 2 Point 1 = (0.000000,-5.000000) Point 2 = (60.000000,30.000000) Rectangle (0.000000,-5.000000) -> (60.000000,30.000000) Area of rectangle r1 = 600 Area of rectangle r2 = 2100
使用 compiler.build.cppSharedLibrary 创建 C++ 共享库
使用 compiler.build.cppSharedLibrary 函数从 MATLAB 函数和类创建代码存档(.ctf 文件)和标头(.hpp 文件)。
files = ["calculatearea.m", "+shapes"]; buildResults = compiler.build.cppSharedLibrary(files, OutputDir="output", LibraryName="libshapes", Verbose="on")
该函数在您当前工作目录中名为 output 的文件夹中生成以下文件。
P:\MATLAB\WORK\OUTPUT
│ GettingStarted.html
│ includedSupportPackages.txt
│ mccExcludedFiles.log
│ readme.txt
│ requiredMCRProducts.txt
│ unresolvedSymbols.txt
│
└───v2
└───generic_interface
libshapes.ctf
libshapesv2.hpp
readme.txt为了完成集成,您需要来自 libshapes.ctf 文件夹的 libshapesv2.hpp 代码存档文件和 generic_interface 头文件。您可以在此处查看头文件:
有关 MATLAB 类和函数在头文件中如何映射到 C++ 的详细讨论,请参阅将 MATLAB 类和函数映射到 C++。
有关数据类型映射的详细信息,请参阅C++ 和强类型 MATLAB 代码之间的数据类型映射。
将 MATLAB 代码存档集成到 C++ 应用程序中
您可以在首选的 C++ 开发环境中完成集成过程,包括 MATLAB 或 Windows 上的 Microsoft® Visual Studio® 等替代方案。但是,此示例使用 MATLAB 作为 C++ 开发环境。有关详细信息,请参阅设置 C++开发环境。
要将生成的 MATLAB 代码存档(.ctf 文件)和头文件(.hpp 文件)集成到 C++ 应用程序中,请遵循以下准则:
使用
#include指令将生成的头文件(.hpp文件)合并到您的 C++ 应用程序代码中。确保代码存档(
.ctf文件)位于 C++ 可执行文件可以访问的位置。
完成集成步骤需要熟练的 C++ 技能来编写应用程序代码。编写自己的应用程序时,可以使用以下示例 C++ 应用程序代码作为指南。
在本示例的工作文件夹中,创建一个名为
shapes_mda.cpp的新文件,其中包含以下代码:通过在 MATLAB 命令提示符下执行
mbuild函数来编译和链接应用程序。mbuild -v shapes_mda.cpp -outdir output\bin
处理代码存档(.ctf 文件)
为确保您的 C++ 应用程序可以访问包含 MATLAB 代码的代码存档(.ctf 文件),请将该文件放置在可执行文件可访问的位置。对于这个示例,我们将通过在 MATLAB 桌面环境中设置 CPPSHARED_BASE_CTF_PATH 环境变量来实现这一点。
setenv("CPPSHARED_BASE_CTF_PATH","P:\MATLAB\work\strongly_typed\output\v2\generic_interface")
如果您使用的是 Visual Studio,请参阅在 Visual Studio 中设置环境变量。
有关代码存档(.ctf 文件)放置选项的完整列表,请参阅代码存档(.ctf 文件)的放置。
运行 C++ 应用程序
为了测试目的,您可以从 MATLAB 命令提示符运行该应用程序。这不需要安装 MATLAB Runtime。
!output\bin\shapes_mda.exeRectangle 1 Point (10.000000, 5.000000) Point (50.000000, 20.000000) Rectangle (10.000000, 5.000000) -> (50.000000, 20.000000) Area of rectangle r1 = 600 Rectangle 2 Point (0.000000, -5.000000) Point (60.000000, 30.000000) Rectangle (0.000000, -5.000000) -> (60.000000, 30.000000) Area of rectangle r2 = 2100
