我已經測試成功,比網絡上其他的方案明了,而且精确,沒有多餘的步驟
==============================================================
凡兄弟 發表于 2005-11-9 14:30:32
VC + MATLAB7 C Shared Library
所有調用MATLAB7
Compiler産生的共享庫的程式都具有如下的大緻結構:
1. 聲明變量或者是函數作為輸入變量;
2. 調用
mclInitalizeApplication函數,并測試是否成功,該函數設定了一個全局的MCR狀态,并且建構MCR執行個體;
3.
對于每個庫,調用一次Initalize函數,為庫建立一個MCR執行個體;
4. 調用庫中的函數,并處理其結果(這是程式的主要部分);
5.
為每個庫調用一次Terminate函數,用于登出相聯系的MCR;
6.
調用mclTerminateApplication函數,釋放與全局MCR狀态相聯系的資源;
7. 清除變換,關閉檔案等,然後退出。
根據MATLAB的幫助文檔中提供的例子,利用如下檔案進行練習:
/extern/examples/compiler/addmatrix.m
/extern/examples/compiler/multiplymatrix.m
/extern/examples/compiler/eigmatrix.m
實作步驟:
1)
先将這幾個檔案拷貝到目前目錄下,然後利用mcc建立共享庫,指令如下:
mcc –v -B csharedlib:libmatrix addmatrix.m multiplymatrix.m
eigmatrix.m
其中,操作參數 -B csharedlib 是一個綁定的操作,其等效指令為 -W
lib: -T link:lib。
2)在VC中建立一個MFC工程(本人建立的為基于對話框的),環境設定根據如下文章:怎樣設定
Visual Studio 與 Matlb Complier 4.0 一起工作
中的指導進行。在本例子中,隻需要在VC中進行如下步驟:
A. Tools->Options->Directories->Show directories
for:Include files-> \Extern\Include;
B. Tools->Options->Directories->Show directories
for:Library files->
\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
if(
!mclInitializeApplication(NULL,0) )
{
AfxMessageBox( "Could not initialize the application.");
exit(1);
}
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