生成的共享库MATLAB®编译器SDK™至少包含七个功能。有三个函数来生成管理库初始化和终止,分别打印输出和错误消息和两个生成函数为每个MATLAB文件编译成库。
生成函数描述在本节中,第一个副本sierpinski.m
和triangle.c
创建一个共享库,triangle_legacy.cpp
创建一个c++mwArray
API共享库,或triangle_generic.cpp
MATLAB数据API创建一个c++共享库到你的目录中。文件中发现
。matlabroot
\走读生\ \ compilersdk \ c_cpp例子\三角形
创建一个共享库中解释创建C / c++共享库从命令行。一旦你创建共享库时,执行以下mbuild
命令对应于你的开发平台。这个命令使用C / c++编译器来编译代码和链接对MATLAB的驱动代码生成C / c++共享库。
对于一个C应用程序,使用mbuild三角形。c libmatrix.lib
。
对于C + +mwArray
API应用程序中,使用mbuild triangle_legacy。cpp libtriangle.lib
对于c++ MATLAB数据API的应用程序,使用mbuild matrix_mda。cpp libtriangle.lib
请注意
的. lib
扩展是窗户®。在Mac文件扩展名. dylib
,在UNIX®它是所以
。
这个命令假设C / c++共享库,驱动代码和相应的头文件在当前工作目录。
这些命令创建一个主程序命名三角形
和一个共享库命名libtriangle
。图书馆出口一个函数,使用一个简单的迭代算法(包含在sierpinski.m
)生成的分形称为Sierpinski的三角形。主程序中triangle.c
,triangle_legacy.cpp
,triangle_generic.cpp
可以取一个数值参数,如果存在,用于生成指定数量的点分形。例如,三角形8000
生成一个图以8000分。
在这个例子中,MATLAB编译器SDK将所有生成的功能生成的文件libtriangle.c
或libtriangle.cpp
。
所有的程序调用MATLAB编译器SDK生成共享库有大致相同的结构:
声明变量和过程/验证输入参数。
调用mclInitializeApplication
和测试成功。这个函数设置全局的MATLAB运行时国家和支持的建设MATLAB运行时实例。
称,一旦为每个库,< libraryname >初始化
,创建MATLAB运行时实例所需的库。
调用函数在图书馆,并处理结果。(这是程序的主体)。
称,一旦为每个库,< libraryname >终止
破坏相关MATLAB运行时。
调用mclTerminateApplication
随着全球的免费资源联系起来MATLAB运行时状态。
清理变量,关闭文件等,并退出。
在一个实际的例子,看到这些步骤审查主程序在这个例子中,triangle.c
。
库初始化和终止功能创建和销毁,分别MATLAB运行时实例所需的共享库。前你必须调用初始化函数调用任何其他功能的共享库,你应该调用终止函数完成后打电话到共享库(或者你内存泄露风险)。
有两种形式的初始化函数和一种类型的终止功能。简单的两个初始化函数不带参数;很可能这是您的应用程序将调用的版本。在这个例子中,这种形式的初始化函数libtriangleInitialize
。
bool libtriangleInitialize(空白)
这个函数创建一个MATLAB运行时实例使用默认打印和错误处理程序,和其他信息在编译过程中生成的。
然而,如果你想要更多的控制打印输出和错误消息的处理方式,你可以叫第二种形式的函数,它有两个参数。
bool libtriangleInitializeWithHandlers (mclOutputHandlerFcn error_handler, mclOutputHandlerFcn print_handler)
通过调用这个函数,您可以提供自己的版本的打印和错误处理例程调用MATLAB运行时。这些例程具有相同的签名(完整的详细信息,请参阅打印和错误处理功能)。通过覆盖默认值,您可以控制如何显示输出,例如,是否进入一个日志文件中。
请注意
在调用两种库初始化例程之前,您必须首先调用mclInitializeApplication
建立全球MATLAB运行时状态。看到调用C共享库为更多的信息。
在微软®Windows平台上,MATLAB编译器SDK生成一个额外的初始化函数,标准的微软DLL的初始化函数开始时
。
BOOL WINAPI开始(实例句柄实例句柄,DWORD dwReason, void * pv)
生成的开始时
执行一个非常重要的服务;它位于目录共享库是存储在磁盘上。这些信息是用来发现部署归档文件,没有应用程序不会运行。如果你修改生成的开始时
(不推荐),确保你保持这部分的功能。
图书馆终止很简单。
空白libtriangleTerminate(空白)
调用这个函数调用之前(曾经为每个库)mclTerminateApplication
。
默认情况下,MATLAB编译器SDK生成的应用程序和共享库发送打印输出到标准输出和标准错误的错误消息。MATLAB编译器SDK生成一个默认的打印处理器和一个默认的错误处理程序,实施这一政策。如果你想改变这种行为,您必须编写自己的错误和打印处理程序并将它们传递给适当的初始化函数生成。
你可以替换,两种或两种功能。的MATLAB运行时发送所有定期通过打印输出处理程序和错误输出错误处理程序。因此,如果你重新定义这些函数,MATLAB运行时将使用你的版本的函数的输出分为类的调用处理程序。
默认的打印处理器需要以下表格。
静态int mclDefaultPrintHandler (const char *)
实现简单;它接受一个字符串,输出标准输出,并返回打印的字符数量。如果你重写这个函数或更换,你的版本还必须采取一个字符串并返回的字符数”处理。“MATLAB运行时调用处理程序执行时MATLAB文件打印请求打印输出,例如,通过MATLAB函数disp
。打印处理器不终止输出回车或换行。
默认的错误处理程序具有相同的形式打印处理程序。
静态int mclDefaultErrorHandler (const char *)
然而,打印的默认实现处理程序略有不同。它将输出发送到标准错误输出流,但如果字符串不以回车结束,错误处理程序添加一个。如果替换默认的错误处理程序与一个你自己的,你也应该执行此检查,或者一些打印错误消息MATLAB运行时将不会被正确格式化。
谨慎
错误处理程序,尽管它的名字,不处理实际的错误,而是产生的消息后,内部的错误被发现和处理MATLAB运行时。你不能使用这个函数来修改错误处理的行为MATLAB运行时——使用试一试
和抓
语句在MATLAB文件如果你想如何控制MATLAB编译器SDK生成的应用程序响应一个错误条件。
请注意
如果您提供备用的c++实现mclDefaultPrintHandler
或mclDefaultErrorHandler
必须声明,那么函数外来的“C”
。例如:
外来的“C”int myPrintHandler (const char * s);
对于每一个MATLAB文件中指定MATLAB编译器SDK命令行,产品两个函数生成,mlx
函数和mlf
函数。这些生成的函数执行相同的动作(调用MATLAB文件函数)。这两个函数有不同的名称,不同的接口。每个函数的名称是基于MATLAB文件中的第一个函数的名称(sierpinski
在这个例子中);每个函数从不同的三个字母前缀开始。
请注意
对于C共享库,MATLAB编译器SDK生成mlx
和mlf
本节中描述的功能。对于c++共享库,生成产品mlx
为C函数的方式来共享库。然而,产品生成一个修改mlf
与这些差异函数:
的mlf
函数名前降至与R13保持兼容性。
函数的参数mwArray
而不是mxArray
。
始于前缀的函数mlx
有相同的类型和数量的参数作为一个MATLAB MEX-function。(参见MEX-functions的外部接口文档以了解更多详情。)第一个参数,nlhs
是输出参数的数量,第二个参数,plhs
是一个指针数组,函数将返回值的请求数量。(“韩
“在这些参数名称是“左边”——MATLAB表达式的输出变量赋值运算符的左边)。第三个和第四个参数的输入和包含输入变量的数组。
空白mlxSierpinski (int nlhs mxArray * plhs [], int nrhs, mxArray * prhs [])
第二次生成的功能从前缀开始mlf
。这个函数将其输入和输出参数传入作为单独的变量,而不是打包成数组。如果能产生一个或多个输出函数,第一个参数是输出的数量要求调用者。
空白mlfSierpinski (int nargout mxArray * * x, mxArray * * y, mxArray *迭代,mxArray *画)
在这两种情况下,生成的函数的返回值分配内存。如果你不删除该内存(通过mxDestroyArray
)当你完成了输出变量,你的程序会泄漏内存。
这些函数的程序可以调用哪个更方便,因为他们都以相同的方式调用MATLAB文件函数。大多数程序可能会调用mlf
函数的形式来避免管理所需的额外的数组mlx
的形式。的示例程序triangle.c
调用mlfSierpinski
。
mlfSierpinski (2 x, y,迭代,画);
在这个调用,调用者请求两个输出参数,x
和y
,并提供了两个输入,迭代
和画
。
如果你通过一个输出变量mlf
函数不空,mlf
函数将尝试免费使用mxDestroyArray
。这意味着您可以重用连续调用的输出变量mlf
功能,而不用担心内存泄漏。这也意味着你必须通过零
有效的MATLAB对所有输出变量数组或您的程序将会失败,因为内存管理器不能区分non-initialized数组指针和一个有效的数组(无效)。它将尝试自由不是NULL指针——释放一个无效的指针通常导致段错误或类似的致命错误。
如果你的MATLAB函数接口使用变长度输入宗量
或varargout
,你必须通过细胞阵列。例如,如果你有N
变长度输入宗量
年代,您需要创建一个细胞大小的数组1)×(n
。同样的,varargout
s是返回一个单元阵列。的长度varargout
等于返回值的函数调用中指定的数量减去实际变量的数量。在MATLAB软件,细胞数组表示varagout
必须是最后一个返回变量(变量前第一个输入变量)和细胞数组代表变长度输入宗量
年代已经是最后一次正式的参数到函数调用。
创建单元格数组的信息,指的是C墨西哥人函数接口的外部接口文档。
例如,考虑这个MATLAB文件接口:
[a, b, varargout] = myfun (x, y, z,变长度输入宗量)
这是相应的C接口
空白mlfMyfun (int numOfRetVars mxArray * *, mxArray * * b, mxArray * * varargout, mxArray * x, mxArray * y, mxArray * z, mxArray *变长度输入宗量)
在这个例子中,元素的数量varargout
是(numOfRetVars - 2)
,在那里2
代表了两个变量,一个
和b
,被返回。这两个变长度输入宗量
和varargout
是单身行,多个列细胞阵列。
谨慎
c++共享库接口不支持金宝app变长度输入宗量
零(0)输入参数。调用程序使用一个空mwArray
结果在打包库接收一个空数组输入参数个数= 1
。C共享库接口允许您调用mlfFOO(空)
(打包的MATLAB代码解释这个输入参数个数= 0
)。然而,调用FOO ((mwArray)零)
与c++共享库接口导致封装MATLAB代码看到一个空数组作为第一个输入和解释输入参数个数= 1
。
例如,一些MATLAB代码打包为一个c++共享库变长度输入宗量
MATLAB函数的输入参数列表。MATLAB代码显示的变量输入参数个数
。调用库函数
和它不会包,产生这个错误信息:喷火
()
…”喷火”:函数不需要0参数
mwArray垃圾;喷火(垃圾);
喷火((mwArray)零);
输入参数个数= 1
。在MATLAB中,喷火
()
是输入参数个数= 0
和FOO ([])
是输入参数个数= 1
。
c++接口MATLAB使用变长度输入宗量和varargout功能。c++mlx
界面MATLAB函数不会改变,即使函数使用变长度输入宗量
或varargout
。然而,c++函数接口(第二组函数)的变化,如果使用MATLAB函数变长度输入宗量
或varargout
。
为例子,查看各种MATLAB函数签名的生成的代码使用变长度输入宗量
或varargout
。
请注意
为简单起见,只有相关部分生成的c++函数签名下面的例子所示。
函数varargout = foo (i1、i2变长度输入宗量)
使用共享库时,您可以调用函数来检索特定的信息MATLAB运行时状态。有关详细信息,请参见共享库的设置和检索MATLAB运行时数据。