先小话一下DLL,DLL是动态链接库,是源代码编译后的二进制库文件和程序接口,和静态链接库不同的是,程序在编译时并不链接动态链接库的执行体,而是在文件中保留一个调用标记,在程序运行时才将动态链接库文件加载入内存。并且DLL在运行时是共享的,即当多个程序调用时,内存中也只保持一份动态链接库。
  动态链接库的调用有显式和隐式两种方式。
  隐式链接需要用到我们前面生成的plotdata.c,plotdata.h,plotdata.lib以及plotdata.dll文件。
  首先将plotdata.c,plotdata.h加入工程中,注意在需要用到函数的文件加入#include "plotdata.h".
  之后链接输入项中写上plotdata.lib.右击工程->Propertites->Link->Input->Additional Dependecies中加上plotdata.lib(也就是在调用MATLAB引擎时填写libmat.lib、libeng.lib等的地方)注意plotdata.lib也需要放在你的工程下,或者写全路径,如"D:\data\plotadata.lib",需要加引号。
  这样在你的代码中就可以直接用plotdata.h中的接口函数了。
  另显式链接的方式:所谓"显式"说白了就是在代码中写出来我要调用这个DLL.
  首先我们需要定义一个函数类型,方便我们后面进行函数的强制类型转换。我们可以在plotdata.h中找到我们将要使用的函数plotdata,他的函数声明如下:
  extern LIB_plotdata_CPP_API void MW_CALL_CONV plotdata(const mwArray& rgbData);
  忽略那些复杂的宏定义,模仿着定义我们自己的函数类型:
  typedef void (*HMAT)(const mwArray& rgbData);
  之后在代码中显式链接plotdata.dll
  HINSTANCE hDLL=NULL;//DLL句柄
  hDLL=LoadLibrary("plotdata.dll");
  HMAT plotData=(HMAT)GetProcAddress(hDLL,"plotdata");
  //第一个参数为DLL句柄,第二个为要加载的函数名
  之后便可直接在代码中直接使用函数plotData了。这种显式链接只需要plotdata.dll文件即可~
  下面我们来看一下生成的函数接口
  extern LIB_plotdata_C_API
  bool MW_CALL_CONV plotdataInitializeWithHandlers(
  mclOutputHandlerFcn error_handler,
  mclOutputHandlerFcn print_handler);
  extern LIB_plotdata_C_API
  bool MW_CALL_CONV plotdataInitialize(void);
  extern LIB_plotdata_C_API
  void MW_CALL_CONV plotdataTerminate(void);
  extern LIB_plotdata_C_API
  void MW_CALL_CONV plotdataPrintStackTrace(void);
  extern LIB_plotdata_C_API
  bool MW_CALL_CONV mlxPlotdata(int nlhs, mxArray *plhs[], int nrhs, mxArray *prhs[]);
  extern LIB_plotdata_C_API
  long MW_CALL_CONV plotdataGetMcrID();
  extern LIB_plotdata_C_API bool MW_CALL_CONV mlfPlotdata(mxArray* rgbData);
  这是plotdata.h中主要的函数。plotdataInitialize(void)可以看出是初始化的函数。如果是隐式链接DLL最好先调用此函数,判断返回值否则很可能加载不到dll,而在显式链接时,如果没有加载函数成功,也不会直接报错,但我们可以在单步调试时看函数是否为分配了内存(即是否为null)。plotdataTerminate(void)是终止动态链接库的函数。
  mlxPlotdatat与mlfPlotdata是最关键的两个接口,也是我们要加载的函数。他们执行的功能与m文件中plotdata函数是一样的。两个函数输入参数不同:
  mlxPlotdata(int nlhs, mxArray *plhs[], int nrhs, mxArray *prhs[]); 其中 nlhs,plhs分别表示输出参数的个数及输出参数的mxArray数组;nrhs,prhs表示输入参数的个数及输入参数数组。(这个函数有点通用的感觉……)
  mlfPlotdata(mxArray* rgbData); 就简单的多,基本和m文件中你定义的plotdata函数是一样的(我的plotdata定义为 function []=plotdata(rgbData))
  所以一般在程序中加载的是mlf开头的函数。
  这里需要提的是我编译生成的是C的动态链接库。如果是生成C++的动态链接库,生成的接口函数也带有一个mlx开头的函数,即
  bool MW_CALL_CONV mlxPlotdata(int nlhs, mxArray *plhs[], int nrhs, mxArray *prhs[])
  但是另一个函数是不带有mlf的,直接为
  void MW_CALL_CONV plotdata(const mwArray& rgbData)
  而且输入参数不是mxArray数组,而是mwArray数组,这也是C和C++与MATLAB混合编程时最主要的不同(下篇再详细说)
  但是我在尝试C++动态链接时一直没有成功。后来看到生成的cpp文件同c文件一样也有一个 extend "C"{},这是C++为了与C兼容而提供的一个关键字,C++编译器将会在extend "C"的大括号内部代码当做C语言代码处理,这让我很困惑……而如果注释掉又会报连接错误托福答案
  想来可能是MATLAB对C++编译支持并不好(他自带的lcc编译器是只能编译成C的接口)总之没有尝试成功,暂时在程序中都用C的动态链接了。

