主要内容

生成一个c++MATLABData API共享库和构建c++应用程序

支持平台:窗户®, Linux®Mac

这个例子展示了如何从MATLAB创建一个c++共享库®功能。您可以将生成的库集成到c++应用程序中。这个示例还展示了如何从c++应用程序调用c++共享库。目标系统不需要MATLAB的授权副本来运行应用程序。

中创建函数MATLAB

  1. 在MATLAB中,检查您想要打包的MATLAB代码。

    复制矩阵随MATLAB附带到你的工作文件夹的文件夹。

    拷贝文件(fullfile (matlabroot,“外来的”“例子”“compilersdk”“c_cpp”“矩阵”),“矩阵”

    导航到新的矩阵工作文件夹中的子文件夹。

  2. 检查和测试功能addmatrix.mmultiplymatrix.m,eigmatrix.m

  3. 创建调用函数的MATLAB示例代码。示例文件用于用目标语言生成示例应用程序。有关更多信息和限制,请参见驱动程序文件创建示例

    将以下代码保存在一个名为libmatrixSample.m

    演示函数执行的示例脚本% addmatrix, eigmatrix和multiplymatrixA1 = [1 4 7;2 5 8;3 6 9];%在这里初始化a1A2 = a1;在这里初始化a2A = addmatrix(a1, a2);E = eigmatrix(a1);M = multiplymatrix(a1, a2);

    相反,您可以选择在打包步骤中完全不包含示例驱动程序文件。如果创建自己的c++应用程序代码,可以将其移动到适当的目录并使用mbuild对MATLAB函数进行了封装。

使用库编译器App创建一个c++共享库

方法将函数编译到c++共享库中库的编译器或者,如果您想使用编程方法从MATLAB命令窗口创建一个共享库,请参见使用compiler.build.cppSharedLibrary创建c++共享库

  1. MATLAB应用程序标签,在最右边的应用程序部分,单击箭头。在应用程序部署,点击库的编译器

    或者,您可以打开库的编译器在MATLAB命令提示符中输入:

    libraryCompiler

  2. 类型部分,单击c++共享库

    库的编译器app项目窗口,指定要部署的MATLAB应用程序的文件。

    1. 导出功能部分,单击向项目添加导出的功能

    2. 添加文件窗口,浏览到示例文件夹,并选择要打包的函数。点击开放

    该函数被添加到导出的函数文件列表中。重复此步骤,将多个文件打包到同一个应用程序中。

    添加addmatrix.mmultiplymatrix.m,eigmatrix.m添加到主文件列表。

  3. 包装选项部分时,决定是否包含MATLAB运行时安装程序在生成的应用程序中选择其中一个选项:

    • 从web下载运行时-生成一个安装程序,用于下载MATLAB运行时并将其与已部署的MATLAB应用程序一起安装。您可以指定安装程序的文件名。

    • 包中包含的运行时—生成包含MATLAB运行时安装程序。您可以指定安装程序的文件名。

      请注意

      第一次选择此选项时,系统会提示您下载MATLAB运行时安装程序。

指定共享库设置

  1. 库名称字段将自动填充addmatrix作为打包的共享库的名称。重命名为libmatrix.在共享库的实现中始终遵循相同的名称。

  2. 添加MATLAB示例文件libmatrixSample.m您之前创建的。在样品部分中,选择添加现有样本,并选择libmatrixSample.m

    尽管创建共享库不需要示例文件,但您可以将它们作为实现自己的应用程序的指南。

  3. 为生成的c++共享库选择API类型。在API的选择在底部的部分,选择创建使用MATLAB数据API的接口.您也可以将其保留为默认选项以创建两个接口。有关更多信息,请参见c++共享库的API选择

自定义应用程序及其外观

库的编译器应用程序,您可以自定义安装程序,自定义您的应用程序,并添加关于应用程序的更多信息。

  • 图书馆信息—已部署的应用信息。您还可以通过更改应用程序图标和启动画面来定制应用程序的外观。生成的安装程序使用此信息填充已安装的应用程序元数据。看到自定义安装程序

  • 其他安装程序选项-生成的安装程序的默认安装路径和自定义logo选择。看到更换安装路径

  • 运行库所需的文件-生成的应用程序运行所需的附加文件。这些文件包含在生成的应用程序安装程序中。看到在编译器项目中管理所需文件

  • 为最终用户安装的文件-与应用程序一起安装的文件。

    看到指定要与应用程序一起安装的文件

打包应用程序

当您完成选择打包选项时,保存您的库的编译器投影并生成打包的应用程序。

  1. 点击

    在“保存项目”对话框中,指定保存项目的位置。

  2. 对话框,验证一下当进程完成时打开输出文件夹被选中。

    打包过程完成后,检查目标文件夹中生成的输出。

    • 生成三个文件夹:for_redistributionfor_redistribution_files_only,for_testing

      有关在这些文件夹中生成的文件的更多信息,请参见打包MATLAB函数后生成的文件

    • 日志文件PackagingLog.html包含打包结果。

使用创建c++共享库compiler.build.cppSharedLibrary

作为一种替代库的编译器在应用程序中,您可以使用编程方法创建一个c++共享库。方法创建了一个库库的编译器,请参阅用示例应用程序实现c++ MATLAB数据API共享库

  1. 将函数文件列表保存在单元格数组中。

    函数文件= {“addmatrix.m”“multiplymatrix.m”“eigmatrix.m”
  2. 方法构建c++共享库compiler.build.cppSharedLibrary函数。使用名称-值参数指定库名称并添加示例文件。

    buildResults = compiler.build.cppSharedLibrary(函数文件,...“LibraryName”“libmatrix”...“SampleGenerationFiles”“libmatrixSample.m”);

    控件中指定其他选项compiler.build使用名称-值参数命令。详情请参见compiler.build.cppSharedLibrary

    compiler.build.Results对象buildResults包含有关生成类型、生成文件、包含的支持包和生成选项的信息。

  3. 此语法在名为libmatrixcppSharedLibrary在您当前的工作目录中:

    • 样品\ libmatrixSample1_mda.cppc++示例应用程序调用addmatrix函数。

    • 样品\ libmatrixSample2_mda.cppc++示例应用程序调用eigmatrix函数。

    • 样品\ libmatrixSample3_mda.cppc++示例应用程序调用multiplymatrix函数。

    • v2 \ generic_interface \ libmatrix.ctf—包含可部署归档的组件技术文件。

    • v2 \ generic_interface \固定—封装信息的文本文件。

    • GettingStarted.html-包含集成共享库信息的HTML文件。

    • includedSupportPackages.txt-列出库中包含的所有支持文件的文本文件。

    • mccExcludedFiles.log-包含应用程序中未包含的任何工具箱功能列表的日志文件。有关不支持的函数的信息,请参见MATLAB编译器的限制

    • 固定—封装和接口信息的文本文件。

    • requiredMCR2022世界杯八强谁会赢?Products.txt—包含所需产品的产品id的文本文件2022世界杯八强谁会赢?MATLAB运行时运行应用程序。

    • unresolvedSymbols.txt-包含未解析符号信息的文本文件。

    请注意

    生成的库不包括MATLAB运行时或者安装程序。方法创建安装程序buildResults对象,看到compiler.package.installer

实现c++MATLAB数据API与示例应用程序共享库

请注意

要使用调用所有三个函数并处理错误的更高级应用程序调用库,请使用c++应用程序matrix_mda.cpp位于文件夹中

matlabroot\走读生\ \ compilersdk \ c_cpp \矩阵示例
有关更多细节,请参见集成c++共享库与MATLAB数据API

在开始之前,确保你安装和配置MATLAB运行时你有一个安装c++编译器

打包了c++共享库之后,就可以从c++应用程序中调用它们了。生成的c++代码样品文件夹基于您创建的示例MATLAB文件。

  1. 复制并粘贴生成的文件libmatrix.ctfv2 \ generic_interface文件夹中的样品包含libmatrixSample1_mda.cpp

    的程序列表libmatrixSample1_mda.cpp如下所示。

    /*================================================================= * * ADDMATRIXSAMPLE1 *示例驱动代码,使用通用接口和* MATLAB数据API来调用一个c++共享库使用* MATLAB编译器创建的SDK。*参考MATLAB编译器SDK文档获得更多*信息。* *=================================================================*/ // 包括所需的头文件使用的通用/ /接口c++共享库/ / MATLAB编译器生成的SDK。#include "MatlabCppSharedLib.hpp" #include  namespace mc = matlab::cpplib;命名空间md = matlab::data;std::shared_ptr setup(){自动模式= mc::MATLABApplicationMode::IN_PROCESS;//指定MATLAB启动选项std::vector options = {};std::shared_ptr MATLABApplication = mc::initMATLABApplication(mode, options);返回matlabApplication;} int mainFunc(std::shared_ptr app, const int argc, const char * argv[]) {md::ArrayFactory factory; md::TypedArray a1In = factory.createArray({3, 3}, {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0}); md::TypedArray a2In = factory.createArray({3, 3}, {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0}); try { // The path to the CTF (library archive file) passed to // initMATLABLibrary or initMATLABLibraryAsync may be either absolute // or relative. If it is relative, the following will be prepended // to it, in turn, in order to find the CTF: // - the directory named by the environment variable // CPPSHARED_BASE_CTF_PATH, if defined // - the working directory // - the directory where the executable is located // - on Mac, the directory three levels above the directory // where the executable is located // If the CTF is not in one of these locations, do one of the following: // - copy the CTF // - move the CTF // - change the working directory ("cd") to the location of the CTF // - set the environment variable to the location of the CTF // - edit the code to change the path auto lib = mc::initMATLABLibrary(app, u"libmatrix.ctf"); std::vector inputs{a1In, a2In}; auto result = lib->feval(u"addmatrix", 1, inputs); } catch (const std::exception & exc) { std::cerr << exc.what() << std::endl; return -1; } return 0; } // The main routine. On the Mac, the main thread runs the system code, and // user code must be processed by a secondary thread. On other platforms, // the main thread runs both the system code and the user code. int main(const int argc, const char * argv[]) { int ret = 0; try { auto matlabApplication = setup(); ret = mc::runMain(mainFunc, std::move(matlabApplication), argc, argv); // Calling reset() on matlabApplication allows the user to control // when it is destroyed, which automatically cleans up its resources. // Here, the object would go out of scope and be destroyed at the end // of the block anyway, even if reset() were not called. // Whether the matlabApplication object is explicitly or implicitly // destroyed, initMATLABApplication() cannot be called again within // the same process. matlabApplication.reset(); } catch(const std::exception & exc) { std::cerr << exc.what() << std::endl; return -1; } return ret; }
  2. 在MATLAB命令提示符或您的系统命令提示符中,导航到样品复制的文件夹libmatrix.ctf

  3. 使用编译和链接应用程序mbuild在系统命令提示符。

    mbuild libmatrixSample1_mda.cpp
  4. 从系统命令提示符运行应用程序。

    addmatrixSample1_mda.exe

    默认情况下,生成的c++代码不显示任何输出。

  5. (可选)使用编译和链接其他示例c++应用程序mbuild.您还可以使用生成的c++代码作为指南来创建您自己的应用程序。

    有关更多细节,请参见集成c++共享库与MATLAB数据API

请注意

控件中检索和显示结构数组、单元格数组或字符向量的示例函数宏指令打电话,看文件subtractmatrix.m而且subtractmatrix_mda.cpp位于matlabroot\走读生\ \ compilersdk \ c_cpp \矩阵示例

另请参阅

|||

相关的话题

Baidu
map