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

最近需要在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。


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


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




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


4、进行项目必要的设置(注意这里和VC2005有较大不同)。vc主界面进入project>Settings,点C/C++选项卡,Category选择Preprocessor,Additional  include directories下填入如下路径

  1. F:/MATLAB/R2010b/extern/include
复制代码

(注意2010b下该路径和之前也有不同)。


点“link”选项卡,Category选择General,在下面的Object/library modules 那栏的最后添加

  1. libmyadd2.lib mclmcrrt.lib
复制代码

两个库之间以及和其他库以空格隔开。


然后Category选择input,Additional  library path下填写:

  1. F:/MATLAB/R2010b/extern/lib/win32/microsoft
复制代码

,点击OK。


至此配置完毕


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.  
  9.         // initialize lib
  10.         if( !libmyadd2Initialize())
  11.         {
  12.                 std::cout << "Could not initialize libmyadd2!" << std::endl;
  13.                 return -1;
  14.         }
  15.  
  16.         try
  17.         {
  18.         // declare and initialize a
  19.         mwArray a(2, 2,  mxDOUBLE_CLASS);
  20.         double *aData;
  21.         aData = new double[4];
  22.         int i;
  23.         for( i=0; i<4; ++i)
  24.         {
  25.                 aData[i] = 1.0*i;
  26.         }
  27.         // print output
  28.         std::cout << "a = " << std::endl;
  29.         std::cout << aData[0] << ",/t" << aData[1] << std::endl;
  30.         std::cout << aData[2] << ",/t" << aData[3] << std::endl;
  31.  
  32.         a.SetData(aData, 4);
  33.  
  34.         // declare and initialize b
  35.         mwArray b(2, 2,  mxDOUBLE_CLASS);
  36.         b(1,1) = 11.;
  37.         b(1,2) = 12.;
  38.         b(2,1) = 21.;
  39.         b(2,2) = 22.;
  40.  
  41.         mwArray y(2, 2,  mxDOUBLE_CLASS);
  42.         mwArray z(2, 2,  mxDOUBLE_CLASS);
  43.  
  44.         // call the function
  45.                 myadd2(2, y, z, a, b);
  46.  
  47.         // copy data from mwArray to C++ objects
  48.  
  49.         // allocate outputs
  50.         double *yData, *zData;
  51.         yData = new double[4];
  52.         if( yData == NULL )
  53.         {
  54.                 std::cout << "Failed to allocate memory for yData!" << std::endl;
  55.                 return -1;
  56.         }
  57.  
  58.         zData = new double[4];
  59.         if( zData == NULL )
  60.         {
  61.                 std::cout << "Failed to allocate memory for zData!" << std::endl;
  62.                 return -1;
  63.         }
  64.  
  65.         // copy data from mwArray to C++
  66.         y.GetData(yData, 4);
  67.         z.GetData(zData, 4);
  68.  
  69.         // print output
  70.         std::cout << "y = " << std::endl;
  71.         std::cout << yData[0] << ",/t" << yData[1] << std::endl;
  72.         std::cout << yData[2] << ",/t" << yData[3] << std::endl;
  73.  
  74.         std::cout << "z = " << std::endl;
  75.         std::cout << zData[0] << ",/t" << zData[1] << std::endl;
  76.         std::cout << zData[2] << ",/t" << zData[3] << std::endl;
  77.  
  78.         
  79.         // deallocate memory
  80.         delete [] aData;
  81.         delete [] zData;
  82.         delete [] yData;
  83.         }
  84.         catch( const mwException& e)
  85.         {
  86.           std::cerr << e.what() << std::endl;
  87.                   
  88.         }
  89.         // terminate the lib
  90.         libmyadd2Terminate();
  91.  
  92.         // terminate MCR
  93.         mclTerminateApplication();
复制代码

至此可以编译运行了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值