C++和MATLAB混合编程-DLL的更多相关文章

  1. WPF(C#)与MATLAB混合编程

    WPF(C#)与MATLAB混合编程 WPF可以为开发者提供便捷地构建用户交互界面的解决方法,而matlab则在科学计算方面有着无与伦比的优势,因此在一些需要将科学算法转换为应用软件的项目中,需要应用 ...

  2. VS/Qt C++和Matlab混合编程

    最近两天在搞C++和Matlab混合编程,这个中间过程真是让人心酸啊,最后还是搞定成功!现在把这个过程记录一下. 首先自己的电脑本来就安装着matlab2013b,按着网上的说法首先需要输入!mcc, ...

  3. C++和MATLAB混合编程求解多项式系数(矩阵相除)

    摘要:MATLAB对于矩阵处理是非常高效的,而C++对于矩阵操作是非常麻烦的,因而可以采用C++与MATLAB混合编程求解矩阵问题. 主要思路就是,在MATLAB中编写函数脚本并使用C++编译为dll ...

  4. matlab混合编程向导(vc,vb,.net...)

    一.matlab与vc混编  1.通过mcc将matlab的m文件转化为cpp,c文件或dll供vc调用:     这方面的实现推荐精华区Zosco和ljw总结的方法(x-6-1-4-3-1和2)  ...

  5. java matlab混合编程之返回值Struct类型

    java matlab混合编程的时候当返回值是Struct类型(matlab中的返回类型)如何来取得(java中)其值? 上网找,看到这个网页:http://www.mathworks.cn/cn/h ...

  6. VC 与Matlab混合编程之引擎操作详解

    Visual C++ 是当前主流的应用程序开发环境之一,开发环境强大,开发的程序执行速度快.但在科学计算方面函数库显得不够丰富.读取.显示数据图形不方便. Matlab 是一款将数值分析.矩阵计算.信 ...

  7. Matlab混合编程

    Matlab混合编程 混合编程目的 在Matlab中采用混合编程目的主要包括 利用已有的函数库,避免重复工作 加速计算,特别是减少循环所用时间 利用GPU等进行异构编程 混合编程方法-mex函数 目前 ...

  8. C#Matlab混合编程类 初始化问题解决方法

    ************** 异常文本 ************** System.TypeInitializationException: “myPlus.matClass”的类型初始值设定项引发异 ...

  9. C#与MATLAB混合编程

    C#和MatLab的混合编程,充分利用了winform的直观显示和matlab的强大计算能力.在此以一个小例子的形式给大家讲述一下二者混合编程的实现. 一.软件的配置说明 C#版本:VS2010 ma ...

随机推荐

  1. .net常見面試題(三)

    1, 请你说说.NET中类和结构的区别? 答:结构和类具有大体的语法,但是结构受到的限制比类要多.结构不能申明有默认的构造函数,为结构的副本是又编译器创建和销毁的,所以不需要默认的构造函数和析构函数. ...

  2. Java中重载和重写的区别

    重载 overloading 1) 方法重载是让类以统一的方式处理不同类型数据的一种手段.多个同名函数同时存在,具有不同的参数个数/类型.重载是一个类中多态性的一种表现. 2) Java的方法重载,就 ...

  3. Does anyone successfully use USB drive in Windows7 guest?

    Hi, Does anyone successfully use USB drive in Windows7 guest? If I pass a USB drive to Windows7 gues ...

  4. Area - POJ 1265(pick定理求格点数+求多边形面积)

    题目大意:以原点为起点然后每次增加一个x,y的值,求出来最后在多边形边上的点有多少个,内部的点有多少个,多边形的面积是多少. 分析: 1.以格子点为顶点的线段,覆盖的点的个数为GCD(dx,dy),其 ...

  5. java模拟DVD管理器

    import java.util.*;import java.text.*;class DVDSet{    String[] name = new String[50]; //名字    int[] ...

  6. tar打包和解压命令

    如果你有一个大文件 想下载下来 但是又太大 可以压缩一下 然后打包 #压缩 tar -czvf ***.tar.gz tar -cjvf ***.tar.bz2 #解压缩 tar -xzvf ***. ...

  7. WebBindingInitializer学习

    今天在看开源代码的时候遇到了这个接口,于是查阅了下相关的资料 Spring web mvc学习笔记 http://www.cnblogs.com/crazy-fox/archive/2012/02/1 ...

  8. Cocos2d-js 3.0 alp2 使用指南

    Download Cocos2d-JS: http://www.cocos2d-x.org/download Unzip and copy to C:/ Download JDK: http://ww ...

  9. 将动态库添加到VC程序中

    应用程序使用DLL可以采用两种方式:一种是隐式链接,另一种是显式链接.在使用DLL之前首先要知道DLL中函数的结构信息.Visual C++6.0在VC\bin目录下提供了一个名为Dumpbin.ex ...

  10. Java GC 概念摘要

    很长时间,我想Java的GC做一个小小的总结,他有没有时间.根据最近看了java paper向上java gc文章,我觉得好,读读.顺便说一下,总结下. java paper的GC文章地址,里面有非常 ...