将一个 <anothername>.m的matlab文件通过 mcc -W lib:<name> <anothername>.m 编译后生成如下文件:
mccExcludedFiles.log
<name>.exports
readme.txt
<name>.c
<name>.h
<name>.obj
<name>.dll
其中,
mccExcludedFiles.log存放着一个函数列表,提示.M文件中用到了那些工具箱函数却没有包含在CTF文件中,这可能导致运行时错误。
<name>.exports中存放导出函数列表
readme.txt 则提示应用程序部署的注意事项,即你需要提供哪些文件以保证程序可以在未安装matlab的机器上正确执行
.c/.h则是由.m文件生成的对应的c文件,obj是.c生成dll文件时产生的目标文件
查看readme.txt可以知道,发布应用程序时你应该提供的文件为 .h文件 .dll文件和 mcrinstaller.exe,mcrinstaller的存放路径通常为:
<matlabroot>*\toolbox\compiler\deploy\win32\MCRInstaller.exe
接下来看看matlab生成了那些函数
在我的测试文件nmf.m编译生成的.exports文件中有如下的导出函数列表
nmfInitialize
nmfInitializeWithHandlers
nmfTerminate
nmfPrintStackTrace
nmfGetMcrID
mlxNMF
mlfNMF
其中,
nmfGetMcrID用于获取MCR版本号,为了使应用程序正确执行,运行程序的目标机器应该有相同版本的MCR环境
nmfPrintStackTrace用于输出错误追踪堆栈信息,一般无需理会
mlxNMF与mlfNMF则是我们可以调用完成相应功能的函数了,那么这两个函数有何不同,我们要调用哪一个呢?
根据matlab帮助文档的描述,这两个函数所完成的功能是完全一样的,调用任何一个都可以达到我们的目的,对于c共享库而言,所不同的仅仅是函数名和接口,即参数不同。而对于c++而言,mlf前缀函数的存在是为了保持与R13版本的兼容性。另一个不同是其参数类型为mwAray而不是mxArray。
mlx 前缀的函数的参数与mex函数的参数形式相同,即
<functionname>(int nargout, mxArray** x, mxArray** y,
mxArray* iterations, mxArray* draw)
其输入输出参数是存放于一个结构体里。
而 mlf 前缀的输入输出参数则是独立的,不是以结构体的形式出现,更接近与我们在一般的c/c++函数中见到的参数形式。因此,一般情况下我们使用mlf形式的函数接口。
nmfInitialize和nmfInitializeWithHandlers用于库初始化,调用nmf函数之前必须先调用此二者之一进行库初始化,使用结束须用nmfTerminate结束函数调用,查看源代码可以发现nmfInitialize函数内部调用的是nmfInitializeWithHandlers,函数返回布尔值,可用于确认库初始化是否成功。函数的参数如下所示,其效果与在matlab里使用这些参数相同。
接下来可以看看c/c++语言中调用matlab .m文件生成函数的流程了
<1> 在matlab中完成相应的功能函数。
<2> 编译生成相应的库。
<3> 在c/c++代码文件中调用mclInitializeAppliaction函数进行MCR应用程序状态初始化,需要说明的是,如果是.m文件直接编译为exe可执行文件,则初始化函数和结束调用函数都无需关心,若是生成库进行调用,则必须显式调用初始化函数,且只能调用一次,否则会出现未知错误。
<4> 完成库初始化。
<5> 进行函数调用,即调用mlf或mlx前缀函数。
<6> 释放资源,终止调用。如前述nmfTerminate函数。
<7> 调用mclTerminateApplication函数结束MCR应用程序状态。
<8> 编译c/c++文件......
上面出现的两个新函数mclInitializeAppliaction和mclTerminateApplication,matlab帮助系统中的说明是:
mclInitializeAppliaction
At run-time, there is an MCR instance associatedwith each individual shared library. Consequently, if an applicationlinks against two MATLAB Compiler generated shared libraries,there will be two MCR instances created at run-time.
You can control the behaviorof each MCR instance by using MCR options. The two classes of MCRoptions are global and local. Global MCR options are identical foreach MCR instance in an application. Local MCR options may differfor MCR instances.
To use a shared library, you must use these functions:
mclInitializeApplication
mclTerminateApplication
mclInitializeAppliaction 参数列表如下
-appendlogfile -Automation -beginfile -debug
-defer -display -Embedding -endfile
-fork -java -jdb -logfile
-minimize -MLAutomation -noaccel -nodisplay
-noFigureWindows -nojit -nojvm
-noshelldde -nosplash -r -Regserver
-shelldde -student -Unregserver -useJavaFigures
-mwvisual -xrm
mclTerminateApplication
Call this function once at the end of your program to closedown all MCR-internal application state. Call only once per process.After you have called this function, you cannot call any further MATLAB Compiler-generatedfunctions or any functions in any MATLAB library.