日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線(xiàn)溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
淺析將matlab函數(shù)編譯成dll供Cpp調(diào)用的方法

作者曾經(jīng)實(shí)現(xiàn)過(guò)將matlab函數(shù)編譯成dll供Cpp調(diào)用,這篇文章的目的是對(duì)新增的面向?qū)ο蟮牡臄U(kuò)展mwArray進(jìn)行講解,matlab很容易和C/C++聯(lián)合起來(lái)使用。

以前做過(guò)matlab7與c++的混合編程:將matlab函數(shù)編譯成dll給C++調(diào)用,從而加快開(kāi)發(fā)的進(jìn)度。但是今天在matlab2008b下面又做了一遍,發(fā)現(xiàn)matlab又改了很多東西,諸如增加了面向?qū)ο蟮牡臄U(kuò)展mwArray,于是做筆記如下。

(一) 總體概念

matlab提供了豐富的程序接口,除了matlab最初的版本是用fortran寫(xiě)的之外,后來(lái)的版本都是用C寫(xiě)的,因此matlab很容易和C/C++聯(lián)合起來(lái)使用。

matlab有著豐富的庫(kù)函數(shù),將這些庫(kù)函數(shù)直接編譯成dll(windows下是dll,linux下是類(lèi)似于dll的另外一個(gè)東西),給C調(diào)用,可以加快工程進(jìn)度。

步驟如下:

1. 設(shè)置matlab的編譯器,使用外部的VC或者gcc等編譯器。

2. 編譯m文件成dll

3. 設(shè)置VC等的繼承環(huán)境,設(shè)置C需要用到的靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)

4. 編寫(xiě)C調(diào)用dll

下面以一個(gè)很簡(jiǎn)單的加法函數(shù)為例,說(shuō)明在VC6和matlab2008b下,怎么做混合編程

(二) 設(shè)置matlab編譯器

過(guò)程如下:

1. 在matlab的command window里面敲入mex –setup,matlab會(huì)列出所有電腦上所有的編譯器。

2. 選擇編譯器,這里選擇2,即VC6

3.完成之后,敲入mbuild –setup,選擇build工具,matlab會(huì)列出所有的build工具,同樣選擇VC6

(三) 編譯m文件

首先,寫(xiě)出matlab函數(shù),一個(gè)很簡(jiǎn)單的加法函數(shù),如下:

 
 
 
 
  1. function [c] = MyAdd(a, b);   
  2. c = a + b;  

保存為MyAdd.m

然后,進(jìn)行編譯,命令如下:

mcc -W cpplib:libMyAdd -T link:lib MyAdd

其中,mcc是matlab提供的編譯命令(可以理解為gcc),對(duì)于這一點(diǎn),matlab的幫助說(shuō)明如下:

-W lib:string link:lib

其中-W是控制編譯之后的封裝格式,cpplib,是指編譯成C++的lib,cpplib冒號(hào)后面是指編譯的庫(kù)的名字,-T表示目標(biāo),link:lib表示要連接到一個(gè)庫(kù)文件的目標(biāo),目標(biāo)的名字是后面的MyAdd,即你寫(xiě)的m函數(shù)的名字。

運(yùn)行完之后,你的目錄下面,將會(huì)出現(xiàn)以下一些文件:

libMyAdd.cpp

libMyAdd.exp

libMyAdd.dll

libMyAdd.exports

libMyAdd.h

libMyAdd.prj

libMyAdd_mcc_component_data.c

mccExcludedFiles.log

readme.txt

具體每一個(gè)文件的意思,請(qǐng)查幫助,這里只說(shuō)其中很有用的幾個(gè):

libMyAdd.dll是編譯好的動(dòng)態(tài)庫(kù),MyAdd這個(gè)函數(shù)封裝在里面,libMyAdd.h是對(duì)應(yīng)的頭文件,在C里面調(diào)用這個(gè)函數(shù)的時(shí)候,需要include這個(gè)頭文件,在這個(gè)頭文件的***,你可以看到下面的內(nèi)容:

extern LIB_libMyAdd_CPP_API void MW_CALL_CONV MyAdd(int nargout, mwArray& c

, const mwArray& a

, const mwArray& b);

這就是MyAdd的C函數(shù)的聲明。

nargout表示輸出變量的個(gè)數(shù)

a,b,c就是對(duì)應(yīng)了m函數(shù)的幾個(gè)變量

