每日签到积分充值书码绑定

MATLAB技术论坛

 找回密码
 注册帐号

QQ登录

只需一步,快速开始

查看: 7494|回复: 16

[教程] 程序中使用MATLAB编译产生的DLL (VC6.0, MATLAB R2010b, mwArray)     [复制链接]

Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25

该用户从未签到

UID
716
主题
12
帖子
608
积分
2426
威望
45
贝壳
805
贡献
1593

管理团队 技术小组 年度人物

发表于 2010-9-14 19:27:30 |显示全部楼层 | 百度  谷歌 |
本帖最后由 rocwoods 于 2010-9-15 10:19 编辑

最近需要在VC下调用MATLAB的dll,以前没怎么接触过这些,今天特地摸索了一下。主要借鉴的是taohe兄的这篇帖子:http://forum.simwe.com/thread-801187-1-1.html
但不同的是我现在用的MATLAB是R2010b,而VC是6.0,两个产品时间间隔达10多年之久。taohe兄的实验环境是vs2005,MATLAB 2007b两个产品时间间隔还是比较接近的。
之前按照taohe兄帖子里的步骤实现,发现总是无法成功,出现N多各种奇怪错误,譬如:error C2065: 'mclInitializeApplication_proxy' : undeclared identifier 之类的奇怪错误提示(后来才知道这是 2008a以后,Mathworks公司对mclmcrrt.h 和 mclmcr.h头文件做了修改,要求mclmcr.h必须include在mclmcrrt.h之后。)
现将操作步骤写下:
1、编写测试m函数,这个不变,即如下:
  1. function [y,z] = myadd2(a, b)
  2. % dummy function, just to demonstrate the idea
  3. y = a+b;
  4. z = a+2*b;
  5. end
复制代码
2、运行mbuild -setup设置好编译器后(我选的是vc6.0的编译器,没用MATLAB自带的),利用
  1. mcc -W cpplib:libmyadd2 -T link:lib myadd2.m -C
复制代码
生成需要的libmyadd2.dll,libmyadd2.h,libmyadd2.lib,libmyadd2.ctf文件。(注意,R2010b下,mcc -W cpplib:libmyadd2 -T link:lib myadd2.m不再生成libmyadd2.ctf文件,需加-C选项)
3、VC下新建控制台程序,步骤如下:file>new,选择Win32 Console Application,右侧project name 填写
  1. testmyadd2_r2010b
复制代码
,点击OK。 1.jpg

在下一个界面选“a simple application”finish点OK。 2.jpg

至此程序框架搭好,将libmyadd2.dll,libmyadd2.h,libmyadd2.lib和libmyadd2.ctf复制到testmyadd2_r2010b工程目录下。
3.jpg


并将libmyadd2.h添加到Header files组内。 4.jpg

4、进行项目必要的设置(注意这里和VC2005有较大不同)。vc主界面进入project>Settings,点C/C++选项卡,Category选择Preprocessor,Additional  include directories下填入如下路径
  1. F:\MATLAB\R2010b\extern\include
复制代码
(注意2010b下该路径和之前也有不同)。 5.jpg

点“link”选项卡,Category选择General,在下面的Object/library modules 那栏的最后添加
  1. libmyadd2.lib mclmcrrt.lib
复制代码
两个库之间以及和其他库以空格隔开。 6.jpg

然后Category选择input,Additional  library path下填写:
  1. F:\MATLAB\R2010b\extern\lib\win32\microsoft
复制代码
,点击OK。 7.jpg

至此配置完毕
5、打开testmyadd2_r2010b.cpp文件,在#include "stdafx.h"后添加
  1. #include <iostream>
  2. #include "libmyadd2.h"
复制代码
(注意这里不再需要include  "mclmcr.h"和"mclcppclass.h"了,因为2010b生成的"libmyadd2.h"已经包含这两个头文件了)。之后在main函数里
  1. return 0
