EDA365电子论坛网

标题: 在VC2010中怎样调用matlab2012a中生成的dll文件 [打印本页]

作者: thinkfunny    时间: 2020-1-6 10:05
标题: 在VC2010中怎样调用matlab2012a中生成的dll文件

* s+ y( B8 H, [/ u) A这两天有时间,想到以后可能会用到VC和Matlab的混合编程,就学习了一下,在网上找了一下帖子等,说的都比较详细,但是自己搞的时候就出现问题了,报了一个错误(缺少mclmcrrt7_17.dll,导致程序无法运行),结果,程序当然是运行不下去,这个问题我以前见过,就是没有将路径添加到系统路径里面,但是我的问题是怎么也找不到这个dll文件在哪里,就一直在网上收,终于,一个偶然机会,找到了,问题也就此解决了,下面说说整个过程。$ D! k3 L; D+ C3 f2 P6 q

' D/ C9 w2 h& x6 X     首先说一下我的环境:Win7+VC2010+Matlab2012a。! P. B: j7 j! r  v

9 L( [7 K/ X3 l+ n     首先,建立一个matlab程序,就是你需要调用的matlab程序,我用了一个简单的例子,如下:5 C: E) c5 Y* S

  u5 {) g( q' {1 \     function [c]=add(a,b)  k0 _" |0 H2 a& H4 ~
     c=a+b;
/ z1 P0 }1 R% S. I     return;
2 u. e& R+ n7 K; M3 q     end
, R6 ]+ c; N% |/ }. U# X# T% J; ^) E
这个是求两个矩阵的和的一个函数,建立好之后就开始编译了,在Matlab主面板中输入mex -setup,选择编译器,如图:
' k: y- ?% |( ?( I
  `, m" K6 @2 b8 Y' l. X# z2 \( J' w9 v' X4 F

) [8 L( t3 i6 {" G/ C: T( T0 ^选择y,从本地选择,接下来选择编译器,如下图:! v% A, x1 P; u8 l" v4 j
4 z) Y8 i0 H- P) o7 S# N# c

) \2 {& ?2 S8 S+ w: p) Q
0 C) M3 |, l% z; G7 X; i9 E0 G+ g0 ~- V+ @% b" F+ s1 T! D, M
选择2,本地vc编译器,之后对信息进行确认,如下图:
( m( w( I9 f/ L0 O) j3 @$ a& g9 ~& m1 `. Y9 {9 Z

6 j( \) V) J; p, V6 l' j
/ }) V& U8 g0 h选择y,选择完了再对mbuild进行选择,在Matlab主面板里面输入:mbuild -setup,和编译器一样,进行选择,操作一模一样,这里就不在啰嗦了,完了之后就开始编译文件了,
4 S' Q" z$ T$ i# @# M* Z, e- H8 ~2 V
在主面板里面输入 mcc -W cpplib:add -T link:lib add.m,其中,前一个add是编译产生的文件名,后一个add.m是你编写的matlab源文件,接下来就是等待编译了,大概需要编译个几分钟,完了之后就会在源文件的目录下面产生一些文件,如下图:
; r9 E& Z; @2 j7 c8 o/ Z2 E; m& i" V4 S" M" }" z" F

$ k) C. A' F3 A  |. A
: d& U) _/ P) W+ N2 Y但是,我们需要的只有三个文件,.dll、.lib、.h文件,其他的可要可不要。好了,源文件已经编译好了,接下来就是对VC环境进行配置了,再次声明,我的平台是VC2010+Matlab2012a,首先创建一个工程,然后右键单击工程—>属性—>VC++目录,添加包含目录:D:\Program Files\MATLAB\R2012a\extern\include,然后添加库目录:D:\Program Files\MATLAB\R2012a\extern\lib\win32\microsoft,C:\Users\hengfan\Desktop\add,注意,前一个是matlab的库目录,后一个是自己的库目录,最好是两个都添加,这个VC++目录就设置好了,接下来还是在属性这里面,选择链接器—>输入,添加附加依赖项:mclmcrrt.lib、mclmcr.lib、add.lib,注意,每个库文件占一行,这样属性就配置好了,接下来就是对文件的引用,将编译得到的三个文件复制(三个一起复制)复制到你的工程文件下面,如果你不清楚复制在哪一个目录下面,就复制在你工程文件的每一个下面吧(正确的方式是:.h文件复制到你的C++源文件目录下面,.lib和.dll文件复制到你的可执行文件中,也就是debug文件夹中,如果怕出错就全部复制),接下来就在C++源文件中添加头文件#include"add.h",下面我将整个程序给出来,如下:: J# ?5 x/ d5 o4 F$ q0 g
* w) q, L) r; k4 Y/ O5 D
#include <iostream>
$ V+ E) O) t+ {; K5 }8 K, |#include "add.h"* p9 U" {! T; A2 L' E' `
using namespace std;
7 V* ?; [7 S0 L& O" O, d# aint main()2 b$ h+ P8 x) |
{
9 U% _0 ?1 ]- `& A; \* Q( ^ if(addInitialize())    //初始化,这一步是必须的' x5 Q: Z8 K6 G8 G  C6 ]
{. O1 F% |/ O: w7 k
  cout<<"success!!!"<<endl;
/ u! t) q8 ?4 v }$ C" S* S; I/ n9 R. b0 Z- }3 A
else1 k: v+ D  A9 A2 b4 g
{
) j3 [) Q7 X5 T- Y0 P( Q2 p  cout<<"fail!!!"<<endl;
7 ~& A/ W0 T" w  d- f$ L! F  return 0;
  N3 d5 c  t% h" _0 w }. f; l' Q% U; d2 q8 `3 m9 J
0 Y* e$ R$ j4 L9 `& y' e
//定义3个mwArray类型变量,用于存放矩阵
% w  M* ]% t( s' F% Z( L+ j mwArray a(2,3,mxDOUBLE_CLASS);
; P8 g0 n4 k* x0 y: c    mwArray b(2,3,mxDOUBLE_CLASS);
$ z& y' w1 G% P' M mwArray c(2,3,mxDOUBLE_CLASS);
& C8 r: u' m6 J& g" F0 B7 e* P& {6 s: B4 O8 M  |( M
double x[] = {1,2,3,4,5,6};; ~/ {- h5 x6 \4 v+ c$ a9 R
double y[] = {7,8,9,10,11,12};: R3 }' i  ]8 v9 X# p4 w' `
double *sum=new double[6];        //注意这个是*类型的9 A$ m. f: }" q4 s

  g% k% {. q+ m // 给输入 mxArray 对象赋值. X$ h4 |: P0 u0 t
a.SetData(x,6);0 u4 ~& B2 i4 k) M9 w, ^0 I* d4 v
b.SetData(y,6);
( j: W. R- ^/ V) J, t+ j
1 t- s: y$ h: T7 \  y7 P //调用DLL函数
7 o- a: p( S6 m& B4 Z; D/ V& M add(1,c,a,b);. g1 A# d. c; I: Z2 E

6 M- L9 h6 f/ D/ q1 D* D" N //获取结果
+ ~' h  h" D5 k" p8 Y3 r c.GetData(sum,6);. N( V; e% A7 d. l

+ Q1 G# }! O: O8 W2 Y' b& }3 I7 W4 N //输出结果" Z& X+ u7 m2 D' j3 ^, C) I0 }; I* A
for (int i=0;i<2;i++)
6 x; V9 @5 I$ n$ T' S% ]6 I. m$ Y {4 p  m! ^$ h3 U# J
  for (int j=0;j<3;j++)
" O, q) M0 w0 ]2 }   cout<<sum[j*2+i]<<" ";
/ @" w9 Y; c8 _' m4 L9 e  cout<<endl;( M5 A& s9 c7 w1 y6 h5 Z
}
$ t& H0 `! J4 {7 l1 }! f* A0 C & u* ^  }$ f2 X" }, ]7 s  ^/ c: C
cout<<"it is successful !"<<endl;
  S  b; l9 A5 y% S4 U1 `; n) _, o return 0;: V: g8 s5 _0 X" |6 L. H, [
}
+ X8 h+ R; p, C+ U/ N3 N' p. Y% _  Y" O. K

0 q+ e  l2 d' ?% v8 Z接下来直接执行就可以了,我的程序运行的结果如下:6 I9 E# g; X* u6 [5 z0 E. E" d4 b
4 e2 j% H3 ]' w. B
& @, H4 ^) w  R1 c
! `3 N# j( ?% b* P

- E- q/ [/ g) w# W. E* H哈哈,是不是很爽呢,是的,但是还有很重要的一步,不知道其他人遇到过没有,反正我遇到过,就在这里说一下,就是运行的时候会出现一个错误,说“缺少mclmcrrt7_17.dll,导致程序无法运行”,这个问题好解决,找到你的matlab安装文件下面的:D:\Program Files\MATLAB\R2012a\runtime\win32,注意,这个路径随每个人的安装不同,记得修改,在这个文件夹里面,你是不是看到了mclmcrrt7_17.dll这个文件呢,下面你只需要将这个文件所在的路径添加在系统环境变量中就可以了,也就是将D:\Program Files\MATLAB\R2012a\runtime\win32添加到系统变量PATH的路径中,这个我就不说了,记得,添加了环境变量之后,需要重启电脑,才会生效,接下来就可以看到效果了,爽吧!!!嘿嘿嘿......' V# B9 i, Q/ ~& r, t# h' y

作者: ExxNEN    时间: 2020-1-6 18:37
matlab生成的文件还可以被其他软件调用啊




欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2