日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > 循环神经网络 >内容正文

循环神经网络

【转】matlab函数编译成dll供Cpp调用的方法

發(fā)布時間:2023/12/10 循环神经网络 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【转】matlab函数编译成dll供Cpp调用的方法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

轉自:https://www.cnblogs.com/vincenzo/archive/2009/09/09/1563467.html

以前做過matlab7與c++的混合編程:將m函數(shù)編譯成dll給C++調(diào)用,從而加快開發(fā)的進度。但是今天在matlab2008b下面又做了一遍,發(fā)現(xiàn)matlab又改了很多東西,諸如增加了面向對象的的擴展mwArray,于是做筆記如下。

(一) 總體概念

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

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

步驟如下:

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

2. 編譯m文件成dll

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

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

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

(二) 設置matlab編譯器

過程如下:

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

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

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

(三) 編譯m文件

首先,寫出matlab函數(shù),一個很簡單的加法函數(shù),如下:

function [c] = MyAdd(a, b);

c = a + b;

保存為MyAdd.m

然后,進行編譯,命令如下:

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

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

-W lib:string link:lib

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

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

libMyAdd.cpp

libMyAdd.exp

libMyAdd.dll

libMyAdd.exports

libMyAdd.h

libMyAdd.prj

libMyAdd_mcc_component_data.c

mccExcludedFiles.log

readme.txt

具體每一個文件的意思,請查幫助,這里只說其中很有用的幾個:

libMyAdd.dll是編譯好的動態(tài)庫,MyAdd這個函數(shù)封裝在里面,libMyAdd.h是對應的頭文件,在C里面調(diào)用這個函數(shù)的時候,需要include這個頭文件,在這個頭文件的最后,你可以看到下面的內(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表示輸出變量的個數(shù)

a,b,c就是對應了m函數(shù)的幾個變量

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

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

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

1. 首先建立一個控制臺工程(這個我就不詳細講了,太easy了)

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

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

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

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

#include "mclmcr.h"

#include "matrix.h"

#include "mclcppclass.h"

#include "libMyAdd.h"

lib包括

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

你可以到具體的路徑下看一看,有沒有上面幾個lib和頭文件

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

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

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

所有任務完成之后,開始寫Cpp試驗調(diào)用編譯之后的函數(shù)了。

首先,包含應有的頭文件:

#include "mclmcr.h"

#include "matrix.h"

#include "mclcppclass.h"

#include "libMyAdd.h"

#include <stdio.h>

#include <iostream.h>

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

int main(void)

{

double a = 6;

double b = 9;

double c;

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

if( !libMyAddInitialize())

{

std::cout << "Could not initialize libMyAdd!" << std::endl;

return -1;

}

// 為變量分配內(nèi)存空間,可以查幫助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,不用我解釋了吧,很簡單的,調(diào)用類里面的SetData函數(shù)給類賦值

mwA.SetData(&a, 1);

mwB.SetData(&b, 1);

// using my add,掉我自己寫的函數(shù)

MyAdd(1, mwC, mwA, mwB);

// get data,不用我解釋了吧,很簡單的,調(diào)用類里面的Get函數(shù)獲取取函數(shù)返回值

c = mwC.Get(1, 1);

printf("c is %f\n", c);

// 后面是一些終止調(diào)用的程序

// terminate the lib

libMyAddTerminate();

// terminate MCR

mclTerminateApplication();

return 0;

}

運行結果如下:

總結

以上是生活随笔為你收集整理的【转】matlab函数编译成dll供Cpp调用的方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。