找回密码
 注册
关于网站域名变更的通知
查看: 498|回复: 2
打印 上一主题 下一主题

再用VS2010调用matlab封装DLL动态链接库

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-1-6 10:37 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
matlab封装DLL动态链接库 再用VS2010调用(matlab VS混合编程)(转载) / R4 Z8 |" W, d$ M2 ]4 Y+ z
" `8 D# o" h/ b% q) W3 L/ w/ L; R
整个配置调试过程使用的环境为matlab2011a(version 7.12.0.635),VS2010,操作系统是window70 T& D3 G. }, i/ @2 T" F
7 D! z" H1 A$ g
一,设置操作系统的环境变量。
% W7 E1 ~; y2 I7 R/ }4 V
- j9 z- Q: P) b4 q) N2 F系统变量增加D:\R2011a\bin\win32;D:\R2011a\bin和E:\Microsoft VisualStudio 10.0\VC\bin,这个分别是我的机器上matlab和VS安装目录下的路径。
1 t* I2 A8 U- o1 X" R
; L  w3 l+ m' o! F! g& Y系统变量设置完毕后需要重新启动计算机方能生效。8 B/ ~2 y$ U9 y6 i

) I5 P+ ?+ b* [% a, h  @二,设置matlab的编译环境0 N$ {$ |: z5 m6 h* t

; a3 L( z9 o  D5 S" o3 r" O在matlab中输入命令mex -setup,选择Microsoft Visual C++ 2010# |* D3 K- I; }# b) _. U
/ v8 v+ B2 E" r/ F. Z5 M$ ~
再输入命令mbuild -setup 同样选择Microsoft Visual C++ 20108 r( a. G- `. m8 F; c

/ @" y  s# L6 f- A. n6 ?, ip.s. 这一步中,在我自己配置的过程中,matlab可以很容易的识别出机器上装有的编译器以及他们的安装路径,其中包括VS2010,选择它就是了。也许有的环境下matlab不一定能找出VS2010中的VC编译器,这个怎么解决就不知道了。
2 e5 k6 m$ @8 Z2 K7 R7 y; M6 [8 l0 M  \1 O; m3 t. t
三,matlab编译.m文件
! `) S' H$ F* m" b  d: u
, d: b7 }1 T: M6 I  c& X4 u输入mcc -W cpplib:youRFunLib -T link:lib yourfun.m5 l: I4 W- @. @5 v7 I

3 G7 l7 o5 ~5 z8 n9 \7 v其中,yourfunLib是生成的DLL,Lib的前缀名字,也就是你最后可以是使用的DLL以及Lib库的名字;yourfun是你需要编译的.m函数。$ H3 P; Q  o' d- f
8 d' f5 o& g2 F$ r5 Q- U# t
编译完成后得到了下图中的一些文件:  s& W, _! G6 B# C* i8 E/ `1 _
0 B: n' [9 @: i" z, P

) K$ Z) ]& n5 e& A8 }; }) _$ H+ y& i3 }& Y3 o6 h
这些文件中后缀为DLL,LIB,H的文件在VS调用的时候有用,其他文件目前没有使用。(这里我把yourfunLib指定为aetherLib了)
& o: w3 x+ K- M) d! p5 S
& r9 `6 O- C7 G3 {4 T0 F四,VS2010 的配置: B* j, ^6 h' l$ l
5 T* Z9 P% s; O, k7 |
新建一个控制台项目。9 t/ r# c* ~  k5 h5 X" u

" A  @0 g& k. o# Q# b打开项目的属性页,针对这个项目做如下的设置:
5 o9 P1 [! D' [) k; k# W; P
5 p2 @; }$ ~" I, E$ ^8 d6 o1.VC++目录下的包含目录添加
$ t8 l% p( K# T8 ~& f% T6 b2 c4 g; i9 l
  @# z9 J6 l# f) oD:\R2011a\extern\include(matlab安装目录下的路径)
( b$ }/ Z0 {/ {% H+ L# Q- D/ ?- u: W% X
D:\R2011a\extern\include\win32  (matlab安装目录下的路径,下同)5 Y3 c8 ]% H8 b7 T- p

' c0 L: R0 H- [8 G7 l: K+ GC:\Users\lenovo\Desktop\aether\aether  (你自己新建的项目中的路径,下同)
) U  J  ~( z7 B. F" i6 t! n! V6 r$ [3 h7 Q+ I3 T9 o3 ^3 x2 ^) U9 g4 {
2.VC++目录下的库目录添加
4 I; N' w& M+ Z2 ^: ?; N7 x9 L) m. W$ M% `( i2 T6 l' M0 p1 y. N
D:\R2011a\bin\win32
  n/ E$ ^! Y, B7 D% L6 M3 R4 u
! F: m: J- y1 `$ W% yD:\R2011a\extern\lib/ v* K" q0 ?4 g) _" [

; [6 T+ Q8 }1 Q% A  ~C:\Users\lenovo\Desktop\aether\aether7 Z6 W8 \+ b  t1 D5 I

# T0 J' t" P0 m* I+ E% ]1 }* HD:\R2011a\extern\lib\win64\microsoft
+ T& R7 C% k5 p4 Q5 W4 i; f+ v
' d* O* ~$ n: f& L& o4 DD:\R2011a\extern\lib\win32\lcc% W* Q$ p& \! M% e( r' v; r: k: J

. h0 p( t# F  O) }9 N& u3 V* U2 `D:\R2011a\extern\lib\win32\microsoft
( m# ]) M: |8 k# s% m. T2 R/ ?3 |2 _; K* U3 z" M
3.c/c++中的常规里面的附加包含目录添加! \& l  q" i6 z& e- v3 X8 d! j. k5 b2 _

3 X# U  }; M# c0 m4 ID:\R2011a\extern\include9 v6 j7 a4 }3 p" C: q) G

+ i$ z& I3 p2 e' s4.连接器下面的常规中的附加库目录添加6 z1 O$ E# M; g  |

  m$ q6 }- d1 U! ~$ G% YD:\R2011a\extern\lib\win32\microsoft) z5 C, @7 d$ L: I; o# h/ ]

