在Visual Studio中開發Matlab mex文件,生成mexw64/mexw32


csunking貢獻,2015-9-22 1712

1、   概述

通過使用C/C++與Matlab混合編程,既可以享受到C代碼快速執行的速度,又可以方便的使用Matlab眾多的庫函數和強大的繪圖功能。讓Matlab調用C函數是通過DLL文件實現的,而這個DLL的開發過程不僅僅可以使用Matlab自帶的mex命令,還可以使用VC++開發環境,使用VC有很多好處,一是讓我回到了原來熟悉的開發環境中,二能夠使用更加標准的C++編譯器,第三點也是最爽的,可以使用VC強大的調試功能。

 

此次文檔更新時使用的開發環境為:Visual Studio 2012, Matlab R2015a

 

2、   步驟

1.啟動VS,新建一個空的項目ATSRID。然后配置項目屬性信息。然后,新建一個.cpp文件atsrid.cpp。並在添加Preprocessor Definitions中添加MATLAB_MEX_FILE的宏定義。

                

將輸出文件的后綴名改為mexw64/mexw32

$(OutDir)$(TargetName).mexw64

 

配置項目生成程序的平台位數屬性

2. 為matlab函數提供頭文件和靜態庫的支持

包含目錄:

E:\Program Files\MATLAB\R2015a\extern\include

E:\Program Files\MATLAB\R2015a\extern\include\win64

庫目錄

E:\Program Files\MATLAB\R2015a\extern\lib\win64\microsoft

連接器中添加靜態鏈接庫文件

libmx.lib;libmat.lib;libmex.lib;

 

3. 在atsrid.cpp中編寫mex文件中的內容。然后用利用.def文件導出mexFunction函數。

#include "mex.h"

void mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[])
{
    int nlhs1,nrhs1;
    mxArray *plhs1[1],*prhs1[1];
    mxArray *array_ptr;
 
    nlhs1=1;
    nrhs1=1;

    if((array_ptr=mexGetVariable("base","x"))==NULL)   //"base" means the command window where
    {                                                   //we get the matrix "x".
        mexErrMsgTxt("Variable 'x' not in the workspace.");
    }
    else
    {
        prhs1[0]=array_ptr;
        mexCallMATLAB(nlhs1,plhs1,nrhs1,prhs1,"det");
        mexPrintf("Det(array_ptr) == %g\n",mxGetScalar(plhs1[0]));
    }

}

 

 

讓函數從DLL中的導出有兩種方法,__declspec(dllexport)命令導出和def文件導出,但由於需要導出mexFunction在”mex.h”中已經定義,所以前一種導出方法行不通,這里采用def文件導出。

首先告訴編譯器我使用了xx.def文件,然后再在文件中加入內容。通過上述方式定義的def文件會自動添加入下面的屬性中。

 

文件中的內容如下

LIBRARY ATSRID; 指的是模塊名稱(可以用新建的項目名稱)

EXPORTS mexFunction

 

4. 編譯運行,生成ATSRID.mexw64文件。然后將該文件拷貝到Matlab的當前目錄下,然后進行該模塊的測試
x=magic(100);

ATSRID();

可以將結果與det(x)得到的相比較,查看是否正確。

 

備注:在VS項目中的atsrid.cpp可以直接放在matlab的當前目錄下進行mex atsrid.cpp編譯,也同樣可以生成atsrid.mexw64。之所以在Visual C++中進行編譯,是因為方便調試該程序。下面也將介紹另外一種調試方法。

 

 

3、  采用VS Debug mex文件

方便對各位在matlab上的researcher or developer。

1、初次使用mex時需要配置配置matlab mex編譯器

mex -setup

2、接下來,用-g選項編譯mex源文件,-g表示編譯結果中包含調試信息。

mex -g atsrid.cpp

 

3、開啟Visual Studio,不要關閉你的matlab。在Visual Studio的工具菜單中,選擇關聯到一個進程。

 

Visual Studio會加載數據,在彈出的對話框中選擇,選擇matlab進程,點擊“關聯”。

 

4、首先在Visual Studio的ATSRID項目中的atsrid.cpp文件代碼處添加斷點。然后,打開matlab 放置atsrid.mexw64的當前目錄,在代碼行中輸入下面的代碼

x=magic(10);

atsrid();

 

之后,會發現Visual Studio會自動將程序運行到斷點出,等待下一步的操作。

 

當斷點被觸發了,你就可以利用Visual Studio來查看你的變量,內存,調試你的程序了。

引用

似水流年,2009,http://knhunter.blogbus.com/.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM