**:
本人系統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...