+ s. m: h5 m- D6 c5.连接器下面的输入中的附加依赖项添加
4 S5 M+ |8 _) Y6 m
8 [  Z$ |* }6 x) u) ?) Slibeng.lib
1 N4 z/ z1 ?% S$ C2 l0 B  v9 A& [) N3 r+ x- {) \
libmat.lib% A5 ^6 O* o/ m1 T! ^$ e

; r+ G. z, F$ {/ Alibmex.lib
0 K+ g( A2 h% }5 n! t# o4 |8 z5 B; J1 O3 y" S. s
libmx.lib; `4 N( x# D2 y+ d7 P
7 v9 k1 Q; _# P
mclmcrrt.lib
% s6 F2 _! R6 R4 `- m/ O$ k& a5 Y  ]; ?& H
mclmcr.lib) E* x2 \3 |- C, v9 ?) o/ b, M9 a

8 z' k  y+ v2 s5 y% A' aaetherLib.lib(这个是你自己用matlab生成的lib,前面的是matlab自身计算引擎中的lib)! i/ [9 T4 y- Y5 P" U8 b3 m; o9 P' v

; m! X' \1 Y0 u- E# \7 b在解决方案资源管理其中的头文件和资源文件中添加文件
4 Z; G' H7 A8 J! x
) ~, U' ]! r6 Q; Z1.在头文件中添加生成的.h文件$ w8 i/ E4 H" r( N+ A/ W" c- W* y. n

( ]5 C3 p- O& U% Z; k4 K2.在资源文件中添加.lib,.dll文件" h/ C% _6 P% }# R2 A( c, N1 p5 s

