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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
matlab封装DLL动态链接库 再用VS2010调用(matlab VS混合编程)(转载) * r0 u6 W: r8 f3 h  \* f- M$ B

! k/ Z, C- O  D4 R% G2 s: j整个配置调试过程使用的环境为matlab2011a(version 7.12.0.635),VS2010,操作系统是window78 ]# C  ?4 V7 d# P0 M
9 R0 U8 r( ]( B% w# [! b* U( L
一,设置操作系统的环境变量。
2 p" Q  t$ U  U$ h! \/ q+ r5 u& x: O5 l* @0 a" Q
系统变量增加D:\R2011a\bin\win32;D:\R2011a\bin和E:\Microsoft VisualStudio 10.0\VC\bin,这个分别是我的机器上matlab和VS安装目录下的路径。  M, @- n3 B' n+ r5 r5 k
- u4 z  ^7 \. l  e3 b( [' ^
系统变量设置完毕后需要重新启动计算机方能生效。
9 X) M/ ~* x5 C$ }$ a" ]) L% \
* S, w% b1 U1 f5 `; t( p) _  B二,设置matlab的编译环境
" m3 l2 y2 }( h& u& Q8 l
, K9 f$ z' R3 ^: l6 P在matlab中输入命令mex -setup,选择Microsoft Visual C++ 2010
. F: b* ]3 ^, l
" h8 G2 [- G$ @  v. I6 R  V再输入命令mbuild -setup 同样选择Microsoft Visual C++ 2010
: }3 x. U0 X6 B% S* `
4 W5 [, F. H1 ~: A. qp.s. 这一步中,在我自己配置的过程中,matlab可以很容易的识别出机器上装有的编译器以及他们的安装路径,其中包括VS2010,选择它就是了。也许有的环境下matlab不一定能找出VS2010中的VC编译器,这个怎么解决就不知道了。
5 ~/ J+ Q, B8 _% j- n+ M% a* A/ O3 N5 a4 L  @# L+ R
三,matlab编译.m文件
" F. M7 t# S" B) B8 `' M  M& m9 s( U" e2 S1 B: K4 W
输入mcc -W cpplib:youRFunLib -T link:lib yourfun.m, s* t3 ]( `9 O1 ]( ?) Q$ k

3 k. C; ~6 H. z2 v8 a' c  n其中,yourfunLib是生成的DLL,Lib的前缀名字,也就是你最后可以是使用的DLL以及Lib库的名字;yourfun是你需要编译的.m函数。
: f1 P, S. r( M5 P$ r/ [: K5 R
) c: T- {, u: ?2 G  A( A( Y9 k编译完成后得到了下图中的一些文件:6 \( R3 |! [/ E6 ^, U% }
2 H  c- Z! J9 m5 ]" w
/ [( I( j  k# a- r3 F
+ k7 Y5 H4 s. l% Y( ^" U; i
这些文件中后缀为DLL,LIB,H的文件在VS调用的时候有用,其他文件目前没有使用。(这里我把yourfunLib指定为aetherLib了)4 p4 a2 R6 K3 L. R7 s- R: ~  [

: {3 B7 s+ z% J% _! I5 B( S$ `. h% ~四,VS2010 的配置, }: C; Z1 ]+ _( r
/ N) w1 O/ r+ Z: s% g. U' _. j( k
新建一个控制台项目。! O9 q6 n$ X4 V/ ]0 t% j

