天天看點

vc 6.0與matlab,matlab7.0與vc6.0混編

我已經測試成功,比網絡上其他的方案明了,而且精确,沒有多餘的步驟

==============================================================

凡兄弟 發表于 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