matlab2014a + win764bit + vs2013混合程式設計(.m轉成dll供C++呼叫)
阿新 • • 發佈:2019-01-08
在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上的執行按鈕執行程式了,輸出結果如下: