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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
matlab封装DLL动态链接库 再用VS2010调用(matlab VS混合编程)(转载) ! k  h4 O/ t9 {* I9 V; c

% M3 p, y% W7 V8 C- z整个配置调试过程使用的环境为matlab2011a(version 7.12.0.635),VS2010,操作系统是window7
' d+ l. |0 V" F0 T8 T( o
2 `" b; B& {. T3 g( r) C9 c/ \! L一,设置操作系统的环境变量。
2 t2 K  @* v0 N; ~5 a3 K
0 O1 M& Y& a' C, k$ H4 M系统变量增加D:\R2011a\bin\win32;D:\R2011a\bin和E:\Microsoft VisualStudio 10.0\VC\bin,这个分别是我的机器上matlab和VS安装目录下的路径。9 E* Y% d6 l7 {0 V4 a
5 R2 C# U' S% u: v3 ~
系统变量设置完毕后需要重新启动计算机方能生效。, v% o7 d7 H3 u& |0 I  J  L% q9 T
7 p; o# y. G; O  g6 a0 l/ Q3 v' v
二,设置matlab的编译环境1 A' y& l: B! @
3 G5 X5 e) j0 F* X8 n
在matlab中输入命令mex -setup,选择Microsoft Visual C++ 2010
5 ~# F9 b* w9 ], E
& \% d, v1 E0 S# v% U再输入命令mbuild -setup 同样选择Microsoft Visual C++ 2010- E, N3 m3 U% X# |. [' i
3 B. C' U& w" r) q+ \! E6 z% L
p.s. 这一步中,在我自己配置的过程中,matlab可以很容易的识别出机器上装有的编译器以及他们的安装路径,其中包括VS2010,选择它就是了。也许有的环境下matlab不一定能找出VS2010中的VC编译器,这个怎么解决就不知道了。
7 T- p$ I/ c$ }% J$ |) x7 q7 v
三,matlab编译.m文件( O6 D4 T$ n9 G! u" q: c1 S
5 l4 e: C5 p% P' E, @( p4 k7 h
输入mcc -W cpplib:youRFunLib -T link:lib yourfun.m
9 D/ t: b  H% I, \: f
# W1 @- g1 e3 Y" |$ x; S其中,yourfunLib是生成的DLL,Lib的前缀名字,也就是你最后可以是使用的DLL以及Lib库的名字;yourfun是你需要编译的.m函数。
- R/ @. j7 [4 P+ I' C# k; k* B  f4 w% v
编译完成后得到了下图中的一些文件:" L" q9 ^5 {; B2 [* i

7 A% G# @( B$ m9 K . ], N4 O% ]% w7 V
1 I' J  _. {9 Q4 K' h, b3 I9 ~  a! A
这些文件中后缀为DLL,LIB,H的文件在VS调用的时候有用,其他文件目前没有使用。(这里我把yourfunLib指定为aetherLib了)3 s  j. P! b) w0 r' U
7 h2 n* I& `7 p* c  ^. b2 q
四,VS2010 的配置
' j9 U3 U8 e, S% Y5 y; d5 B2 t& O) K+ n0 @1 h
新建一个控制台项目。# g0 X, I' ~. M+ K" X# b

' |1 r! ?% r* H1 \  b打开项目的属性页,针对这个项目做如下的设置:
5 d6 Y0 D: G5 f' A$ h! J( r+ A# \1 f: g
1.VC++目录下的包含目录添加
0 U! y0 Y& m8 p% }9 B% {. n+ D
; }$ X5 f! ?; vD:\R2011a\extern\include(matlab安装目录下的路径)
* l% y: F/ J) G4 b, r, _1 c, \9 y0 A5 L. h3 p7 I/ j; a- G% H8 M, f7 ~
D:\R2011a\extern\include\win32  (matlab安装目录下的路径,下同)% q2 x& u5 w9 o+ {( h
) X8 T. t# D( B: d
C:\Users\lenovo\Desktop\aether\aether  (你自己新建的项目中的路径,下同)4 K# u1 O& \/ h+ }2 O

6 {% I) |8 [6 B8 ~2 k( D3 Y2.VC++目录下的库目录添加. q) f% X/ L' W$ N3 R
; x( b& o, t$ g
D:\R2011a\bin\win32
# H& _% ]$ K! g( n' C% f# H/ v; ^: x6 r3 M  V; i- Q4 _
D:\R2011a\extern\lib
2 r& I- ]' h5 E# o) F* e$ O" D
; Q2 K0 ^: [& R: m% w, PC:\Users\lenovo\Desktop\aether\aether/ J4 A8 `* z) Y1 \

$ L8 k/ S3 F+ f" M" H( aD:\R2011a\extern\lib\win64\microsoft) q6 s5 W# q2 m- i! ^

- `& h. h2 v& C- U& n+ K( X. T* w8 LD:\R2011a\extern\lib\win32\lcc8 ]! S3 q+ s4 c! q

# ~( c1 e! C( N/ A' V& r% yD:\R2011a\extern\lib\win32\microsoft
/ y& y) ~2 n: O4 ^& k
' h3 O7 I; e0 y4 \$ O3 f3.c/c++中的常规里面的附加包含目录添加
1 u7 D$ `3 t7 k. s! j. ]: S. @
: c4 s, F) _: H' tD:\R2011a\extern\include
. P+ z) u$ r0 g( k  b9 f7 g8 ^
) b4 b$ |. v- n6 Y2 u! o+ d4.连接器下面的常规中的附加库目录添加& K+ m6 c1 c# K  {: u

! P( d5 h7 U. z3 j( U7 VD:\R2011a\extern\lib\win32\microsoft8 f6 O4 X' P3 B7 a) X9 U/ U; V$ o/ n
5 o' m' @; S- {. U# r
5.连接器下面的输入中的附加依赖项添加$ z  r3 T5 {0 X0 _

3 u# L. w& Z% o% R% I1 Wlibeng.lib
, x9 R  \! I% Q3 U
, X( B0 R% E/ |' A( ~# Tlibmat.lib" z; ^) b- t3 d3 n- f- N  t) K3 j
, ]# S8 \# {0 p. ^5 E. A
libmex.lib5 t2 l$ m6 H* [6 u; d3 f
+ x$ \6 _* m- H6 p& U; r9 z6 d
libmx.lib
4 p5 O+ {- z0 K: f" |! V7 A. p
, g5 y* V! j/ c) V, B" a0 ?mclmcrrt.lib! V* ~. ?8 i: [9 O+ z# e/ L# u2 T* {
$ T5 ^) i1 z9 H' |6 w/ z
mclmcr.lib
3 @* ^. V* |+ m, @
8 [: m4 z  I2 W1 j, s8 v6 L5 haetherLib.lib(这个是你自己用matlab生成的lib,前面的是matlab自身计算引擎中的lib)
7 u/ C  i4 y) q: H0 \' d' [& N4 g/ N3 A) D+ c1 x3 u: ]) n
在解决方案资源管理其中的头文件和资源文件中添加文件
" M; k9 c  P& o& c* c  v) K) D. K, }6 S; F7 _- b
1.在头文件中添加生成的.h文件1 Q9 U8 F7 l" E7 \. R
# S* Y% y$ O2 d. W2 x6 A" o0 n
2.在资源文件中添加.lib,.dll文件
2 c+ Y! a% j+ F" Z. L: Y( u' \# I
3.然后 把.h,.lib,.dll文件拷到你新建的项目的目录下。比如我把他们放到了C:\Users\lenovo\Desktop\aether\aether里面。
. M7 q$ X# p/ Z% }
/ J# |6 z5 h4 J2 w2 C" z# o(最好是用这个命令进行编译 mcc -W cpplib:MyAddLib -T link:lib MyAdd.m -C
& d6 e# d2 ]* }4 L+ \8 c- Q2 {/ G2 v" d
然后把.ctf文件也拷过去。)6 N0 C, V+ G  @# S" I
+ O2 a9 r& \7 Q: o' e( |* p
编写代码调用dll中的函数! F& `$ O/ i0 Y7 l" j: a. J
! C* K) \3 p. s- d7 S- [
dll中的函数的接口形式在.h文件的最后面给出了,你可以去翻看他接口形式。这里面的函数的输入输出参数都得是mwArray对象的常引用,关于这个类请读者自己去网上搜索资料。你需要搞明白的是mwArray是matlab公司专门针对“c++调用matlab生成的dll“而设计的类,因为你包含了matlab安装目录下的这些类,所以你可以在VS里使用它们。
+ u( E# h+ y* B, M: i( c4 G1 X1 e2 x# \+ f
下面是一段主函数的编写样例:! K" A  m3 T  q  R( {$ q3 l

" k. B3 J. P4 {4 o2 N8 r) e// newdll.cpp : 定义控制台应用程序的入口点。, d1 {* x/ L6 J. R- A8 Y  z- |
+ N/ ~; ~1 F1 O& R! J) E* {
//6 F" p! |5 w  R, m& F
7 b7 d% j/ v; d' j: y. M: u3 G9 f
#include "stdafx.h"
0 ]1 D5 z* i7 B6 q& J2 l/ V# l5 r) I2 f/ Q4 j' z
#include
; L- S2 c7 L4 z: n- q. M  Y' G6 U
$ [  b6 c. @! ^2 P+ v#include "engine.h"' R: n" ~0 P, S* N- F

1 W& H% p5 H4 C#include "mclmcr.h"
' U2 g# C$ v/ N% Z  O% x: |6 l4 Z6 C/ h& \5 \' m$ y+ t
#include "mclcppclass.h", u( x- ]6 j  `
7 }/ o. u. K2 o9 }% o
#include "libMyAdd.h"
1 _2 i. \- w5 N/ M4 V
9 c" O3 B5 S, t- A; E; r8 Vusing namespace std;7 q* M8 Q" X; Z+ ], X  n8 @6 ^
( D* F9 l  W1 b" |
int _tmain(int argc, _TCHAR* argv[])& x# Q9 k+ y5 a" l3 R2 S
# x" o( x# }/ G
{
# t* I% s8 k* Y, K! Z6 x# Y
. e' V/ v' x# Q3 k if(!libMyAddInitialize())
) G, G( v# n1 d$ U1 G" e+ y% P% c3 L
   {6 L- c& D0 d: h1 W) I" V9 y2 X
$ ^8 O7 h- e" c
   //initilize failed!!!"<<std::endl;1 L% {6 K- ~6 L/ f0 M2 I8 y; m8 x

8 x; @% C' _( h7 V: ~4 {    std::cout<<"错误..."<<std::endl;* l' R( i9 I! L; _
2 @+ }! y$ H# b; \
   return -1;/ o6 s! a; P5 _+ B2 V3 w6 Z& l
/ A' h3 R  D  u+ D8 X
   }
! h6 h  Q; r0 g% f; Y
* J( ?0 R& R, f& f3 m double a = 6;3 y3 R* e" j! z9 A

) M7 Z, s% d' K- K3 M' O5 x$ @double b = 9;
& \: l, N5 e3 F, L+ [; V% J: r, {3 H/ B. A8 z9 P, u% C# T8 a
double c;
" Y( n- K( P3 b+ Q" y
7 @; R3 i$ T$ D9 k3 m& CmwArray mwA(1, 1, mxDOUBLE_CLASS);/ z  h9 Z" A- o2 F* S
1 h, I' m% h% i! g1 D( |' \! N; {
mwArray mwB(1, 1, mxDOUBLE_CLASS);8 P$ x0 z! s/ ]2 L# Y, |5 J# H# T" ~, ^
# N; C( l$ m- F2 m9 O4 ]
mwArray mwC(1, 1, mxDOUBLE_CLASS);# ^5 P( r6 w- }

* L0 k# {6 u" p* g* `; z4 X3 JmwA.SetData(&a, 1);
! ~! D2 @4 j5 R' s
/ m2 I7 E1 ~9 omwB.SetData(&b, 1);
% r4 B# P  h/ n' f) }, O6 o- }" j" J& t/ d9 ^2 C' [" [2 B
MyAdd(1, mwC, mwA, mwB);, N( v9 N8 I  o% y* e# I  z6 G
) H  Z( i" l* a% i& [! s7 Y" \
c = mwC.Get(1,1);6 Z, W) D. k$ P0 K. b0 F! d
8 s& k; h& W5 z7 z7 d
cout<<c<<endl;
5 P) A4 r" ?, C9 f9 `- n" o- u" K$ N3 d
system("PAUSE");- y1 Z# v5 M& N! A

$ n& K0 ^+ ?" e return 0;
$ o( S" y4 w+ x! r7 g. [( a' @' h5 p1 A  f
}( G' {0 S  U6 C" P. `3 Z- X
: g3 D+ @  F* m6 h+ v( x
这个dll中的函数只是实现了一个简单的两数相加的功能,是我做基本配置是使用的。7 V3 g' |' E+ l, E& T( d
* N, W! e: z/ y' t1 H
#include "engine.h"
$ D/ s/ R% l+ y* t9 a/ e5 \, u1 m# O
#include "mclmcr.h"
+ K$ x/ v4 Z* V- K: e) k: g
: Q# @, R8 p- v( A  |7 E' p#include "mclcppclass.h"2 R3 p; r# d9 {
+ v! v& l4 F" p  R( X8 I" e5 \: D
#include "libMyAdd.h"       这些头文件是必须包含的,其中engine好像是包含了matlab计算引擎中的所有dll(还没有认真考证); O) ], x  i2 D: ?, P$ e

/ h9 v3 d+ Z' Z+ P4 D0 y* H现在,运气好的话你应该能看到你预想中的输出了。如果出现了问题,比如找不到路径,不可访问等等各种错误,那只能你自己去解决了,我搞了整整3天,上面提到的错误都有遇到。  出了错误你可以尝试去百度搜索其他博客,更好的是去google用英文搜索相关的问题,一些社区里面也许有答案呢,matlab版主文档我倒是没仔细看,也许上面也有不错的帮助呢! good luck  to you!
/ _+ G" Y/ d, P( _4 P' b1 x9 H, `6 [8 L& V
备注:
7 {- [. v+ R/ K6 J5 q. }% S; n, _) ^, T4 G( ?! y# R8 B, l" j0 t: O9 u) K0 d- M
1.我自己在搞的时候,遇到的问题是.m函数中本身就使用了c++语言编写的dll,然后再封装这个.m函数。这种情况下你得保证VS可以访问到你用到的那些用C++书写的dll。但是只要用mcc命令编译.m函数后,你在连接器下面的输入中的附加依赖项中只需添加.m 生成的dll函数就可以了,不需要添加那些c++代码生成的dll。这里建议你把matlab项目拷到VS项目中,直接在Vs项目中工作进行MCC编译。
; s) r" v5 @6 }$ H. [
& _3 ~& S2 S( l6 Y( h 2.主函数代码中if(!libMyAddInitialize())是必须的。
3 J$ ?( O% S( ?5 w3 ~& `4 r  }2 l

该用户从未签到

3#
发表于 2020-1-7 18:06 | 只看该作者
用VS2010调用matlab封装DLL动态链接库

该用户从未签到

2#
发表于 2020-1-6 18:40 | 只看该作者
看完只有一种感觉:学海无涯啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-24 02:15 , Processed in 0.156250 second(s), 28 queries , Gzip On.

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

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

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