C++與Matlab混合編程

來自:http://sxnuwhui.blog.163.com/blog/static/13706837320124282524436/

先保存一個“Matlab更改啓動目錄”的小技巧:在目錄:$MATLAB\R2010a\toolbox\local下新建startup.m文件,例如,在文件中輸入:cd  E:\Experiment\code

資料1:http://anony3721.blog.163.com/blog/static/51197420111145534021/
資料2:http://shijuanfeng.blogbus.com/logs/106781870.html
資料3:http://blog.csdn.net/xiazhaoqiang/article/details/6292138

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

這裏我分四個步驟講解一個簡單的開發過程,使用的Matlab版本爲Matlab R2008a,VC版本爲Visual C++ 2008 Express版本。

步驟一、新建一個空的dll程序

clip_image002

步驟二、爲matlab函數提供頭文件和靜態庫的支持

要讓衆多的Matlab接口函數能夠運行起來,就必須給它們提供頭文件和靜態庫的支持,爲了避免每個項目都做這些添加工作,我們可以在Tools|Options|VC++ Directories下將頭文件和靜態庫的目錄添加進去,如圖:

點擊查看原始尺寸

點擊查看原始尺寸

在Include files中添加”$matlab dir\extern\include”和”$matlab dir\extern\include\win32”,在Library files中添加”$matlab dir\extern\lib\win32\microsoft”。

在項目屬性中,讓鏈接器鏈接libmx.lib、libmat.lib和libmex.lib,如圖:

點擊查看原始尺寸

在Preprocessor Definitions中添加MATLAB_MEX_FILE的宏定義。在Project|xx Project Properties|C/C++|Preprocessor中設置,如下圖:

點擊查看原始尺寸

現在寫一個hello world程序就可以編譯通過,如:

點擊查看原始尺寸

第三步 利用def文件導出mexFunction函數

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

首先告訴編譯器我使用了xx.def文件,在Project|xx Project Properties|linker|input|Module Definition File中填上xx.def。

再編寫xx.def的內容,只需兩句話:

LIBRARY xx

EXPORTS mexFunction

這裏的xx指的是模塊名稱(我用的是我新建的項目名稱),並將def文件添加到你的工程中。

最後,將輸出文件的後綴名改爲mexw32。在Project|xx Project Properties|linker|General|Output File中,如圖:

點擊查看原始尺寸

再次編譯、生成,可以在生出目錄mexw32文件。可以用dumpbin工具查看mexw32文件,可以看到有函數mexFunction已經導出。到這個時候DLL開發已經完成。下一步:

第四步、在啓動調試時關聯matlab

在Project|xx Project Properties|Debugging|Command裏添加Matlab的啓動地址:”$matlab dir\bin\win32\MATLAB.exe”。如圖:

點擊查看原始尺寸

最後設定斷點,啓動調試,Matlab會自動啓動,運行編寫的DLL(mexw32)文件,就會觸發斷點,如:

點擊查看原始尺寸

當然,最終使用的mexw32文件還應該是Release版本的,這樣的話,上面談的部分設置還需要在Release版本中重新來過。

發佈了32 篇原創文章 · 獲贊 8 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章