博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[教程] 程序中使用MATLAB编译产生的DLL (VC6.0, MATLAB R2010a, mwArray)
阅读量:2174 次
发布时间:2019-05-01

本文共 3837 字,大约阅读时间需要 12 分钟。

地址

最近需要在VC下调用的dll,以前没怎么接触过这些,今天特地摸索了一下。主要借鉴的是taohe兄的这篇帖子:
但不同的是我现在用的MATLAB是R2010a,而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();
复制代码

至此可以编译运行了。

注意一点的话(1),其实matlab2010a在进行mex -setup 和 mbuild -setup后,已经把 matlabroot\extern\include和matlabroot\extern\lib\win32\microsoft加入到了VC6.0中去了,如果没有的话,可以通过Tools->Options->Directories->show directories for 中的Include files和library files添加路径;

(2)在添加libmyadd2.lib和mclmcrrt.lib是可以使用

#pragma comment(lib, "libmyadd2.lib")

#pragma comment(lib, "mclmcrrt.lib")

运行结果:

你可能感兴趣的文章
行为型模式之策略模式(Strategy)
查看>>
行为型模式之模板方法模式(TemplateMethod)
查看>>
行为型模式之访问者模式(Visitor)
查看>>
大小端详解
查看>>
source insight使用方法简介
查看>>
<stdarg.h>头文件的使用
查看>>
C++/C 宏定义(define)中# ## 的含义 宏拼接
查看>>
Git安装配置
查看>>
linux中fork()函数详解
查看>>
C语言字符、字符串操作偏僻函数总结
查看>>
Git的Patch功能
查看>>
分析C语言的声明
查看>>
TCP为什么是三次握手,为什么不是两次或者四次 && TCP四次挥手
查看>>
C结构体、C++结构体、C++类的区别
查看>>
进程和线程的概念、区别和联系
查看>>
CMake 入门实战
查看>>
绑定CPU逻辑核心的利器——taskset
查看>>
Linux下perf性能测试火焰图只显示函数地址不显示函数名的问题
查看>>
c结构体、c++结构体和c++类的区别以及错误纠正
查看>>
Linux下查看根目录各文件内存占用情况
查看>>