主要内容

包生成的代码作为共享库

如果你有一个嵌入式编码器®许可,可以包从模型中生成的源代码组件,便于分配和共享使用通过构建代码共享library窗口®动态链接库(. dllUNIX),®共享对象(所以),或Macintosh OS X动态库(. dylib)。你或者其他人可以将共享库集成到一个应用程序,该应用程序可以运行在Windows、UNIX或Macintosh OS X开发计算机。生成的. dll,所以,或. dylib文件在不同的应用程序之间共享和升级,而无需重新编译的应用程序使用它。

关于生成共享库

您构建一个共享库通过配置代码生成器使用系统目标文件ert_shrlib.tlc。代码生成的目标文件系统出口:

  • 变量和类型的信号ExportedGlobal作为数据

  • 实时模型结构(模型_M)作为数据

  • 函数执行您的模型代码的关键

查看列表包含在生成的共享库的符号:

  • 在Windows上,使用依赖沃克工具,可下载https://www.dependencywalker.com

  • 在UNIX上,使用nm - d模型所以

  • Macintosh OS X,使用nm - g模型. dylib

生成和使用共享库:

  1. 生成一个模型代码的共享库版本

  2. 创建应用程序代码来加载和使用共享库文件

生成共享库版本的模型代码

生成共享库版本的模型代码:

  1. 打开你的模型和配置使用ert_shrlib.tlc系统目标文件。

    选择ert_shrlib.tlc系统目标文件使构建过程生成共享库版本的模型代码到您的当前工作目录。选择不改变代码生成器生成的代码为您的模型。

  2. 构建的模型。

  3. 构建完成后,检查生成的代码模型中的子文件夹和检查. dll,所以,或. dylib文件在当前文件夹。

创建应用程序代码使用共享库

为了演示应用程序代码可以加载共享库文件和访问其功能和数据,MathWorks提供了模型rtwdemo_shrlib

请注意

导航到一个可写的工作文件夹之前运行rtwdemo_shrlib脚本。

在模型中,点击蓝色按钮来运行一个脚本。脚本:

  1. 从模型构建一个共享库文件(例如,rtwdemo_shrlib_win64.dll在64位Windows)。

  2. 编译和链接一个示例应用程序,rtwdemo_shrlib_app加载和使用共享库文件。

  3. 执行示例应用程序。

提示

显式链接是首选的可移植性。然而,在Windows系统上,ert_shrlib系统目标文件生成和保留. lib文件支持隐式链接金宝app。

使用隐式链接,生成的头文件需要一个小的修改对你使用它生成的C文件。例如,如果您正在使用Visual c++®,声明使用__declspec (dllimport)前面的数据导入的隐式共享库文件。

模型使用以下示例应用程序文件,位于文件夹matlabroot/工具箱/ rtw / rtwdemos / shrlib_demo(开放)。

文件 描述
rtwdemo_shrlib_app.h 示例应用程序头文件
rtwdemo_shrlib_app.c 示例应用程序,加载和使用共享库文件生成的模型
run_rtwdemo_shrlib_app.m 脚本编译、链接和执行示例应用程序

您可以查看这些文件在模型窗口中点击白色按钮。此外,地方相关的来源和生成的代码运行脚本文件在当前文件夹。这些文件可以用作模板编写应用程序代码为自己的ERT共享库文件。

以下部分关键示例应用程序文件的摘录。

示例应用程序头文件

头文件的示例应用程序rtwdemo_shrlib_app.h包含模型的类型声明的外部输入和输出。

的ifndef _APP_MAIN_HEADER_ # define _APP_MAIN_HEADER_ typedef struct {int32_T输入;}ExternalInputs_rtwdemo_shrlib;typedef struct {int32_T输出;}ExternalOutputs_rtwdemo_shrlib;# endif / * _APP_MAIN_HEADER_ * /

示例应用程序的C代码

示例应用程序rtwdemo_shrlib_app.c包括以下代码动态地加载共享库文件。注意,根据平台不同,代码调用Windows或UNIX库命令。

#如果(定义(_WIN32) | | (_WIN64)定义)/ * * / # include <视窗。h > # define GETSYMBOLADDR GetProcAddress # define LOADLIB LoadLibrary # define CLOSELIB FreeLibrary #其他UNIX / * * / # include < dlfcn。h > # define GETSYMBOLADDR dlsym # define LOADLIB dlopen # define CLOSELIB dlclose # endif int主要(){void * handleLib;…#如果定义(_WIN64) handleLib = LOADLIB (“。/ rtwdemo_shrlib_win64.dll”);# #如果定义(_WIN32) handleLib = LOADLIB (“。/ rtwdemo_shrlib_win32.dll”);#其他UNIX / * * / handleLib = LOADLIB (“。/ rtwdemo_shrlib。所以“RTLD_LAZY);# endif # endif……返回(CLOSELIB (handleLib));}

