我已经测试成功,比网络上其他的方案明了,而且精确,没有多余的步骤
==============================================================
凡兄弟 发表于 2005-11-9 14:30:32
VC + MATLAB7 C Shared Library
所有调用MATLAB7
Compiler产生的共享库的程序都具有如下的大致结构:
1. 声明变量或者是函数作为输入变量;
2. 调用
mclInitalizeApplication函数,并测试是否成功,该函数设置了一个全局的MCR状态,并且构建MCR实例;
3.
对于每个库,调用一次<libraryname>Initalize函数,为库创建一个MCR实例;
4. 调用库中的函数,并处理其结果(这是程序的主要部分);
5.
为每个库调用一次<libraryname>Terminate函数,用于注销相联系的MCR;
6.
调用mclTerminateApplication函数,释放与全局MCR状态相联系的资源;
7. 清除变换,关闭文件等,然后退出。
根据MATLAB的帮助文档中提供的例子,利用如下文件进行练习:
<matlabroot>/extern/examples/compiler/addmatrix.m
<matlabroot>/extern/examples/compiler/multiplymatrix.m
<matlabroot>/extern/examples/compiler/eigmatrix.m
实现步骤:
1)
先将这几个文件拷贝到当前目录下,然后利用mcc创建共享库,指令如下:
mcc –v -B csharedlib:libmatrix addmatrix.m multiplymatrix.m
eigmatrix.m
其中,操作参数 -B csharedlib 是一个绑定的操作,其等效指令为 -W
lib:<libname> -T link:lib。
2)在VC中创建一个MFC工程(本人创建的为基于对话框的),环境设置根据如下帖子:怎样设置
Visual Studio 与 Matlb Complier 4.0 一起工作
中的指导进行。在本例子中,只需要在VC中进行如下步骤:
A. Tools->Options->Directories->Show directories
for:Include files-><matlab7root> \Extern\Include;
B. Tools->Options->Directories->Show directories
for:Library files-><matlab7root>
\Extern\Lib\Win32\Microsoft\msvc60;
C. Project->Setting->C/C++->Category:Code
Generation->Use run-time library:Debug Multithread DLL;
D.
Project->Setting->Link->Category:Input->Object/library
modules:mclmcrrt.lib libmatrix.lib(mcc生成的共享库)。
3)拷贝MATLAB当前目录下刚才用mcc生成的libmatrix.h,libmatrix.dll,libmatrix.lib,以及
libmatrix.ctf文件到VC当前工程目录下,并用Project->Add to
Project->Files…将libmatrix.h加入到当前工程中。
4)在当前工程的对话框的头文件中加入#include "libmatrix.h" 与
#include "mclmcr.h";
5)在BOOL
CMatlab7dllDlg::OnInitDialog()中进行MATLAB库文件的初始化,在void
CMatlab7dllDlg::OnDestroy()中进行MATLAB库文件资源的释放,否则可能出现按钮只能够按一次,第二次运行则出错的现象;
6)调用MATLAB产生的库文件中函数的处理函数定义在一个按钮的响应函数中,并且要注意的是:如果一个mxArray变量需要重用的时候,必须用mxDestroyArray(out);
out=0;即先进行变量注销,再设置为空。
附上这几个主要函数如下:
1.BOOL CMatlab7dllDlg::OnInitDialog()
{
CDialog::OnInitDialog();
……………
// TODO: Add
extra initialization here
/* Call the
mclInitializeApplication routine. Make sure that the
application
* was
initialized properly by checking the return status. This
initialization
* has to be
done before calling any MATLAB API's or MATLAB Compiler
generated
* shared
library s. */
if(
!mclInitializeApplication(NULL,0) )
{
AfxMessageBox( "Could not initialize the application.");
exit(1);
}
/* Call the library
intialization routine and make sure that the
* library
was initialized properly. */
if
(!libmatrixInitialize())
{
AfxMessageBox("Could not initialize the library.");
exit(1);
}
return TRUE; // return TRUE
unless you set the focus to a control
}
2.void
CMatlab7dllDlg::OnDestroy()
{
CDialog::OnDestroy();
/* Call