$ g) d0 ]: D) X  i0 T* S8 D; p打开项目的属性页,针对这个项目做如下的设置:
- j" m- R7 a7 I5 t1 m/ J$ C
- \/ y2 u$ [( L# `1.VC++目录下的包含目录添加1 E' ]& P! ]3 d3 i! }
5 T3 E% s3 W  J( G, b: `# m7 ~5 U' k
D:\R2011a\extern\include(matlab安装目录下的路径)4 `+ L1 y1 A$ U

& l0 d6 O; ?$ ?7 [! kD:\R2011a\extern\include\win32  (matlab安装目录下的路径,下同)
- @5 W, t/ V0 l- C9 _* ?+ ?/ F6 x+ Q* l; |, L  h7 {" \' V( m
C:\Users\lenovo\Desktop\aether\aether  (你自己新建的项目中的路径,下同)" x: J6 y' o! S0 G! P

! w+ f7 h1 d8 V) @  B6 p5 R6 ]2.VC++目录下的库目录添加8 v' k+ n4 ]3 m; f$ ?  `* A1 {" k

! }8 B. p3 }" m7 R' c; Q) eD:\R2011a\bin\win32
4 z- P) J( Q7 B' ?- `5 i
# ~0 R) [# B4 Z7 ?! |" W. ID:\R2011a\extern\lib6 x5 i: H, ~; O" X! H& g# H2 ?
; b: O! s4 B' H/ }% d
C:\Users\lenovo\Desktop\aether\aether; H1 ~/ d! S6 K2 V4 B3 x
) ]- `# X4 q# F& i/ t
D:\R2011a\extern\lib\win64\microsoft
. d  ~" Z. r4 Q3 S/ J. D$ S4 H2 W& d# j8 ~7 I
D:\R2011a\extern\lib\win32\lcc
" W) u4 ?6 G( A( C
3 ^, k  i4 S, k" I% w& m9 QD:\R2011a\extern\lib\win32\microsoft
9 X9 m4 l3 D( m0 `2 v, s# Q6 w7 i
9 O! A- T9 [# f8 f& L# Z3.c/c++中的常规里面的附加包含目录添加
3 M5 U! {! t* H: I% X5 J
, S# Z1 x: K) c/ h3 L6 \6 uD:\R2011a\extern\include
- b  b% o+ m; D- x: T7 w% `
& h* P$ |  K* C! k7 x' E, h4.连接器下面的常规中的附加库目录添加# k! G3 W( P3 \1 X
- O! C! b8 W/ t9 F2 O$ H
D:\R2011a\extern\lib\win32\microsoft
: t2 ^1 K& [( I. L1 F5 `8 X$ U7 a: a' a! X
5.连接器下面的输入中的附加依赖项添加" V' @- W) Y) M; W

* O6 f9 ]8 Y% ]* ulibeng.lib
4 J3 d6 q+ p$ G3 ]5 _3 a
. |  B- B8 `1 Z& P2 b0 e. @libmat.lib8 e& K  O. X6 U$ ~) q: a" N8 [, h
2 S3 ~/ K* Q: Y1 A3 V- D# j. R
libmex.lib/ A3 l- Y4 {' c" R& J6 N) R9 B

7 O! e8 @$ v" K/ C( P. mlibmx.lib5 |1 P0 H2 u4 ^! C
, s* w  C) `, G( h' B
mclmcrrt.lib
2 F6 d  k9 J& K" r, o1 G) l. G  Z- K
mclmcr.lib/ f3 i+ n6 m* G: ]0 ]

  X- b7 n* z+ i7 Q# N) i6 Q8 x* baetherLib.lib(这个是你自己用matlab生成的lib,前面的是matlab自身计算引擎中的lib)
