matlab 调用64位dll,vc下調用matlab dll 文件 64位平台。

2014-11-22

從網上翻閱了不少前輩們的資料,大部分資料較老,沒有很完整的64位系統下的資料,彷徨數日,終於實驗成功,欣喜莫名,不敢獨享。

使用環境vs2008,win7 64位, matlab201364位。

一、Matlab所做設置:

1首先matlab要安裝64位的,一般在64位系統下默認安裝64位。

2mbuild –setup,選擇64位的編譯器。這個要配合vs2008的安裝進行,vs2008中需要有64的編譯器Compiler。

3按下述步驟操作。

編譯m文件

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

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

c = a + b;

保存為MyAdd.m

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

mcc -Wcpplib:libMyAdd -T link:lib MyAdd

其中,mcc是matlab提供的編譯命令(可以理解為gcc),對於這一點,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.prj

libMyAdd_mcc_component_data.c

mccExcludedFiles.log

readme.txt

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

libMyAdd.dll是編譯好的動態庫,MyAdd這個函數封裝在里面,libMyAdd.h是對應的頭文件,在C里面調用這個函數的時候,需要include這個頭文件,在這個頭文件的最后,你可以看到下面的內容:

externLIB_libMyAdd_CPP_API void MW_CALL_CONV MyAdd(int nargout, mwArray& c

, const mwArray&a

, constmwArray& b);

這就是MyAdd的C函數的聲明。

nargout表示輸出變量的個數

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

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

二、Vs2008所做的設置:

1首先建立vs2008的64位編譯平台,默認一般是win32平台。如果沒有的話得裝x64位編譯器,默認選項里面沒有,安裝時需要勾選。也可補裝。

2在X64位編譯平台下設置include, lib目錄。

3在電腦的環境變量中path添加d:\Program Files\MATLAB\R2013-64\bin\win64;

設置VC環境

有了上面的准備,需要設置VC環境,好讓lib和dll能被成功的調用。

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

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

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

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

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

#include"mclmcr.h"

#include"matrix.h"

#include"mclcppclass.h"

#include"libMyAdd.h"

lib包括

mclmcrrt.liblibmx.lib libmat.lib mclmcr.lib

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

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

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

寫Cpp調用dll

所有任務完成之后,開始寫Cpp試驗調用編譯之后的函數了。

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

#include"mclmcr.h"

#include"matrix.h"

#include"mclcppclass.h"

#include"libMyAdd.h"

#include

#include

然后,寫main函數:

int main(void)

{

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);

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

// 后面是一些終止調用的程序

// terminate thelib

libMyAddTerminate();

// terminate MCR

mclTerminateApplication();

return 0;

}

運行結果如下:

結論:想調用matlab的dll 文件, 無論matlab編譯 還是vs編譯步驟都需在64位下才可以。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值