下面的代码片段显示了C应用程序如何访问模型的导出的数据和功能。注意添加用户定义的初始化的钩子,一步,终止代码。

int32_T我;…空白(* mdl_initialize) (boolean_T);空白(* mdl_step)(空白);空白(* mdl_terminate)(空白);ExternalInputs_rtwdemo_shrlib (* mdl_Uptr);ExternalOutputs_rtwdemo_shrlib (* mdl_Yptr);uint8_T (* sum_outptr);…#如果(定义(LCCDLL) | | (BORLANDCDLL)定义)/ *导出符号包含前导下划线当DLL与LCC或BORLANDC * / mdl_initialize =(空白(*)(boolean_T)) GETSYMBOLADDR (handleLib“_rtwdemo_shrlib_initialize”); mdl_step =(void(*)(void))GETSYMBOLADDR(handleLib , "_rtwdemo_shrlib_step"); mdl_terminate =(void(*)(void))GETSYMBOLADDR(handleLib , "_rtwdemo_shrlib_terminate"); mdl_Uptr =(ExternalInputs_rtwdemo_shrlib*)GETSYMBOLADDR(handleLib , "_rtwdemo_shrlib_U"); mdl_Yptr =(ExternalOutputs_rtwdemo_shrlib*)GETSYMBOLADDR(handleLib , "_rtwdemo_shrlib_Y"); sum_outptr =(uint8_T*)GETSYMBOLADDR(handleLib , "_sum_out"); #else mdl_initialize =(void(*)(boolean_T))GETSYMBOLADDR(handleLib , "rtwdemo_shrlib_initialize"); mdl_step =(void(*)(void))GETSYMBOLADDR(handleLib , "rtwdemo_shrlib_step"); mdl_terminate =(void(*)(void))GETSYMBOLADDR(handleLib , "rtwdemo_shrlib_terminate"); mdl_Uptr =(ExternalInputs_rtwdemo_shrlib*)GETSYMBOLADDR(handleLib , "rtwdemo_shrlib_U"); mdl_Yptr =(ExternalOutputs_rtwdemo_shrlib*)GETSYMBOLADDR(handleLib , "rtwdemo_shrlib_Y"); sum_outptr =(uint8_T*)GETSYMBOLADDR(handleLib , "sum_out"); #endif if ((mdl_initialize && mdl_step && mdl_terminate && mdl_Uptr && mdl_Yptr && sum_outptr)) { /* === user application initialization function === */ mdl_initialize(1); /* insert other user defined application initialization code here */ /* === user application step function === */ for(i=0;i<=12;i++){ mdl_Uptr->Input = i; mdl_step(); printf("Counter out(sum_out): %d\tAmplifier in(Input): %d\tout(Output): %d\n", *sum_outptr, i, mdl_Yptr->Output); /* insert other user defined application step function code here */ } /* === user application terminate function === */ mdl_terminate(); /* insert other user defined application termination code here */ } else { printf("Cannot locate the specified reference(s) in the shared library.\n"); return(-1); }

示例应用程序的脚本

应用程序的脚本run_rtwdemo_shrlib_app加载和重建模型,然后编译,链接,并执行模型的共享库目标文件。您可以查看脚本打开源文件rtwdemo_shrlib并点击一个白色按钮查看源代码。脚本结构与平台相关的命令特征向量进行编译,连接,和执行可能适用于您的开发环境。要运行此脚本,点击蓝色按钮。

请注意

运行run_rtwdemo_shrlib_app没有第一次打开脚本rtwdemo_shrlib模型中,导航到一个可写的工作文件夹并发出以下MATLAB®命令:

目录(fullfile (matlabroot,“工具箱”,“环球套票”、“rtwdemos”,“shrlib_demo”))

请注意

它是无效的调用终止函数连续两次。终止函数清除指针和将它们设置为NULL。第二次调用函数取消引用空指针,导致项目失败。

共享库的局限性

以下限制适用于构建共享库:

  • 代码生成的ert_shrlib.tlc系统目标文件出口以下数据:

    • 变量和类型的信号ExportedGlobal

    • 实时模型结构(模型_M)

  • 对于一个模型,该模型包含了一个函数调用子系统,代码生成的ert_shrlib.tlc系统目标文件共享库的出口只有符号相关的初始化和终止入口点函数。

  • 代码生成的ert_shrlib.tlc系统目标文件支持C语言(c++)。金宝app当您选择ert_shrlib.tlc、模型配置参数语言是灰色的。

  • 重建模型模拟使用生成共享库,应用作者之间的时间必须保持系统和共享库函数调用在最初的应用程序。时间需要一致,这样你就可以比较模拟和整合的结果。额外的模拟考虑应用如果从一个模型,使模型生成共享库配置参数金宝app支持:连续时间单输出/更新功能。有关更多信息,请参见单输出/更新功能依赖关系。

相关的话题