matlab封裝DLL動態鏈接庫 再用VS2010調用(matlab VS混合編程)

一,設置操作系統的環境變量。

系統變量增加D:\R2011a\bin\win32;D:\R2011a\bin和E:\Microsoft Visual Studio 10.0\VC\bin,這個分別是我的機器上matlab和VS安裝目錄下的路徑。

系統變量設置完畢後需要重新啓動計算機方能生效。

二,設置matlab的編譯環境

在matlab中輸入命令mex -setup,選擇Microsoft Visual C++ 2010

再輸入命令mbuild -setup 同樣選擇Microsoft Visual C++ 2010

p.s. 這一步中,在我自己配置的過程中,matlab可以很容易的識別出機器上裝有的編譯器以及他們的安裝路徑,其中包括VS2010,選擇它就是了。也許有的環境下matlab不一定能找出VS2010中的VC編譯器,這個怎麼解決就不知道了。

三,matlab編譯.m文件

輸入mcc -W cpplib:yourfunLib -T link:lib yourfun.m

其中,yourfunLib是生成的DLL,Lib的前綴名字,也就是你最後可以是使用的DLL以及Lib庫的名字;yourfun是你需要編譯的.m函數。

編譯完成後得到了下圖中的一些文件:

這些文件中後綴爲DLL,LIB,H的文件在VS調用的時候有用,其他文件目前沒有使用。(這裏我把yourfunLib指定爲aetherLib了)

四,VS2010 的配置

新建一個控制檯項目。

 

//如果所要編寫的函數中包含有其他工具箱的函數,用應用程序中的Appilication Compiler

//在Files required for your library to run中添加工具包的文件夾

打開項目的屬性頁,針對這個項目做如下的設置:

1.VC++目錄下的包含目錄添加

D:\R2011a\extern\include(matlab安裝目錄下的路徑)

D:\R2011a\extern\include\win32  (matlab安裝目錄下的路徑,下同)

C:\Users\lenovo\Desktop\aether\aether  (你自己新建的項目中的路徑,下同)

2.VC++目錄下的庫目錄添加

D:\R2011a\bin\win32

D:\R2011a\extern\lib

C:\Users\lenovo\Desktop\aether\aether

D:\R2011a\extern\lib\win64\microsoft

D:\R2011a\extern\lib\win32\lcc

D:\R2011a\extern\lib\win32\microsoft

3.c/c++中的常規裏面的附加包含目錄添加

D:\R2011a\extern\include

4.連接器下面的常規中的附加庫目錄添加

D:\R2011a\extern\lib\win32\microsoft

5.連接器下面的輸入中的附加依賴項添加

libeng.lib
libmat.lib
libmex.lib
libmx.lib
mclmcrrt.lib
mclmcr.lib
aetherLib.lib(這個是你自己用matlab生成的lib,前面的是matlab自身計算引擎中的lib)

在解決方案資源管理其中的頭文件和資源文件中添加文件

1.在頭文件中添加生成的.h文件

2.在資源文件中添加.lib,.dll文件

3.然後 把.h,.lib,.dll文件拷到你新建的項目的目錄下。比如我把他們放到了C:\Users\lenovo\Desktop\aether\aether裏面。

編寫代碼調用dll中的函數

dll中的函數的接口形式在.h文件的最後面給出了,你可以去翻看他接口形式。這裏面的函數的輸入輸出參數都得是mwArray對象的常引用,關於這個類請讀者自己去網上搜索資料。你需要搞明白的是mwArray是matlab公司專門針對“c++調用matlab生成的dll“ 而設計的類,因爲你包含了matlab安裝目錄下的這些類,所以你可以在VS裏使用它們。

下面是一段主函數的編寫樣例:

// newdll.cpp : 定義控制檯應用程序的入口點。
//

#include "stdafx.h"
#include
#include "engine.h"
#include "mclmcr.h"
#include "mclcppclass.h"
#include "libMyAdd.h"
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
 if(!libMyAddInitialize())
   {
    //initilize failed!!!"<<std::endl;
     std::cout<<"錯誤..."<<std::endl;
    return -1;

   }
 double a = 6;

double b = 9;

double c;
mwArray mwA(1, 1, mxDOUBLE_CLASS);

mwArray mwB(1, 1, mxDOUBLE_CLASS);

mwArray mwC(1, 1, mxDOUBLE_CLASS);

mwA.SetData(&a, 1);

mwB.SetData(&b, 1);
MyAdd(1, mwC, mwA, mwB);
c = mwC.Get(1,1);
cout<<c<<endl;
system("PAUSE");
 return 0;
}

這個dll中的函數只是實現了一個簡單的兩數相加的功能,是我做基本配置是使用的。

 #include "engine.h"
#include "mclmcr.h"
#include "mclcppclass.h"
#include "libMyAdd.h"       這些頭文件是必須包含的,其中engine好像是包含了matlab計算引擎中的所有dll(還沒有認真考證)

現在,運氣好的話你應該能看到你預想中的輸出了。如果出現了問題,比如找不到路徑,不可訪問等等各種錯誤,那隻能你自己去解決了,我搞了整整3天,上面提到的錯誤都有遇到。  出了錯誤你可以嘗試去百度搜索其他博客,更好的是去google用英文搜索相關的問題,一些社區裏面也許有答案呢,matlab版主文檔我倒是沒仔細看,也許上面也有不錯的幫助呢! good luck  to you!

備註:

1.我自己在搞的時候,遇到的問題是.m函數中本身就使用了c++語言編寫的dll,然後再封裝這個.m函數。這種情況下你得保證VS可以訪問到你用到的那些用C++書寫的dll。但是隻要用mcc命令編譯.m函數後,你在連接器下面的輸入中的附加依賴項中只需添加.m 生成的dll函數就可以了,不需要添加那些c++代碼生成的dll。這裏建議你把matlab項目拷到VS項目中,直接在Vs項目中工作進行MCC編譯。

 2.主函數代碼中if(!libMyAddInitialize())是必須的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章