复制代码
这句上面添加如下代码:
  1. std::cout << "Hello world!" << std::endl;
  2.         /* Initialize the MCR */
  3.         if( !mclInitializeApplication(NULL,0) )
  4.         {
  5.                 std::cout << "Could not initialize the application!" << std::endl;
  6.                 return -1;
  7.         }

  8.         // initialize lib
  9.         if( !libmyadd2Initialize())
  10.         {
  11.                 std::cout << "Could not initialize libmyadd2!" << std::endl;
  12.                 return -1;
  13.         }

  14.         try
  15.         {
  16.         // declare and initialize a
  17.         mwArray a(2, 2,  mxDOUBLE_CLASS);
  18.         double *aData;
  19.         aData = new double[4];
  20.         int i;
  21.         for( i=0; i<4; ++i)
  22.         {
  23.                 aData[i] = 1.0*i;
  24.         }
  25.         // print output
  26.         std::cout << "a = " << std::endl;
  27.         std::cout << aData[0] << ",\t" << aData[1] << std::endl;
  28.         std::cout << aData[2] << ",\t" << aData[3] << std::endl;

  29.         a.SetData(aData, 4);

  30.         // declare and initialize b
  31.         mwArray b(2, 2,  mxDOUBLE_CLASS);
  32.         b(1,1) = 11.;
  33.         b(1,2) = 12.;
  34.         b(2,1) = 21.;
  35.         b(2,2) = 22.;

  36.         mwArray y(2, 2,  mxDOUBLE_CLASS);
  37.         mwArray z(2, 2,  mxDOUBLE_CLASS);

  38.         // call the function
  39.                 myadd2(2, y, z, a, b);

  40.         // copy data from mwArray to C++ objects

  41.         // allocate outputs
  42.         double *yData, *zData;
  43.         yData = new double[4];
  44.         if( yData == NULL )
  45.         {
  46.                 std::cout << "Failed to allocate memory for yData!" << std::endl;
  47.                 return -1;
  48.         }

  49.         zData = new double[4];
  50.         if( zData == NULL )
  51.         {
  52.                 std::cout << "Failed to allocate memory for zData!" << std::endl;
  53.                 return -1;
  54.         }

  55.         // copy data from mwArray to C++
  56.         y.GetData(yData, 4);
  57.         z.GetData(zData, 4);

  58.         // print output
  59.         std::cout << "y = " << std::endl;
  60.         std::cout << yData[0] << ",\t" << yData[1] << std::endl;
  61.         std::cout << yData[2] << ",\t" << yData[3] << std::endl;

  62.         std::cout << "z = " << std::endl;
  63.         std::cout << zData[0] << ",\t" << zData[1] << std::endl;
  64.         std::cout << zData[2] << ",\t" << zData[3] << std::endl;

  65.         
  66.         // deallocate memory
  67.         delete [] aData;
  68.         delete [] zData;
  69.         delete [] yData;
  70.         }
  71.         catch( const mwException& e)
  72.         {
  73.           std::cerr << e.what() << std::endl;
  74.                   
  75.         }
  76.         // terminate the lib
  77.         libmyadd2Terminate();

  78.         // terminate MCR
  79.         mclTerminateApplication();
复制代码
至此可以编译运行了。
已有 2 人评分威望 贝壳 贡献 收起 理由
faruto + 6 + 8 + 8 顶了。O(∩_∩)O~
dynamic + 2 + 5 好东西一定要顶

总评分: 威望 + 8  贝壳 + 13  贡献 + 8   查看全部评分

本科

大侠

Rank: 5Rank: 5Rank: 5

签到天数: 13 天

[LV.3]偶尔看看II

UID
52616
主题
3
帖子
593
积分
1488
威望
0
贝壳
439
贡献
839
发表于 2010-10-5 21:14:32 |显示全部楼层
我看不错噢 谢谢楼主 > "" “” '
我想我是一天也不能离开MATLAB技术论坛。

道具 举报

Rank: 3

该用户从未签到

UID
21470
主题
3
帖子
160
积分
484
威望
0
贝壳
113
贡献
419

在线达人

