vs2010和Matlab R2012a 混合程式設計

2021-06-10 10:26:44 字數 4597 閱讀 9195

**:

本人系統windows 7旗艦版,32位,採用由m檔案構造動態鏈結庫然後在visual studio中呼叫的方法。

1. matlab 環境配置:

注:matlab r2010b及以後版本才支援vs2010, 之前版本中mbuild命令輸入後可能會找不到vs2010編譯器。

2.書寫m檔案

示例如下:

function [ c ] = myadd( a,b )

%untitled summary of this function goes here

%   detailed explanation goes here

c=a+b;

end儲存為myadd.m

3.建立動態鏈結庫

matlab中輸入:mcc -w cpplib:libmyadd -t link:lib myadd -d [生成檔案路徑]

其中,mcc

是matlab

提供的編譯命令,對於這一點,

matlab

的幫助說明如下:

-w lib:string link:lib其中

-w是控制編譯之後的封裝格式,

cpplib

,是指編譯成

c++的

lib,

cpplib

冒號後面是指編譯的庫的名字,

-t表示目標,

link:lib

表示要連線到乙個庫檔案的目標,目標的名字是後面的

myadd

,即你寫的

m函式的名字。

執行完之後,你的目錄下面,將會出現以下一些檔案:

libmyadd.cpp

libmyadd.exp

libmyadd.dll

libmyadd.exports

libmyadd.h

libmyadd.lib

mccexcludedfiles.log

readme.txt

具體每乙個檔案的意思,請查幫助,這裡只說其中很有用的幾個:

libmyadd.dll是編譯好的動態庫,

myadd

這個函式封裝在裡面,

libmyadd.h

是對應的標頭檔案,在

c裡面呼叫這個函式的時候,需要

include

這個標頭檔案在這個標頭檔案的最後,你可以看到下面的內容:

extern lib_libmyadd_cpp_api void mw_call_conv myadd(int nargout, mwarray& c, const mwarray& a, const mwarray& b);

這就是myadd的c

函式的宣告。

nargout表示輸出變數的個數,a,

b,c就是對應了

m函式的幾個變數。

注意,a,b

,c三個變數的型別是

mwarray

,這是matlab

提供的乙個特殊的變數型別(在

7.0的版本,編譯之後,變數型別是

mxarray

)。mwarray

是乙個類,具體可以查幫助。

4.系統環境配置

computer - > properties -> advanced system settings -> environment variables -> user variables -> path, 

新增(matlab下為matlab 2012軟體安裝目錄)

...\matlab\extern\lib\win32\microsoft;

...\matlab\bin\win32

computer - > properties -> advanced system settings -> environment variables -> system variables -> path, 新增

...\matlab\runtime\win32;

...\matlab\bin;

...\matlab\extern\lib\win32\microsoft;

...\matlab\bin\win32

5.vs2010環境配置

a.建立乙個

並新建乙個

cpp檔案

(否則之後

property pages

中沒有c/c++

目錄 )

b. 設定目錄

①property pages -> vc++ directories -> include directories, 新增(

安裝目錄下)

...\matlab\extern\include\ 

②property pages -> vc++ directories -> library directories, 新增

...\matlab\extern\lib\win32\microsoft

③property pages -> c/c++ -> general -> additional include directories, 新增

...\matlab\extern\include\

④property pages -> linker -> general -> additional library directories, 新增

...\matlab\extern\lib\win32\microsoft

⑤property pages -> linker -> input -> additional dependencies, 新增

libeng.lib

libmat.lib

libmex.lib

libmx.lib

mclmcrrt.lib

mclmcr.lib

libmyadd.lib

6.vs2010下完成程式

把剛才生成的lib*.h lib*.dll lib*.lib檔案複製到剛剛新建的工程的資料夾下,並且用新增—現有項 

新增的工程中。(此處的*

代表你的

m檔名稱

其中testmat3.cpp程式如下:

#include

#include

#include

#include "mclmcr.h"

#include "matrix.h"

#include "mclcppclass.h"

#include "libmyadd.h"

using namespace std;

int main()

double a = 6;

double b = 9;

double c;

// initialize lib,這裡必須做初始化!

if( !libmyaddinitialize())

std::cout <

return -1;

// 為變數分配記憶體空間,可以查幫助mwarray

mwarray mwa(1, 1, mxdouble_class); // 1,1表示矩陣的大小(所有maltab只有一種變數,就是矩陣,為了和cpp變數接軌,設定成1*1的矩陣,mxdouble_class表示變數的精度)

mwarray mwb(1, 1, mxdouble_class);

mwarray mwc(1, 1, mxdouble_class);

// set data,不用我解釋了吧,很簡單的,呼叫類裡面的setdata函式給類賦值

mwa.setdata(&a, 1);

mwb.setdata(&b, 1);

// using my add,掉我自己寫的函式

myadd(1, mwc, mwa, mwb);

// get data,不用我解釋了吧,很簡單的,呼叫類裡面的get函式獲取取函式返回值

c = mwc.get(1, 1);

std::cout<

// terminate the lib

libmyaddterminate();

// terminate mcr

return 0;

7. 程式執行結果:

出現此結果基本上就說明混合程式設計成功了。

注:如果m檔案中有畫圖方面的函式,則前邊一定要有延時函式,或者在c程式中m函式呼叫後加上getchar(),否則當lib和mcr被terminated後影象會被關閉----即程式執行後會出現影象「一閃而過」的效果!

Matlab R2010a和vs 2010混合程式設計

matlabr2010a與vs2010 c 混合程式設計成功,在vs2010 c 中能夠呼叫matlab的m函式,進行計算,得到正確結果,呼叫matlab中m函式轉化成的dll檔案 一 matlab編譯環境的設定 mex setup pleasechoose your compiler for bu...

vs2010安裝和使用

vs2010是之前我跟老師做 專案時安裝的,這次軟體工程作業我就用它了,安裝過程中的截圖就不存在了,我就詳細說說它的使用吧。下面讓我們用vc2010來做乙個控制台的helloworld程式吧。vs2010裡面不能單獨編譯乙個.cpp或者乙個.c檔案,這些檔案必須依賴於某乙個專案,因此我們必須建立乙個...

如何提高VS2010的效能,VS2010不再卡

教大家幾個技巧可以稍微讓你覺得它沒那麼卡!一 vs2010選項視覺體驗設定 工具 選項 環境 視覺體驗的勾選都去掉。不解釋,你懂得。不過還是建議開啟硬體加速 二 禁用intellisense 工具 選項 文字編輯器 c c 高階 禁用intellisense設為true 這個功能很好用。相較於vis...