注意,a,b,c三個(gè)變量的類(lèi)型是mwArray,這是matlab提供的一個(gè)特殊的變量類(lèi)型(在7.0的版本,編譯之后,變量類(lèi)型是mxArray)。mwArray是一個(gè)類(lèi),具體可以查幫助,當(dāng)然后面也會(huì)講到。

(四) 設(shè)置VC環(huán)境

有了上面的準(zhǔn)備,需要設(shè)置VC環(huán)境,好讓lib和dll能被成功的調(diào)用。

1. 首先建立一個(gè)控制臺(tái)工程(這個(gè)我就不詳細(xì)講了,太easy了)

2. 然后,在tool-option-directory里面設(shè)置用到的lib和include頭文件的位置

首先是include頭文件的位置,看***一行(這個(gè)根據(jù)每一個(gè)人的安裝目錄可能不一樣,自己去找吧)

然后是lib的位置,不盡包括matlab的靜態(tài)庫(kù)的位置,還包括剛剛編譯出來(lái)的lib的位置,見(jiàn)圖的后面兩個(gè),不用我解釋吧

你可以打開(kāi)這兩個(gè)目錄,看看里面到底有哪些頭文件和lib,首先來(lái)講,我們這里要用到的頭文件包括:

#include "mclmcr.h"

#include "matrix.h"

#include "mclcppclass.h"

#include "libMyAdd.h"

lib包括

mclmcrrt.lib libmx.lib libmat.lib mclmcr.lib

你可以到具體的路徑下看一看,有沒(méi)有上面幾個(gè)lib和頭文件

路徑設(shè)好了,需要制定具體用到的lib了,在project Setting-link-Object/library modules里面加入上面提到的幾個(gè)lib(具體幾個(gè)lib到底做什么用的,這里不講了,看幫助,或者你試驗(yàn)刪去幾個(gè)lib能不能工作,就大概可以猜得到他們是干什么的了)

3. 將編譯好的dll復(fù)制到VC工程的Debug或者Release目錄下,以使得dll可以被找到。

(五) 寫(xiě)Cpp調(diào)用dll

所有任務(wù)完成之后,開(kāi)始寫(xiě)Cpp試驗(yàn)調(diào)用編譯之后的函數(shù)了。

首先,包含應(yīng)有的頭文件:

 
 
 
 
  1. #include "mclmcr.h"   
  2. #include "matrix.h"   
  3. #include "mclcppclass.h"   
  4. #include "libMyAdd.h"   
  5. #include   
  6. #include  

然后,寫(xiě)main函數(shù):

 
 
 
 
  1. int main(void)   
  2. {   
  3. double a = 6;   
  4. double b = 9;   
  5. double c;   
  6. // initialize lib,這里必須做初始化!   
  7. if( !libMyAddInitialize())   
  8. {   
  9. std::cout << "Could not initialize libMyAdd!" << std::endl;   
  10. return -1;   
  11. }   
  12. // 為變量分配內(nèi)存空間,可以查幫助mwArray   
  13. mwArray mwA(1, 1, mxDOUBLE_CLASS); // 1,1表示矩陣的大?。ㄋ衜altab只有一種變量,就是矩陣,為了和Cpp變量接軌,設(shè)置成1*1的矩陣,mxDOUBLE_CLASS表示變量的精度)   
  14. mwArray mwB(1, 1, mxDOUBLE_CLASS);   
  15. mwArray mwC(1, 1, mxDOUBLE_CLASS);   
  16. // set data,不用我解釋了吧,很簡(jiǎn)單的,調(diào)用類(lèi)里面的SetData函數(shù)給類(lèi)賦值   
  17. mwA.SetData(&a, 1);   
  18. mwB.SetData(&b, 1);   
  19. // using my add,掉我自己寫(xiě)的函數(shù)   
  20. MyAdd(1, mwC, mwA, mwB);   
  21. // get data,不用我解釋了吧,很簡(jiǎn)單的,調(diào)用類(lèi)里面的Get函數(shù)獲取取函數(shù)返回值   
  22. c = mwC.Get(1, 1);   
  23. printf("c is %f\n", c);   
  24. // 后面是一些終止調(diào)用的程序   
  25. // terminate the lib   
  26. libMyAddTerminate();   
  27. // terminate MCR   
  28. mclTerminateApplication();   
  29. return 0;   
  30. }  

運(yùn)行結(jié)果如下:


當(dāng)前標(biāo)題:淺析將matlab函數(shù)編譯成dll供Cpp調(diào)用的方法
標(biāo)題網(wǎng)址:http://m.5511xx.com/article/ccsheij.html