1. 程式人生 > >matlab2014a + win764bit + vs2013混合程式設計(.m轉成dll供C++呼叫)

matlab2014a + win764bit + vs2013混合程式設計(.m轉成dll供C++呼叫)

在matlab中可以通過mbuild工具將.m檔案編譯成dll檔案供外部的C++程式呼叫,這樣就可以實現matlab和C++混合程式設計的目的。

1. 使用matlab生成dll檔案

1.1 首先需要帶有mcc編譯器的matlab軟體,這個可以通過在matlab命令列中輸入:!mcc命令來檢視

1.2然後再命令視窗輸入mbuild -setup選中要使用的C++編譯器,在這裡我選擇了VS2013的編譯器。

選好編譯器後再命令視窗輸入deploytool進入編譯視窗,

1.3 在彈出的視窗中選擇第二項,即生成dll動態連結庫的形式,之後會彈出如下視窗

在MATLAB Complie對話方塊中的左上角APPLICATION TYPE中選擇C++ Shared Library型別,在旁邊的白色框中點選加號將需要編譯成dll的.m檔案新增到當前專案中,

1.4之後就可以點選右上角的package按鈕生成dll檔案了。

點選之後matlab會彈出編譯進行的對話方塊,此時只需要等待既可以了

這

等待一段時間之後就可以在指定的目錄下看到生成dll以及相應的.h和.lib檔案

接下來我們用剛剛生成的dll檔案進行測試

2.dll簡單測試

使用新建一個win32的空的控制檯專案,同時將剛剛生成的mysvd.h,mysvd.lib和mysvd.dll拷貝到當前專案資料夾下,然後輸入以下程式碼

#include <iostream>
#include "mclmcr.h"
#include "matrix.h"
#include "mclcppclass.h" #include "mysvd.h" using namespace std; #pragma comment(lib,"mysvd.lib") int main() { if (!mysvdInitialize()) //初始化,在libmysvd.h中 { cout << "Could not initialize libmysvd!" << endl; exit(0); } double data[9] = { 1, 2, 3, 4, 5, 6, 7
, 8, 9 }; mwArray a(3, 3, mxDOUBLE_CLASS, mxREAL); a.SetData(data, 9); cout << a << endl << endl; //顯然,mwArry類對<<是有運算子過載的 mwArray s(3, 3, mxDOUBLE_CLASS, mxREAL); mwArray v(3, 3, mxDOUBLE_CLASS, mxREAL); mwArray d(3, 3, mxDOUBLE_CLASS, mxREAL); mysvd(1, s, a); //呼叫自己用matlab寫的函式,對a做奇異值分解 cout << s << endl << endl; cout << v << endl << endl; for (int i = 1; i < 4; i++) //逐個顯示元素 { for (int j = 1; j < 4; j++) { cout << d.Get(i, j) << " "; } cout << endl; } cin.get(); return 0; }

然後點選選單欄下的專案->屬性,在專案屬性對話方塊VC++選項中:

包含目錄:C:\Program Files (x86)\MATLAB\R2014a\extern\include
庫目錄:C:\Program Files (x86)\MATLAB\R2014a\extern\lib\win32\microsoft

在連結器->輸入選項中,附加依賴項:

libmat.lib
libmex.lib
mclmcr.lib
mclmcrrt.lib

也可以把剛才庫目錄下的所有lib檔案的名字輸入進去。

配置好之後就可以點選visual studio上的執行按鈕執行程式了,輸出結果如下: