电竞比分网-中国电竞赛事及体育赛事平台

分享

Matlab與C++混編 – 調(diào)用生成的動態(tài)鏈接庫 | FreeStyleFreeStyle

 imelee 2017-09-17

最近需要用到C++與Matlab混編,所以查找了下網(wǎng)上的相關(guān)文章,并在此記錄我在使用網(wǎng)上的方法時遇到的問題及解決方法!

平臺

VS2010 SP1

MATLAB R2014a (64-bit)

Win8.1 x64

注意:因為需要用到mcc編譯器,所以事先先用!mcc命令查看一下你的mcc編譯器是否可用,部分未完全破解的Matlab是不可用的,截止今日(2015/4/10),至少R2014b還是不可用的。

我的這個Matlab版本的下載地址:http:///cV3jhWpvDkKuB  訪問密碼 629b

Matlab上的相關(guān)操作

1.編寫.m文件

首先新建一個簡單的Matlab程序,

1
2
3
4
function [c] = add(a,b)
c = a+b;
return;
end

2.設(shè)置Matlab編譯器

在Matlab命令行窗口輸入命令:mex -setup

1

如圖,選擇VC2010編譯器。

接著輸入mbuild -setup命令,同樣選擇VC2010。

3.編譯.m文件

在命令行窗口輸入命令mcc -W cpplib:add -T link:lib add前面的 add 是編譯產(chǎn)生的文件名,后一個 add 指要編譯的.m文件。

2

導出目錄生成以下文件:

3

但我們需要使用的只是其中的 add.dll,add.lib,add.h 三個文件。

在VS2010上使用生成的動態(tài)鏈接庫

1.配置VS2010

新建一個win32控制臺應(yīng)用程序(空項目),添加 MatlabAdd.cpp 文件,右鍵工程屬性(或者快捷鍵 Alt+F7),

C/C++ -> 常規(guī) -> 附加包含目錄

1
"D:\Program Files\MATLAB\R2014a\extern\include";

鏈接器 -> 常規(guī) -> 附加庫目錄:(注意,我的系統(tǒng)是x64,Matlab是x64的,所以使用win64) ,后一個是我生成的動態(tài)鏈接庫文件復制到的目錄

1
2
"D:\Program Files\MATLAB\R2014a\extern\lib\win64\microsoft";
"D:\Project\CPlusPlus\MatlabAdd\MatlabAdd\Debug"

鏈接器 -> 輸入 -> 附加依賴項:

1
mclmcrrt.lib;mclmcr.lib;add.lib

add.lib add.h文件復制到你的工程目錄,其中 .h 文件MatlabAdd.cpp 文件同目錄, .lib 文件放到可執(zhí)行目錄中,也即Debug目錄(需編譯一次才會出現(xiàn)),.dll文件復制到system32目錄(沒錯,即使你是x64的windows也要復制到這個目錄,否則找不到,或者將你add.dll所在的目錄添加到環(huán)境變量Path中,可能的原因是之前選擇的是32位的C/C++編譯器,產(chǎn)生的是32位windows動態(tài)鏈接庫,所以要放在system32目錄)

將 .h 文件添加到新建的項目,編寫 MatlabAdd.cpp 文件中的代碼:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include "add.h"
#include <iostream>
using namespace std;
int main()
{
if(addInitialize())    //初始化,這一步是必須的
{
cout<<"success!!!"<<endl;
}
else
{
cout<<"fail!!!"<<endl;
return 0;
}
//定義3個mwArray類型變量,用于存放矩陣
mwArray a(2,3,mxDOUBLE_CLASS);
mwArray b(2,3,mxDOUBLE_CLASS);
mwArray c(2,3,mxDOUBLE_CLASS);
double x[] = {1,2,3,4,5,6};
double y[] = {7,8,9,10,11,12};
double *sum=new double[6];        //注意這個是*類型的
// 給輸入 mxArray 對象賦值
a.SetData(x,6);
b.SetData(y,6);
//調(diào)用DLL函數(shù)
add(1,c,a,b);
//獲取結(jié)果
c.GetData(sum,6);
//輸出結(jié)果
for (int i=0;i<2;i++)
{
for (int j=0;j<3;j++)
cout<<sum[j*2+i]<<" ";
cout<<endl;
}
cout<<"it is successful !"<<endl;
return 0;
}

x86平臺下,到此應(yīng)該就可以運行了,但因為我的是x64平臺,所以編譯時提示以下錯誤:

7

這是因為以上鏈接中采用的是 x86,此操作系統(tǒng)為 x64,MATLAB R2012ax64,解決辦法:

8

打開屬性頁右上角的配置管理器,活動解決方案平臺,選擇新建,加入64位:

9

最后運行,看到運行畫面:

10


    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多