# Y( t7 r4 w3 ]' y2 O+ {+ `
7 C; |( h$ ~- w: C+ k6 n在解决方案资源管理其中的头文件和资源文件中添加文件
! h! {# d& i$ n# Z, J0 s& F' Q) C
1.在头文件中添加生成的.h文件
' w5 w# W& V' p1 i2 B* [8 [2 ?* r2 P4 i* _5 i$ S
2.在资源文件中添加.lib,.dll文件0 |. p. S+ `7 f, _5 [

: u, u; E/ [4 \/ x" L( l3.然后 把.h,.lib,.dll文件拷到你新建的项目的目录下。比如我把他们放到了C:\Users\lenovo\Desktop\aether\aether里面。% U& m6 |% [* q/ d& D

/ F& a  s* a+ `0 w* g8 s/ E5 x(最好是用这个命令进行编译 mcc -W cpplib:MyAddLib -T link:lib MyAdd.m -C5 N# n! |8 g( w5 J6 ~

; ]- h' B: x% }然后把.ctf文件也拷过去。)
6 Z. [' R% _) F7 Q( @+ g+ \) x7 h  r  D
! M; X' \* w- |5 P编写代码调用dll中的函数
' s6 W" n& N6 u7 @$ |& a& K* I1 v  c: B% E( q
dll中的函数的接口形式在.h文件的最后面给出了,你可以去翻看他接口形式。这里面的函数的输入输出参数都得是mwArray对象的常引用,关于这个类请读者自己去网上搜索资料。你需要搞明白的是mwArray是matlab公司专门针对“c++调用matlab生成的dll“而设计的类,因为你包含了matlab安装目录下的这些类,所以你可以在VS里使用它们。
3 p6 E3 a/ {6 g: h4 Q8 r1 S# f$ L
下面是一段主函数的编写样例:
9 t4 X. P  w0 _# p8 X9 k5 T) v1 f/ M$ ?& s" ^, I
// newdll.cpp : 定义控制台应用程序的入口点。9 D2 l% w4 \% T  x" s

, A! C8 \# j8 |2 ^# Z//
- Y# ?6 ^5 I: N# s7 f# b, v
+ E1 O, S: p5 G#include "stdafx.h"
8 @3 z5 Q$ X! K' d; u0 @  w) S7 p4 d$ A) _3 Y% B3 J
#include% q) i; Z# u" Y& |3 B

. J$ l! B6 {+ r0 \. G, @. y#include "engine.h"
  W/ x) q. Y% P0 N! y4 B/ g3 [/ ]* C5 J! t: a- p. Z3 U
#include "mclmcr.h"
4 t4 m: X. e1 A+ K% P7 o0 X# G$ w5 y9 C! A7 m# ?& n
#include "mclcppclass.h"
8 P, B* |! S7 R2 X) _  r1 p* }5 |4 s3 A: x7 O( ~2 _* M: q
#include "libMyAdd.h"
' d* d, U# b' z+ b/ ], G% @  Y& z2 X2 I0 u
using namespace std;
6 {, h* Z# f% d8 r& i
+ S5 J6 X" B$ T& d2 Z1 h7 s* Nint _tmain(int argc, _TCHAR* argv[])1 L9 i- i% U0 ]" z

7 S9 d; C; O; J{
" n# ?+ f; l$ g7 J9 K$ V% n, R0 d1 s% m. L
if(!libMyAddInitialize())
! J  V7 O! O5 v& v- t* k& J$ h' ?0 Z% M8 F7 g
   {, R  Z: V* G4 Q. M  w
% ~1 |  {# U9 T9 Y3 F
   //initilize failed!!!"<<std::endl;8 S6 _# C- P% ?4 a7 L8 r4 \0 J
: g( X" h9 G6 b$ Y, |
    std::cout<<"错误..."<<std::endl;
4 ~6 d8 ~- ~( ~: e* R5 ^( _0 N/ s2 L# d, V, I$ q$ b
   return -1;( m- ^( L/ C3 r( D  x3 q- k
0 p7 y0 y, {- T- H3 u) r4 w" n
   }
8 S2 f. |" U5 p% |/ [
5 c* F1 Z9 P/ Q6 e double a = 6;
1 S. l! b2 a. L+ N6 u5 V5 m# R6 V" N2 X6 a0 F' F
double b = 9;
7 g) v9 p5 r7 o( O2 g: M
9 G0 _% F2 p: e" x3 n0 p9 F; hdouble c;
; O% ^9 G7 F8 `5 E* M) C1 x- O. n6 [
& b6 {! N! O4 f  J2 A6 EmwArray mwA(1, 1, mxDOUBLE_CLASS);
# [9 A. T2 s( Q+ \1 [7 g8 X7 n
mwArray mwB(1, 1, mxDOUBLE_CLASS);
- V" [6 P9 ~: }6 G" ~" f7 ^1 [
3 N# |! Z2 u5 h  H" mmwArray mwC(1, 1, mxDOUBLE_CLASS);) s2 {% H  A3 g5 a' F

/ p  x2 q0 b- h6 H4 qmwA.SetData(&a, 1);9 z1 a5 }/ L) a  o4 h9 U
! q) f: e5 ]' X7 J
mwB.SetData(&b, 1);
9 {6 V' g" ^6 z' T
! [+ ^  `6 R; A6 `$ ZMyAdd(1, mwC, mwA, mwB);
  D4 E9 f1 z3 |* B  h/ h0 f8 F8 D. D+ V0 J' b& I
c = mwC.Get(1,1);- g1 o3 n6 W. W

  U, k! A5 w- V# P" [3 z$ \: Jcout<<c<<endl;
# N. K# a: {& C( }% {1 L, T2 b4 P) ?0 u5 @
system("PAUSE");, M) |3 F; A) O$ Y2 h0 t

( n5 G& s) f. ?; }" A; O/ ^ return 0;
0 r  U8 @( E8 k& f! w8 R: k" k* b$ f' w9 x* m( w
}
1 q+ Z* x: Z2 R% A! f( C
9 `  q- A" k$ Q/ H4 v8 e, x3 u这个dll中的函数只是实现了一个简单的两数相加的功能,是我做基本配置是使用的。3 B$ c5 m4 R2 k
$ Q- S: _7 u- R. I( C
#include "engine.h"
2 Q5 e/ K9 x; X  V$ C
& [6 e, h  ^* p+ ~* V( q#include "mclmcr.h"
- ^; F, R% P9 N. ^
+ W  Z, o8 r! _0 B- V#include "mclcppclass.h"
7 o5 U9 |1 d8 H; t6 B5 J. c  q( \+ f: ^3 l: j
#include "libMyAdd.h"       这些头文件是必须包含的,其中engine好像是包含了matlab计算引擎中的所有dll(还没有认真考证)
% F& R% |6 l' u4 [2 \
' q! j+ ~; X3 T4 K6 Q0 H% B现在,运气好的话你应该能看到你预想中的输出了。如果出现了问题,比如找不到路径,不可访问等等各种错误,那只能你自己去解决了,我搞了整整3天,上面提到的错误都有遇到。  出了错误你可以尝试去百度搜索其他博客,更好的是去google用英文搜索相关的问题,一些社区里面也许有答案呢,matlab版主文档我倒是没仔细看,也许上面也有不错的帮助呢! good luck  to you!1 ~) ]0 |' n4 k. k4 T0 I1 A3 c% ]

' @' x- c7 o/ K. ^2 I备注:
! r4 T  r6 o9 T( m( c0 w& m2 g2 M  ~
/ i( `) \# S  m- X1.我自己在搞的时候,遇到的问题是.m函数中本身就使用了c++语言编写的dll,然后再封装这个.m函数。这种情况下你得保证VS可以访问到你用到的那些用C++书写的dll。但是只要用mcc命令编译.m函数后,你在连接器下面的输入中的附加依赖项中只需添加.m 生成的dll函数就可以了,不需要添加那些c++代码生成的dll。这里建议你把matlab项目拷到VS项目中,直接在Vs项目中工作进行MCC编译。; X6 `9 F9 Z4 S
( J0 k1 ?3 U& U2 W! R- r0 S/ U
2.主函数代码中if(!libMyAddInitialize())是必须的。
" o+ w7 j1 w2 |; C' J1 {) K4 a& K1 s. i

该用户从未签到

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

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-5 21:19 , Processed in 0.156250 second(s), 27 queries , Gzip On.

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

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

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