8 ~7 O% L7 d3 V% ]& _$ M( m3.然后 把.h,.lib,.dll文件拷到你新建的项目的目录下。比如我把他们放到了C:\Users\lenovo\Desktop\aether\aether里面。
( K  ?, {0 I9 G, @+ {# P& O* R( i9 ?1 n) H3 Q. q
(最好是用这个命令进行编译 mcc -W cpplib:MyAddLib -T link:lib MyAdd.m -C* h$ @& ?1 e4 \) a/ r& Y

# U- F! r  Q- @; [5 _然后把.ctf文件也拷过去。)
  K6 G0 u( O7 ?& {/ F" V
0 o4 c: E$ X- w* \& c% f编写代码调用dll中的函数
7 _( [: B4 `& ~: n0 _
( R: B8 W4 {# P5 E2 J+ C1 c& Tdll中的函数的接口形式在.h文件的最后面给出了,你可以去翻看他接口形式。这里面的函数的输入输出参数都得是mwArray对象的常引用,关于这个类请读者自己去网上搜索资料。你需要搞明白的是mwArray是matlab公司专门针对“c++调用matlab生成的dll“而设计的类,因为你包含了matlab安装目录下的这些类,所以你可以在VS里使用它们。' ?" z6 e% ^7 s2 Y/ `

, P1 J8 c, g3 y* j7 m下面是一段主函数的编写样例:
" k! [; p7 W5 V
: r1 b- m( e, f! \3 @3 r// newdll.cpp : 定义控制台应用程序的入口点。9 o3 T; Y) S( \
2 ~% }4 ?1 v  g& y/ C
//
& o3 ?/ _7 M7 v' t$ u  d2 D
2 t- P( ~/ E! s/ d( e; v1 V2 l+ `* G#include "stdafx.h"* ~, `3 ~8 k/ E

) Y% b9 I$ P' ^) R6 [#include
- {" V- M* ]% N6 c- X1 v; J. Y. i# j
#include "engine.h"
9 m" m+ n9 _7 U; {4 e' |8 M# l4 L8 \) h1 U* z
#include "mclmcr.h"
2 {$ X6 r+ L4 P9 N$ t
: x0 H# C: [- W( @9 m+ ^#include "mclcppclass.h"
9 t1 [: z" l* c0 J4 s, Q. r1 n; H2 x( t( {+ b8 E
#include "libMyAdd.h"! l/ c3 ?- a0 w' S* ?

& n$ V* b0 q0 U: q8 Xusing namespace std;# |* J# c; g. r
! g, F8 z# H/ Z+ `
int _tmain(int argc, _TCHAR* argv[])7 [% f( i1 Q% |+ I! H$ C4 ]
% O. g6 k- o; B  L+ w1 S2 M7 U. D. {
{
6 g+ t* h4 [8 |; }
- }" F9 V, M% r6 T" Y/ f- d if(!libMyAddInitialize()): D4 |+ c1 s% s7 d0 b$ ?3 f5 A4 ]
( t) e# ^& s6 y* o$ W( w
   {' Q1 |5 [  e! o- d1 v

; R4 P3 z9 f4 {  V, H   //initilize failed!!!"<<std::endl;& Z1 }2 U6 }) [* d- e6 ^8 y
7 |) M7 _% q: B1 M$ O; e8 L
    std::cout<<"错误..."<<std::endl;0 @% Q; Z, `3 [/ {$ l
/ l% n6 C0 G* O
   return -1;" C' q+ z0 j( V7 d$ Q7 M

4 N2 |+ F7 I' S8 t/ m" q1 v/ K   }: l; C# u1 ^0 S5 U& m' a8 q

7 ~, `7 U4 c  S; W/ \/ R double a = 6;
: D9 g5 h3 [- D; t' M7 }& m1 D7 `2 u$ J6 ?) X
double b = 9;6 h% J( \! |- o* S6 J% g4 q% e
% u0 @% G% z3 Y; e
double c;9 `% m0 W2 w. J+ N& D/ g) x

6 |. R7 t3 }* M, m* CmwArray mwA(1, 1, mxDOUBLE_CLASS);
$ Y5 `5 x* Z* v- P. W5 ?6 I4 }
* ?0 o& P) l8 {7 t8 K: u1 ~* M% X) rmwArray mwB(1, 1, mxDOUBLE_CLASS);6 n+ g% i( U6 \4 r: y" p0 I

  ?' `: R; L( |  GmwArray mwC(1, 1, mxDOUBLE_CLASS);
1 `* [: q9 |/ }% A% O  X% E4 i9 _
mwA.SetData(&a, 1);
# N, ^* v' U% C7 Z6 E- q& L2 z! s2 L+ P3 F4 k/ _. W! z6 q+ x8 |
mwB.SetData(&b, 1);
5 P0 `) u3 Z& S5 |" Y. i: }8 i, }2 C; q' g- L
MyAdd(1, mwC, mwA, mwB);
- h, U( w8 e1 H/ {2 v, L3 x' b0 @5 \. c8 C
c = mwC.Get(1,1);; I: _) y( J+ U3 I* o

- }1 b% P4 ^3 o8 M7 }cout<<c<<endl;
& D/ ~! d2 w7 B: l( P+ I- J6 F& g# T, @; u, E- B2 w
system("PAUSE");: g" b2 W: d" ?8 d
  d* q/ L# O% o6 }. ~4 f7 E
return 0;1 S$ \8 s6 N+ G3 K# i
: O! _% s4 q7 t- F
}5 p& P+ i& _. ?8 z$ ^' p4 ^, P: x
( C' W# i1 |7 g- |
这个dll中的函数只是实现了一个简单的两数相加的功能,是我做基本配置是使用的。3 Y; N/ x6 l3 g* c4 m

7 P9 D2 y3 ]- k5 o* e #include "engine.h"1 N+ z9 l& f$ V% @' [# g6 n
9 h( c" h0 D( z# t6 Q4 K
#include "mclmcr.h"& y( T  S# s& b0 j, s4 {+ H

7 E& j1 @( [+ Q  E& r% `2 G#include "mclcppclass.h"
' m( v- A1 S7 _; }9 y0 R5 F* j
#include "libMyAdd.h"       这些头文件是必须包含的,其中engine好像是包含了matlab计算引擎中的所有dll(还没有认真考证)
9 g/ F# f5 J5 q( M7 m: X3 B0 Q
  F& s+ g# o6 h( U现在,运气好的话你应该能看到你预想中的输出了。如果出现了问题,比如找不到路径,不可访问等等各种错误,那只能你自己去解决了,我搞了整整3天,上面提到的错误都有遇到。  出了错误你可以尝试去百度搜索其他博客,更好的是去google用英文搜索相关的问题,一些社区里面也许有答案呢,matlab版主文档我倒是没仔细看,也许上面也有不错的帮助呢! good luck  to you!8 Y& }0 _: x( V+ F' d9 N

" K7 ~) g, n9 V; w备注:
9 T' f# d! b; u+ G- I' ]
% _: B3 |- `' Q1.我自己在搞的时候,遇到的问题是.m函数中本身就使用了c++语言编写的dll,然后再封装这个.m函数。这种情况下你得保证VS可以访问到你用到的那些用C++书写的dll。但是只要用mcc命令编译.m函数后,你在连接器下面的输入中的附加依赖项中只需添加.m 生成的dll函数就可以了,不需要添加那些c++代码生成的dll。这里建议你把matlab项目拷到VS项目中,直接在Vs项目中工作进行MCC编译。! Y+ Q& n: T# ^: ~6 N* k
* l5 y. s* j% H6 V1 F
2.主函数代码中if(!libMyAddInitialize())是必须的。6 P( f3 [8 |  R9 Y' e  F. L

  y' I' L8 E# y3 \! C

该用户从未签到

2#
发表于 2020-1-6 18:40 | 只看该作者
看完只有一种感觉:学海无涯啊

该用户从未签到

3#
发表于 2020-1-7 18:06 | 只看该作者
用VS2010调用matlab封装DLL动态链接库
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-8-5 00:36 , Processed in 0.140625 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表