发表于 2010-10-13 13:52:27 |显示全部楼层
MATLAB技术论坛"有偿编程担保制度" "技术团队资格认证""官方有偿编程团队",保证您有偿编程安全。
不错啊,谨受教,谢谢!!!!

道具 举报

Rank: 15Rank: 15Rank: 15

该用户从未签到

UID
3561
主题
105
帖子
203
积分
1876
威望
10
贝壳
589
贡献
1118
发表于 2010-10-23 09:37:24 |显示全部楼层

道具 举报

Rank: 1

该用户从未签到

UID
73073
主题
0
帖子
11
积分
32
威望
0
贝壳
0
贡献
17
发表于 2010-10-31 16:00:27 |显示全部楼层
MATLAB技术论坛"有偿编程担保制度" "技术团队资格认证""官方有偿编程团队",保证您有偿编程安全。
谢谢了,需要这方面的内容,只是我用VC给simulink编个界面

道具 举报

Rank: 3

该用户从未签到

UID
29071
主题
0
帖子
70
积分
301
威望
0
贝壳
126
贡献
155
发表于 2010-11-18 09:39:18 |显示全部楼层

道具 举报

副校长

云是风的梦

Rank: 15Rank: 15Rank: 15

该用户从未签到

UID
43602
主题
17
帖子
1097
积分
4232
威望
127
贝壳
1274
贡献
2886

雷锋转世 原创先锋 在线达人

发表于 2010-12-3 01:08:29 |显示全部楼层
MATLAB技术论坛"有偿编程担保制度" "技术团队资格认证""官方有偿编程团队",保证您有偿编程安全。
感谢rocwoods啊 哈哈 ...明天继续编译

道具 举报

Rank: 1

该用户从未签到

UID
78944
主题
0
帖子
5
积分
16
威望
0
贝壳
2
贡献
11
软件版本
R2010a(7.10)
研究领域
技术计算
发表于 2011-3-1 13:14:50 |显示全部楼层

道具 举报

Rank: 1

该用户从未签到

UID
84376
主题
1
帖子
24
积分
69
威望
0
贝壳
21
贡献
34
软件版本
R2009a (7.8)
研究领域
技术计算
发表于 2011-5-7 20:36:25 |显示全部楼层
MATLAB技术论坛"有偿编程担保制度" "技术团队资格认证""官方有偿编程团队",保证您有偿编程安全。
请问为什么我的程序没有报错,但是没有出现任何结果呢???请牛人帮忙解答一下

道具 举报

Rank: 1

签到天数: 1 天

[LV.1]初来乍到

UID
118883
主题
0
帖子
4
积分
13
威望
0
贝壳
3
贡献
8
软件版本
R2007a
研究领域
科学计算
发表于 2011-6-20 16:43:23 |显示全部楼层
请问function [y,z] = myadd2(a, b)中

定义的变量a,b可不可以是函数式,例如a=sin(x^2),如果可以那么VB或VC调用的时候怎么设置?
还有如果有返回值,那么VB怎么调用这个dll呢?

道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

关闭

站长推荐

MATLAB技术论坛数据挖掘公开课开课啦!
MATLAB技术论坛数据挖掘公开课开课啦!
MATLAB技术论坛将为大家奉献N期MATLAB数据挖掘公开课。公开课的安排为综合篇+专题篇,现在第一期数据挖掘概论已经出来了,更多视频敬请关注。。。

查看 »

网站简介 | 发展历程 | 特色业务 | 管理团队 | 免责声明 | 广告服务 | 联系我们 | 付款方式 | 友情链接 | 帮助中心

商务合作:455681698   服务邮箱:matlabsky@gmail.com   支付宝:yuthreestone@163.com

合作站点:数模联盟 函数百科 网上商城   出版单位:北航出版社 道然科技   开发平台:Discuz! X2

CopyRight © 2008-2012 迈粉网 ( 陕ICP备08102094号 ) All Rights Reserved

排行热榜|网站地图|手机浏览|管理邮箱||     

GMT+8, 2012-5-19 05:20 , Processed in 0.235338 second(s), 32 queries , Gzip On, Xcache On.

回顶部